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