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

安卓开发数据库创建

SQLite数据库基础

组件 说明
SQLiteDatabase 代表数据库对象,支持增删改查操作
SQLiteOpenHelper 辅助创建/更新数据库结构,管理版本控制
ContentValues 用于存储键值对数据,类似Map结构
Cursor 结果集游标,遍历查询结果

创建数据库步骤:

  1. 继承SQLiteOpenHelper实现数据库创建逻辑
  2. 重写onCreate()方法创建表结构
  3. 重写onUpgrade()处理数据库升级
  4. 调用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版本号更新时:

  1. 创建Migration对象
  2. addMigrations()中注册迁移脚本
  3. 处理表结构变更(添加字段/修改类型等)
Room.migrationsExecutor(AppDatabase.class, new Migration(1, 2) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        // 添加新字段
        database.execSQL("ALTER TABLE user ADD COLUMN email TEXT");
    }
}).build();

最佳实践建议

  1. 使用封装工具:优先选择Room替代原始SQLite API
  2. 数据库操作异步化:通过ExecutorService或RxJava处理耗时操作
  3. 防止SQL注入:始终使用参数化查询代替字符串拼接
  4. 资源管理:及时关闭Cursor/Database对象
  5. 数据加密:对敏感数据启用SQLCipher加密

问题与解答

Q1:为什么推荐使用Room而不是直接操作SQLite?
A:Room提供以下优势:

安卓开发数据库创建

  • 编译时验证SQL正确性
  • 自动生成重复代码(如CRUD实现)
  • 内置LiveData支持观察数据变化
  • 更好的类型安全保障
  • 简化多线程数据处理

Q2:如何处理数据库版本升级导致的表结构变更?
A:解决方案:

  1. 增加VERSION版本号
  2. 实现Migration接口定义变更逻辑
  3. 调用databaseBuilder().addMigrations()注册迁移脚本
  4. 测试覆盖新旧版本数据兼容性
  5. 重要升级时可结合fallbackToDestructiveMigration()重置