安卓开发之本地存储数据库
- 行业动态
- 2025-04-22
- 5
安卓本地存储数据库详解
SQLite数据库
SQLite是安卓内置的轻量级关系型数据库,适用于结构化数据存储。
创建数据库与表
// 创建数据库(自动生成) // 创建用户表 CREATE TABLE users ( id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, age INTEGER, email TEXT UNIQUE );
基本操作步骤
| 步骤 | 说明 |
|————–|——————————|
| 1. 获取SQLiteOpenHelper实例 | 通过继承该类管理数据库版本 |
| 2. 调用getWritableDatabase() | 创建/打开可写数据库 |
| 3. 执行SQL语句 | 增删改查操作 |
| 4. 关闭数据库连接 | 释放资源 |
SQLite工具类示例
public class DBHelper extends SQLiteOpenHelper { private static final String NAME = "app.db"; private static final int VERSION = 1; public DBHelper(Context context) { super(context, NAME, null, VERSION); } @Override public void onCreate(SQLiteDatabase db) { // 创建表结构 db.execSQL("CREATE TABLE ..."); } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 数据库迁移逻辑 } }
SQLite优缺点
| 优点 | 缺点 |
|——————–|————————–|
| 轻量级无依赖 | API繁琐易出错 |
| 支持事务和索引 | 需手动管理版本迁移 |
| 直接执行原生SQL | 类型安全不足 |
Room持久化库
Room是谷歌推出的SQLite对象映射层,提供编译时验证和流畅API。
核心组件
| 组件 | 作用 |
|—————|——————————|
| Entity | 对应数据库表结构 |
| DAO | 定义数据访问方法 |
| Database | 持有数据库实例 |
使用步骤
- 定义@Entity注解的实体类
- 创建@Dao注解的数据访问接口
- 编写@Database注解的抽象类
- 调用build()方法获取实例
Room示例代码
// 实体类 @Entity(tableName = "users") public class User { @PrimaryKey(autoGenerate = true) public int id; @ColumnInfo(name = "name") public String name; public int age; } // DAO接口 @Dao public interface UserDao { @Insert void insertUser(User... users); @Query("SELECT FROM users WHERE id = :userId") User getUserById(int userId); } // 数据库类 @Database(entities = {User.class}, version = 1) public abstract class AppDatabase extends RoomDatabase { public abstract UserDao userDao(); }
Room优势对比
| 特性 | SQLite | Room |
|———————|—————–|——————–|
| 编译时语法检查 | 无 | 支持 |
| 类型安全 | 无 | 支持 |
| 观察数据变化 | 需手动实现 | LiveData支持 |
| 复杂查询构建 | 手写SQL | Flow/RxJava支持 |
数据库迁移策略
当数据库版本升级时,需要处理数据迁移:
// 版本号从1升级到2 @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { if (oldVersion == 1) { // 添加新字段 db.execSQL("ALTER TABLE users ADD COLUMN phone TEXT"); } // 其他版本迁移逻辑... }
数据库加密方案
- SQLCipher集成:替换默认SQLite实现,增加加密功能
- Room加密配置:
// 在Build.gradle添加依赖 implementation "androidx.room:room-sqlcipher:2.5.1" annotationProcessor "androidx.room:room-compiler:2.5.1"
相关问题与解答
Q1:如何实现Room数据库的迁移?
A1:通过重写onUpgrade()
方法处理版本升级,使用Migration
类进行多步迁移,示例:
Room.databaseBuilder(context, AppDatabase.class, "app.db") .addMigrations(new Migration(1, 2) { @Override public void migrate(SupportSQLiteDatabase database) { database.execSQL("ALTER TABLE users ADD COLUMN phone TEXT"); } }) .build();
Q2:如何给SQLite数据库设置密码保护?
A2:需集成SQLCipher库,修改数据库帮助类:
// 1. 替换SQLiteOpenHelper为SQLiteOpenHelper的加密版本 // 2. 初始化时设置密钥 public class EncryptedDBHelper extends SQLiteOpenHelper { private static final String PASSWORD = "your_secret_key"; public EncryptedDBHelper(Context context) { super(context, "encrypted.db", null, 1, new byte[0]); SQLiteDatabase.loadLibs(context); // 必须调用 } @Override public void onCreate(SQLiteDatabase db) { // 使用加密数据库操作 } }