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

安卓开发之本地存储数据库

安卓本地存储数据库详解

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工具类示例

安卓开发之本地存储数据库  第1张

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 | 持有数据库实例 |

使用步骤

  1. 定义@Entity注解的实体类
  2. 创建@Dao注解的数据访问接口
  3. 编写@Database注解的抽象类
  4. 调用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");
    }
    // 其他版本迁移逻辑...
}

数据库加密方案

  1. SQLCipher集成:替换默认SQLite实现,增加加密功能
  2. 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) {
        // 使用加密数据库操作
    }
}
0