数据库存储

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

  • 10.2.3 及以上基线:com.alibaba.j256.ormlite.dao.Dao

  • 10.1.68 及以下基线: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,可以创建数据库并对数据库加密。

  • 10.2.3 及以上基线:

    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(MPSQLiteDatabase 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(MPSQLiteDatabase 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();
            }
        }
    }
  • 10.1.68 及以下基线:

    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();
        }
    }