DataAbility進行數據庫操作的簡單使用
DataAbility介紹:
使用Data模板的Ability(以下簡稱“Data”)有助于應用管理其自身和其他應用存儲數據的訪問,并提供與其他應用共享數據的方法。Data既可用于同設備不同應用的數據共享,也支持跨設備不同應用的數據共享。
數據的存放形式多樣,可以是數據庫,也可以是磁盤上的文件。Data對外提供對數據的增、刪、改、查,以及打開文件等接口,這些接口的具體實現由開發者提供。
效果展示:
介紹DataAbility的使用方法,對數據庫進行數據的訪問操作。
- 每次插入的數據為:id=自增長主鍵;name=jack;age=23;salary=3456.0。
- 修改數據:修改id為2的數據,并把數據改為:name=rose;age=45;salary=1234.9。
- 刪除數據:刪除id為1的那一條數據。
- 查詢數據:查詢表中所有的數據,并且分行顯示。
新建一個DataAbility
初始化數據庫操作
我們這里以關系型數據庫為例,在DataAbility的onStart方法里邊初始化數據庫、表和字段的相關操作:
對于關系型數據庫和對象型數據庫的基本操作,可以看這一篇文章:
https://ost.51cto.com/posts/10599。
// 數據庫操作類RdbStore
private RdbStore rdbStore;
// 表名稱
private final String TABLENAME = "student";
@Override
public void onStart(Intent intent) {
super.onStart(intent);
HiLog.info(LABEL_LOG, "DataAbility onStart");
initDatabase(this);
}
// 初始化數據庫
private void initDatabase(Context context){
StoreConfig config = StoreConfig.newDefaultConfig("Student.db");
RdbOpenCallback callback = new RdbOpenCallback() {
@Override
public void onCreate(RdbStore rdbStore) {
rdbStore.executeSql("create table if not exists " + TABLENAME + "(id integer primary key autoincrement, name text not null, age integer not null, salary real)");
}
@Override
public void onUpgrade(RdbStore rdbStore, int i, int i1) {
}
};
DatabaseHelper helper = new DatabaseHelper(context);
rdbStore = helper.getRdbStore(config, 1, callback);
}
實現DataAbility類內部的增刪改查操作
在DataAbility提供對應的增刪改查方法里,實現數據庫的的增刪改查操作;這里我們使用的是關系型數據庫。
RdbStore進行查詢、修改、刪除等操作時,參數RdbPredicates需要由DataAbilityUtils類和DataAbilityPredicates對象轉換得來。
// 查詢數據
@Override
public ResultSet query(Uri uri, String[] columns, DataAbilityPredicates predicates) {
RdbPredicates rdbPredicates = DataAbilityUtils.createRdbPredicates(predicates, TABLENAME);
ResultSet resultSet = rdbStore.query(rdbPredicates, columns);
return resultSet;
}
// 插入數據
@Override
public int insert(Uri uri, ValuesBucket value) {
long res = rdbStore.insert(TABLENAME, value);
return (int)res;
}
// 刪除數據
@Override
public int delete(Uri uri, DataAbilityPredicates predicates) {
RdbPredicates rdbPredicates = DataAbilityUtils.createRdbPredicates(predicates, TABLENAME);
int res = rdbStore.delete(rdbPredicates);
return res;
}
// 修改數據
@Override
public int update(Uri uri, ValuesBucket value, DataAbilityPredicates predicates) {
RdbPredicates rdbPredicates = DataAbilityUtils.createRdbPredicates(predicates, TABLENAME);
int res = rdbStore.update(value, rdbPredicates);
return res;
}
URI介紹
Data的提供方和使用方都通過URI(Uniform Resource Identifier)來標識一個具體的數據,例如數據庫中的某個表或磁盤上的某個文件。HarmonyOS的URI仍基于URI通用標準,格式如下:
- scheme:協議方案名,固定為“dataability”,代表Data Ability所使用的協議類型。
- authority:設備ID。如果為跨設備場景,則為目標設備的ID;如果為本地設備場景,則不需要填寫。
- path:資源的路徑信息,代表特定資源的位置信息。
- query:查詢參數。
- fragment:可以用于指示要訪問的子資源。
URI示例:
- 跨設備場景:dataability://device_id/com.domainname.dataability.persondata/person/10。
- 本地設備:dataability:///com.domainname.dataability.persondata/person/10。
說明
本地設備的“device_id”字段為空,因此在“dataability:”后面有三個“/”。
使用DataAbilityHelper對象調用DataAbility的增刪改查操作:
在slice里邊聲明全局變量DataAbilityHelper和Uri的對象,以便頁面進行增刪改查的操作。
1、獲取Uri的值:
2、在slice的onStart方法初始化一個DataAbilityHelper和Uri對象。
注意:由于是對本機操作,本地設備的“device_id”字段為空,因此在“dataability:”后面有三個“/”。
// 訪問DataAbility的唯一路徑
private Uri uri;
// DataAbility數據操作類
private DataAbilityHelper helper;
@Override
public void onStart(Intent intent) {
super.onStart(intent);
super.setUIContent(ResourceTable.Layout_ability_main);
helper = DataAbilityHelper.creator(this);
uri = Uri.parse("dataability:///com.example.myapplication.DataAbility");
}
新增數據:
// 增加
private boolean addData(){
ValuesBucket bucket = new ValuesBucket();
bucket.putString("name", "jack");
bucket.putInteger("age", 23);
bucket.putDouble("salary", 3456.0);
try {
int rowNum = helper.insert(uri, bucket);
return rowNum > 0 ? true : false;
} catch (Exception e) {
}
return false;
}
刪除數據:
// 刪除
private boolean deleteData(){
try {
DataAbilityPredicates predicates = new DataAbilityPredicates();
predicates.equalTo("id", 1);
int rowNum = helper.delete(uri,predicates);
return rowNum > 0 ? true : false;
} catch (Exception e) {
}
return false;
}
修改數據:
// 修改
private boolean changeData(){
ValuesBucket bucket = new ValuesBucket();
bucket.putString("name", "rose");
bucket.putInteger("age", 45);
bucket.putDouble("salary", 1234.9);
try {
DataAbilityPredicates predicates = new DataAbilityPredicates();
predicates.equalTo("id", 2);
int rowNum = helper.update(uri, bucket, predicates);
return rowNum > 0 ? true : false;
} catch (Exception e) {
}
return false;
}
查詢數據:
// 查詢
private ResultSet queryData(){
String[] strings = {
"id","name","age","salary"
};
DataAbilityPredicates predicates = new DataAbilityPredicates();
predicates.greaterThan("id", 0);
try {
ResultSet resultSet = helper.query(uri, strings, predicates);
return resultSet;
} catch (Exception e) {
}
return null;
}
總結
- DataAbility只是華為提供的同設備或不同設備之間的應用進行數據訪問的接口,具體的數據持久化保存還是要依賴于數據庫或者其他文件類型。
- RdbPredicates需要由DataAbilityUtils類和DataAbilityPredicates對象轉換得來。
- Data的提供方和使用方都通過URI(Uniform Resource Identifier)來標識一個具體的數據,例如數據庫中的某個表或磁盤上的某個文件。
- 當訪問本機應用的數據庫時,本地設備的“device_id”字段為空,因此在“dataability:”后面有三個“/”。
- 在slice頁面調用DataAbilityHelper對象的接口進行數據操作。