1. Android SQLite3 核心功能解析
SQLite3作为Android平台内置的轻量级数据库引擎,其核心优势在于零配置、无服务器、单文件存储的特性。在实际开发中,我们主要操作以下几个核心功能模块:
1.1 数据库创建与版本管理
创建SQLite数据库需要继承SQLiteOpenHelper类并重写两个关键方法:
java复制public class DBHelper extends SQLiteOpenHelper {
private static final String DB_NAME = "myapp.db";
private static final int DB_VERSION = 1;
public DBHelper(Context context) {
super(context, DB_NAME, null, DB_VERSION);
}
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("CREATE TABLE users (_id INTEGER PRIMARY KEY, name TEXT, age INTEGER)");
}
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
// 数据库升级逻辑
}
}
关键点:DB_VERSION是控制数据库升级的核心参数,每次修改表结构都需要递增版本号
1.2 四种基础操作实现
1.2.1 插入数据
java复制ContentValues values = new ContentValues();
values.put("name", "张三");
values.put("age", 25);
long id = db.insert("users", null, values);
1.2.2 查询数据
java复制Cursor cursor = db.query("users",
new String[]{"_id", "name", "age"},
"age > ?",
new String[]{"20"},
null, null, "name DESC");
while(cursor.moveToNext()) {
int id = cursor.getInt(0);
String name = cursor.getString(1);
int age = cursor.getInt(2);
}
cursor.close();
1.2.3 更新数据
java复制ContentValues values = new ContentValues();
values.put("age", 26);
int count = db.update("users", values, "_id = ?", new String[]{"1"});
1.2.4 删除数据
java复制int count = db.delete("users", "_id = ?", new String[]{"1"});
2. 高级应用与性能优化
2.1 事务处理机制
批量操作必须使用事务提升性能:
java复制db.beginTransaction();
try {
// 批量操作
for(int i=0; i<1000; i++) {
ContentValues values = new ContentValues();
values.put("name", "user"+i);
db.insert("users", null, values);
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
2.2 索引优化策略
为常用查询字段创建索引:
java复制db.execSQL("CREATE INDEX idx_users_age ON users(age)");
2.3 数据库升级方案
多版本渐进式升级示例:
java复制@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
for(int version = oldVersion; version < newVersion; version++) {
switch(version) {
case 1:
upgradeFromV1ToV2(db);
break;
case 2:
upgradeFromV2ToV3(db);
break;
}
}
}
3. 实战问题排查指南
3.1 常见异常处理
| 异常类型 | 原因分析 | 解决方案 |
|---|---|---|
| SQLiteDatabaseLockedException | 多线程同时写操作 | 使用单例模式管理数据库连接 |
| SQLiteConstraintException | 违反唯一约束 | 检查PRIMARY KEY或UNIQUE约束 |
| CursorWindowAllocationException | 查询结果集过大 | 添加LIMIT分页查询 |
3.2 性能监控技巧
通过adb命令监控数据库性能:
bash复制adb shell dumpsys dbinfo your.package.name
4. 现代替代方案对比
虽然SQLite3仍是Android默认方案,但Room等现代ORM框架提供了更安全的API:
| 特性 | SQLite3 | Room |
|---|---|---|
| 编译时校验 | 无 | 有 |
| LiveData集成 | 需手动实现 | 原生支持 |
| 线程安全 | 需自行管理 | 自动处理 |
| 样板代码量 | 多 | 少 |
迁移建议:新项目推荐直接使用Room,旧项目可逐步替换核心模块
在实际项目中,我通常会根据以下原则选择技术方案:
- 简单配置存储:SharedPreferences
- 结构化数据存储:Room
- 复杂关系型数据:SQLite3直接操作
- 大数据量存储:考虑ContentProvider+SQLite组合
