上一篇
安卓开发中数据库的连接数据库
- 行业动态
- 2025-04-23
- 6
安卓数据库连接常用SQLite/Room本地存储,或Retrofit/Firebase远程
安卓本地数据库(SQLite)连接与操作
SQLite数据库特点
特性 | 描述 |
---|---|
轻量级嵌入式数据库 | 无需独立服务器,直接集成在APP中 |
单文件存储 | 数据库以.db 文件形式存储在设备内部存储或SD卡(需权限) |
ACID特性 | 支持原子性、一致性、隔离性、持久化事务 |
基础操作步骤
// 1. 创建数据库帮助类(继承SQLiteOpenHelper) public class MyDatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "app_data.db"; private static final int VERSION = 1; public MyDatabaseHelper(Context context) { super(context, DATABASE_NAME, null, VERSION); } @Override public void onCreate(SQLiteDatabase db) { // 创建表结构 db.execSQL("CREATE TABLE user(id INTEGER PRIMARY KEY,name TEXT)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 数据库升级处理 db.execSQL("DROP TABLE IF EXISTS user"); onCreate(db); } } // 2. 使用数据库帮助类获取实例 MyDatabaseHelper dbHelper = new MyDatabaseHelper(context); SQLiteDatabase db = dbHelper.getWritableDatabase(); // 读写数据库 // 或 dbHelper.getReadableDatabase(); // 只读数据库 // 3. 执行增删改查操作 ContentValues values = new ContentValues(); values.put("name", "John"); db.insert("user", null, values); // 插入数据
高级操作建议
- 使用Room持久化库:提供编译时校验,避免运行时错误
- 异步处理:通过
AsyncTask
或Coroutine
避免阻塞主线程 - 数据观察:结合
LiveData
实现数据库变更自动通知UI更新
远程数据库连接方案
通过Web API间接访问
技术栈 | 作用 |
---|---|
Retrofit + OkHttp | 网络请求封装与HTTP通信 |
Gson/Moshi | JSON数据解析 |
Dagger/Hilt | 依赖注入管理网络模块生命周期 |
// Retrofit接口定义 public interface ApiService { @GET("users") Call<List<User>> getUsers(); } // 使用示例 Retrofit retrofit = new Retrofit.Builder() .baseUrl("https://api.example.com/") .addConverterFactory(GsonConverterFactory.create()) .build(); ApiService apiService = retrofit.create(ApiService.class);
直接JDBC连接(不推荐)
// 需添加MySQL驱动依赖 Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection( "jdbc:mysql://192.168.1.100:3306/test_db", "username", "password");
缺点:
- 移动端直连数据库存在安全风险
- 需处理复杂网络环境(NAT穿透、防火墙)
- 违反三层架构设计原则
ORM框架选择对比
框架 | 特性 |
---|---|
GreenDao | 轻量级,支持注解式开发,需手动管理关系映射 |
Realm | 高性能跨平台数据库,支持复杂查询,内存占用较高 |
Room | Android官方推荐,基于SQLite,强制类型安全,需配合ViewModel使用 |
常见问题与解决方案
数据库文件损坏处理
- 症状:
SQLiteDatabaseCorruptException
异常 - 解决方案:
- 检查
onUpgrade()
中的迁移逻辑 - 使用
db.isOpen()
检测连接状态 - 定期备份数据库文件(
SQLiteDatabase.backup()
)
- 检查
多线程并发控制
- 问题:多个线程同时写入导致数据不一致
- 解决方案:
- 使用
synchronized
代码块 - 开启事务(
db.beginTransaction()
) - 采用
Singleton
模式管理数据库连接实例
- 使用
相关问题与解答
Q1:为什么Room框架要求API 21+?
A:Room的@Query
注解依赖androidx.sqlite.db.SupportSQLiteQuery
,该类在API 21以下存在兼容性问题,可通过room-runtime
分离包解决:
implementation "androidx.room:room-runtime:2.5.1" // 不包含注解处理器 annotationProcessor "androidx.room:room-compiler:2.5.1"
Q2:如何实现SQLite数据库的加密?
A:可使用SQLCipher
扩展库,步骤如下:
- 替换原始
SQLiteOpenHelper
为net.sqlcipher.database.SQLiteOpenHelper
- 调用
SQLiteDatabase.loadLibs(context)
加载加密库 - 设置密钥:
db.execSQL("PRAGMA key='your-password'");
- 所有CRUD操作前需先设置密钥