上一篇
安卓开发数据库创建
- 行业动态
- 2025-04-22
- 10
SQLite数据库基础
组件 | 说明 |
---|---|
SQLiteDatabase | 代表数据库对象,支持增删改查操作 |
SQLiteOpenHelper | 辅助创建/更新数据库结构,管理版本控制 |
ContentValues | 用于存储键值对数据,类似Map结构 |
Cursor | 结果集游标,遍历查询结果 |
创建数据库步骤:
- 继承
SQLiteOpenHelper
实现数据库创建逻辑 - 重写
onCreate()
方法创建表结构 - 重写
onUpgrade()
处理数据库升级 - 调用
getWritableDatabase()
获取可写数据库实例
public class MyDBHelper extends SQLiteOpenHelper { private static final String DATABASE_NAME = "app.db"; private static final int VERSION = 1; public MyDBHelper(Context context) { super(context, DATABASE_NAME, null, VERSION); } @Override public void onCreate(SQLiteDatabase db) { // 创建用户表 String sql = "CREATE TABLE user(id INTEGER PRIMARY KEY,name TEXT,age INTEGER)"; db.execSQL(sql); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 数据库升级处理(如表结构变更) } }
Room持久化库使用
核心组件:
@Entity
:标注数据库表结构@Dao
:定义数据访问接口@Database
:配置数据库信息
示例代码:
// 1. 定义实体类 @Entity(tableName = "user") public class User { @PrimaryKey(autoGenerate = true) public int id; @ColumnInfo(name = "name") public String name; public int age; } // 2. 定义DAO接口 @Dao public interface UserDao { @Insert void insertUser(User... users); @Query("SELECT FROM user WHERE id = :userId") User getUserById(int userId); } // 3. 配置数据库 @Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
数据库操作对比表
特性 | SQLite原始API | Room持久库 |
---|---|---|
编译时检查 | 无 | 支持(通过注解处理器) |
线程安全 | 需手动处理 | 自动支持(LiveData/RxJava) |
代码生成 | 无 | 自动生成DAO实现 |
迁移支持 | 需手动实现 | 提供Migration API |
空数据处理 | 需判断Cursor是否为空 | 返回Optional类型 |
数据库迁移策略
当VERSION
版本号更新时:
- 创建
Migration
对象 - 在
addMigrations()
中注册迁移脚本 - 处理表结构变更(添加字段/修改类型等)
Room.migrationsExecutor(AppDatabase.class, new Migration(1, 2) { @Override public void migrate(SupportSQLiteDatabase database) { // 添加新字段 database.execSQL("ALTER TABLE user ADD COLUMN email TEXT"); } }).build();
最佳实践建议
- 使用封装工具:优先选择Room替代原始SQLite API
- 数据库操作异步化:通过ExecutorService或RxJava处理耗时操作
- 防止SQL注入:始终使用参数化查询代替字符串拼接
- 资源管理:及时关闭Cursor/Database对象
- 数据加密:对敏感数据启用SQLCipher加密
问题与解答
Q1:为什么推荐使用Room而不是直接操作SQLite?
A:Room提供以下优势:
- 编译时验证SQL正确性
- 自动生成重复代码(如CRUD实现)
- 内置LiveData支持观察数据变化
- 更好的类型安全保障
- 简化多线程数据处理
Q2:如何处理数据库版本升级导致的表结构变更?
A:解决方案:
- 增加
VERSION
版本号 - 实现
Migration
接口定义变更逻辑 - 调用
databaseBuilder().addMigrations()
注册迁移脚本 - 测试覆盖新旧版本数据兼容性
- 重要升级时可结合
fallbackToDestructiveMigration()
重置