数据库存储

mPaaS 提供的数据库存储基于 OrmLite 架构,提供了数据库底层加密能力。数据库的增、删、改、查可以使用 com.j256.ormlite.dao.Dao 的接口来调用。

说明

在使用数据库时,请不要对原有数据库直接进行加密,否则会引发 native 层解密崩溃。建议您先创建新的加密数据库,再将原有数据库内容拷贝至新建的加密数据库中。

使用示例

生成数据表

// 数据库表名,默认为类名
@DatabaseTable
public class User {
    // 主键
    @DatabaseField(generatedId = true)
    public int id;
    // name 字段唯一
    @DatabaseField(unique = true)
    public String name;
    @DatabaseField
    public int color;
    @DatabaseField
    public long timestamp;
}

创建 OrmLiteSqliteOpenHelper

自定义一个 DemoOrmLiteSqliteOpenHelper 继承自 OrmLiteSqliteOpenHelper。通过OrmLiteSqliteOpenHelper,可以创建数据库并对数据库加密。

public class DemoOrmLiteSqliteOpenHelper extends OrmLiteSqliteOpenHelper {

    /**
     * 数据库名称
     */
    private static final String DB_NAME = "com_mpaas_demo_storage.db";

    /**
     * 当前数据库版本
     */
    private static final int DB_VERSION = 1;

    /**
     * 数据库加密密钥,mPaaS 支持数据库加密,使数据在设备上更安全,若为 null 则不加密。
     * 注意:密码只能设置一次,不提供修改密码的 API;不支持对未加密的库设置密码进行加密(会导致闪退)。
     */
    private static final String DB_PASSWORD = "mpaas";

    public DemoOrmLiteSqliteOpenHelper(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
        setPassword(DB_PASSWORD);
    }

    /**
     * 数据库创建时的回调函数
     *
     * @param sqLiteDatabase   数据库
     * @param connectionSource 连接
     */
    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase, ConnectionSource connectionSource) {
        try {
            // 创建 User 表
            TableUtils.createTableIfNotExists(connectionSource, User.class);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

    /**
     * 数据库更新时的回调函数
     *
     * @param database         数据库
     * @param connectionSource 连接
     * @param oldVersion       旧数据库版本
     * @param newVersion       新数据库版本
     */
    @Override
    public void onUpgrade(SQLiteDatabase database, ConnectionSource connectionSource, int oldVersion, int newVersion) {
        try {
            // 删除旧版 User 表,忽略错误
            TableUtils.dropTable(connectionSource, User.class, true);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        try {
            // 从新创建 User 表
            TableUtils.createTableIfNotExists(connectionSource, User.class);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

查询数据

这里是查询 User 表的全部数据并按照 timestamp 字段进行升序排列。

    /**
     * 初始化 DB 数据
     */
    private void initData() {
        mData.clear();
        try {
            mData.addAll(mDbHelper.getDao(User.class).queryBuilder().orderBy("timestamp", true).query());
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

插入数据

    /**
     * 插入用户信息
     *
     * @param user 用户信息
     */
    private void insertUser(User user) {
        if (null == user) {
            return;
        }
        try {
            // mDbHelper = new DemoOrmLiteSqliteOpenHelper(this); 更多信息,请参见上文创建 OrmLiteSqliteOpenHelper
            mDbHelper.getDao(User.class).create(user);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }

删除数据

    /**
     * 删除用户信息
     *
     * @param user 用户信息
     */
    private void deleteUser(User user) {
        try {
            // mDbHelper = new DemoOrmLiteSqliteOpenHelper(this); 更多信息,请参见上文创建 OrmLiteSqliteOpenHelper
            mDbHelper.getDao(User.class).delete(user);
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
阿里云首页 移动开发平台 mPaaS 相关技术圈