安卓开发中sqlite数据库
- 行业动态
- 2025-04-23
- 9
Android中SQLite用于本地数据存储,通过SQLiteOpenHelper管理数据库,支持增删改查及事务操作
SQLite数据库基础
Android内置轻量级数据库,适用于本地数据存储,支持SQL语法,无需额外依赖。
核心特点:
- 零配置(无需安装数据库引擎)
- 单文件存储(.db扩展名)
- 最大140TB存储容量
- ACID特性保证事务可靠性
数据库操作四部曲
创建数据库类
public class MyDatabaseHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "app.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 users(id INTEGER PRIMARY KEY,name TEXT)"); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 数据迁移逻辑 db.execSQL("DROP TABLE IF EXISTS users"); onCreate(db); } }
数据库操作方法对比
操作类型 | 推荐方式 | 适用场景 |
---|---|---|
插入数据 | insert() /execSQL() |
单条记录 |
更新数据 | update() |
条件修改 |
删除数据 | delete() |
条件删除 |
查询数据 | query() |
复杂查询 |
CRUD操作示例
插入数据:
// 方式1:使用ContentValues ContentValues values = new ContentValues(); values.put("name", "张三"); db.insert("users", null, values); // 方式2:纯SQL语句 db.execSQL("INSERT INTO users(name) VALUES(?)", new Object[]{"李四"});
查询数据:
Cursor cursor = db.query( "users", // 表名 new String[]{"id","name"}, // 列名 "id=?", // where条件 new String[]{"1"}, // where参数 null, // groupBy null, // having "id DESC" // orderBy );
更新/删除:
// 更新操作 db.update("users", cv, // ContentValues参数 "id=?", // where条件 new String[]{"2"}); // where参数 // 删除操作 db.delete("users", "id=?", new String[]{"3"});
数据库升级策略
版本号 | 升级操作 | 注意事项 |
---|---|---|
1→2 | 添加新表 | 保持旧表结构 |
2→3 | 修改字段类型 | 数据兼容处理 |
3→4 | 删除冗余表 | 数据备份转移 |
升级示例:
@Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (oldVersion < 2) { db.execSQL("ALTER TABLE users ADD COLUMN age INTEGER"); // 添加新列 } if (oldVersion < 3) { db.execSQL("CREATE TABLE logs(id INTEGER PRIMARY KEY,message TEXT)"); // 新增表 } }
异步操作实践
主线程禁止数据库操作,需使用:
AsyncTask
(已过时,但仍可用)Thread+Handler
ExecutorService
LiveData
(Jetpack组件)
示例:
new Thread(() -> { SQLiteDatabase db = helper.getWritableDatabase(); db.insert("users", null, values); handler.sendEmptyMessage(MSG_DB_SUCCESS); // 通知UI线程 }).start();
性能优化技巧
- 使用事务:批量操作包裹在
beginTransaction()
和setTransactionSuccessful()
之间 - 预编译语句:
SQLiteStatement
比execSQL()
快30% - 索引优化:对频繁查询字段建立索引(最多16个索引/表)
- 分页查询:
LIMIT
+OFFSET
实现大数据分页
注意事项清单
- [ ] 每次操作后调用
close()
释放资源 - [ ] Cursor使用后必须关闭(try-with-resources)
- [ ] 敏感数据需加密存储(如AES+SQLCipher)
- [ ] 避免在实体类中直接操作数据库(违反单一职责原则)
- [ ] 定期使用
VACUUM
命令压缩数据库文件
相关问题与解答
Q1:如何将查询结果映射为自定义对象?
A:使用SimpleCursorTreeAdapter
或手动遍历Cursor:
List<User> users = new ArrayList<>(); while(cursor.moveToNext()) { User user = new User(); user.setId(cursor.getInt(0)); user.setName(cursor.getString(1)); users.add(user); }
Q2:数据库文件存储在哪个路径?
A:默认路径为:
/data/data/<包名>/databases/<数据库名>.db
可通过Context.getDatabasePath()
获取File对象,调试时可用adb shell