DataAbility進(jìn)行數(shù)據(jù)庫(kù)操作的簡(jiǎn)單使用
??想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):??
??51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)??
DataAbility介紹:
使用Data模板的Ability(以下簡(jiǎn)稱“Data”)有助于應(yīng)用管理其自身和其他應(yīng)用存儲(chǔ)數(shù)據(jù)的訪問(wèn),并提供與其他應(yīng)用共享數(shù)據(jù)的方法。Data既可用于同設(shè)備不同應(yīng)用的數(shù)據(jù)共享,也支持跨設(shè)備不同應(yīng)用的數(shù)據(jù)共享。
數(shù)據(jù)的存放形式多樣,可以是數(shù)據(jù)庫(kù),也可以是磁盤上的文件。Data對(duì)外提供對(duì)數(shù)據(jù)的增、刪、改、查,以及打開文件等接口,這些接口的具體實(shí)現(xiàn)由開發(fā)者提供。
效果展示:
介紹DataAbility的使用方法,對(duì)數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)的訪問(wèn)操作。
- 每次插入的數(shù)據(jù)為:id=自增長(zhǎng)主鍵;name=jack;age=23;salary=3456.0。
- 修改數(shù)據(jù):修改id為2的數(shù)據(jù),并把數(shù)據(jù)改為:name=rose;age=45;salary=1234.9。
- 刪除數(shù)據(jù):刪除id為1的那一條數(shù)據(jù)。
- 查詢數(shù)據(jù):查詢表中所有的數(shù)據(jù),并且分行顯示。
新建一個(gè)DataAbility
初始化數(shù)據(jù)庫(kù)操作
我們這里以關(guān)系型數(shù)據(jù)庫(kù)為例,在DataAbility的onStart方法里邊初始化數(shù)據(jù)庫(kù)、表和字段的相關(guān)操作:
對(duì)于關(guān)系型數(shù)據(jù)庫(kù)和對(duì)象型數(shù)據(jù)庫(kù)的基本操作,可以看這一篇文章:
https://ost.51cto.com/posts/10599。
// 數(shù)據(jù)庫(kù)操作類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);
}
// 初始化數(shù)據(jù)庫(kù)
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);
}
實(shí)現(xiàn)DataAbility類內(nèi)部的增刪改查操作
在DataAbility提供對(duì)應(yīng)的增刪改查方法里,實(shí)現(xiàn)數(shù)據(jù)庫(kù)的的增刪改查操作;這里我們使用的是關(guān)系型數(shù)據(jù)庫(kù)。
RdbStore進(jìn)行查詢、修改、刪除等操作時(shí),參數(shù)RdbPredicates需要由DataAbilityUtils類和DataAbilityPredicates對(duì)象轉(zhuǎn)換得來(lái)。
// 查詢數(shù)據(jù)
@Override
public ResultSet query(Uri uri, String[] columns, DataAbilityPredicates predicates) {
RdbPredicates rdbPredicates = DataAbilityUtils.createRdbPredicates(predicates, TABLENAME);
ResultSet resultSet = rdbStore.query(rdbPredicates, columns);
return resultSet;
}
// 插入數(shù)據(jù)
@Override
public int insert(Uri uri, ValuesBucket value) {
long res = rdbStore.insert(TABLENAME, value);
return (int)res;
}
// 刪除數(shù)據(jù)
@Override
public int delete(Uri uri, DataAbilityPredicates predicates) {
RdbPredicates rdbPredicates = DataAbilityUtils.createRdbPredicates(predicates, TABLENAME);
int res = rdbStore.delete(rdbPredicates);
return res;
}
// 修改數(shù)據(jù)
@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的提供方和使用方都通過(guò)URI(Uniform Resource Identifier)來(lái)標(biāo)識(shí)一個(gè)具體的數(shù)據(jù),例如數(shù)據(jù)庫(kù)中的某個(gè)表或磁盤上的某個(gè)文件。HarmonyOS的URI仍基于URI通用標(biāo)準(zhǔn),格式如下:
- scheme:協(xié)議方案名,固定為“dataability”,代表Data Ability所使用的協(xié)議類型。
- authority:設(shè)備ID。如果為跨設(shè)備場(chǎng)景,則為目標(biāo)設(shè)備的ID;如果為本地設(shè)備場(chǎng)景,則不需要填寫。
- path:資源的路徑信息,代表特定資源的位置信息。
- query:查詢參數(shù)。
- fragment:可以用于指示要訪問(wèn)的子資源。
URI示例:
- 跨設(shè)備場(chǎng)景:dataability://device_id/com.domainname.dataability.persondata/person/10。
- 本地設(shè)備:dataability:///com.domainname.dataability.persondata/person/10。
說(shuō)明
本地設(shè)備的“device_id”字段為空,因此在“dataability:”后面有三個(gè)“/”。
使用DataAbilityHelper對(duì)象調(diào)用DataAbility的增刪改查操作:
在slice里邊聲明全局變量DataAbilityHelper和Uri的對(duì)象,以便頁(yè)面進(jìn)行增刪改查的操作。
1、獲取Uri的值:
2、在slice的onStart方法初始化一個(gè)DataAbilityHelper和Uri對(duì)象。
注意:由于是對(duì)本機(jī)操作,本地設(shè)備的“device_id”字段為空,因此在“dataability:”后面有三個(gè)“/”。
// 訪問(wèn)DataAbility的唯一路徑
private Uri uri;
// DataAbility數(shù)據(jù)操作類
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");
}
新增數(shù)據(jù):
// 增加
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;
}
刪除數(shù)據(jù):
// 刪除
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;
}
修改數(shù)據(jù):
// 修改
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;
}
查詢數(shù)據(jù):
// 查詢
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;
}
總結(jié)
- DataAbility只是華為提供的同設(shè)備或不同設(shè)備之間的應(yīng)用進(jìn)行數(shù)據(jù)訪問(wèn)的接口,具體的數(shù)據(jù)持久化保存還是要依賴于數(shù)據(jù)庫(kù)或者其他文件類型。
- RdbPredicates需要由DataAbilityUtils類和DataAbilityPredicates對(duì)象轉(zhuǎn)換得來(lái)。
- Data的提供方和使用方都通過(guò)URI(Uniform Resource Identifier)來(lái)標(biāo)識(shí)一個(gè)具體的數(shù)據(jù),例如數(shù)據(jù)庫(kù)中的某個(gè)表或磁盤上的某個(gè)文件。
- 當(dāng)訪問(wèn)本機(jī)應(yīng)用的數(shù)據(jù)庫(kù)時(shí),本地設(shè)備的“device_id”字段為空,因此在“dataability:”后面有三個(gè)“/”。
- 在slice頁(yè)面調(diào)用DataAbilityHelper對(duì)象的接口進(jìn)行數(shù)據(jù)操作。
??想了解更多內(nèi)容,請(qǐng)?jiān)L問(wèn):??
??51CTO和華為官方合作共建的鴻蒙技術(shù)社區(qū)??