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