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();
}
}
文檔內容是否對您有幫助?