当前位置:首页 > 行业动态 > 正文

安卓开发中sqlite数据库

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[]{"李四"});

查询数据

安卓开发中sqlite数据库

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)"); // 新增表
    }
}

异步操作实践

主线程禁止数据库操作,需使用:

  1. AsyncTask(已过时,但仍可用)
  2. Thread+Handler
  3. ExecutorService
  4. LiveData(Jetpack组件)

示例

安卓开发中sqlite数据库

new Thread(() -> {
    SQLiteDatabase db = helper.getWritableDatabase();
    db.insert("users", null, values);
    handler.sendEmptyMessage(MSG_DB_SUCCESS); // 通知UI线程
}).start();

性能优化技巧

  1. 使用事务:批量操作包裹在beginTransaction()setTransactionSuccessful()之间
  2. 预编译语句SQLiteStatementexecSQL()快30%
  3. 索引优化:对频繁查询字段建立索引(最多16个索引/表)
  4. 分页查询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