鸿蒙HarmonyOS分布式数据库使用
鸿蒙HarmonyOS分布式数据库使用一、配置文件二、Ability中声明使用三、使用的AbilitySlice中声明数据库并使用3.1声明数据库3.2 存储数据3.2 查询数据四、工具类中声明/获取数据库分布式数据库参数说明分布式数据库使用注意事项一、配置文件config的module的abilities同级"reqPermissions": [{"name": "ohos.permission
·
鸿蒙HarmonyOS分布式数据库使用
一、配置文件
config的module的abilities同级
"reqPermissions": [
{
"name": "ohos.permission.DISTRIBUTED_DATASYNC"
},
{
"name": "ohos.permission.DISTRIBUTED_DEVICE_STATE_CHANGE"
},
{
"name": "ohos.permission.GET_DISTRIBUTED_DEVICE_INFO"
},
{
"name": "ohos.permission.GET_BUNDLE_INFO"
}
]
二、Ability中声明使用
MainAbility的onStart方法中声明使用
requestPermissionsFromUser(new String[]{"ohos.permission.DISTRIBUTED_DATASYNC"}, 0);
三、使用的AbilitySlice中声明数据库并使用
因为数据库很多情况下都是跨AbilitySlice使用的所以需要在AbilitySlice中声明 然后在DBUtils工具类中获取
3.1声明数据库
private SingleKvStore singleKvStore = null;//数据库 kv就是key-value的类型数据库的简写
//在onStart 方法里声明/获取数据库 创建数据库和获取数据库合二为一的 这个DBUtils工具类见下面==》四、工具类中声明/获取数据库的代码this是创建数据必要的上下文 RecordAccouontsDB是数据库名字 这个随便你自己起
singleKvStore = DBUtils.initOrGetDB(this,"RecordAccouontsDB");
3.2 存储数据
//在需要存数据的地方 因为分布式数据库只有 key和value 所以 value 用的json的字符串 和数据库存储有关代码需要用try catch包起来
singleKvStore.putString("key"+ id, "{\"id\":"+id+
",\"money\":"+money+
",\"paymentMatters\":\""+paymentMatters+
"\",\"dateYear\":"+dateYear+
"\",\"inOrExp\":"+inOrExp+"}");
3.3 监听数据变化
//数据库里的数据变化监听
singleKvStore.subscribe(SubscribeType.SUBSCRIBE_TYPE_ALL, new KvStoreObserver() {
@Override
public void onChange(ChangeNotification changeNotification) {
//刷新页面上的数据,同样有一个坑,onChange方法实质上,在一个子线程里执行
getUITaskDispatcher().asyncDispatch(new Runnable() {
@Override
public void run() {
//在这里执行页面ui组件的显示刷新 后面的3.4 3.5都是写在这里的
}
});
}
});
3.3 查询数据
//谓词查询
Query query = Query.select();
query.equalTo("$.dateYear", DateUtils.getCurrentYear())
.and().greaterThanOrEqualTo("$.money",5);
List<Entry> entries = singleKvStore.getEntries(query);
//复位查询关键词 这样就不用反复声明了
query.reset();
query.equalTo("$.id","123456");
entries = singleKvStore.getEntries(query);
//详见官方分布式数据服务关键API功能介绍
//https://developer.harmonyos.com/cn/docs/documentation/doc-guides/database-mdds-guidelines-0000000000030122
3.4 显示数据
//谓词查询
double money;
for (Entry entry : entries) {
//遍历数据 因为上面我查的id是123456的数据 所以这里就一条实际情况大家根据需要整哈
zsonObject = ZSONObject.stringToZSON(entry.getValue().getString());
money+= zsonObject.getDouble("money");
}
//给组件赋值数据
Text moneyText= (Text) findComponentById(ResourceTable.Id_money_text)
moneyText.setText(money+ "");
四、工具类中声明/获取数据库
鸿蒙的数据库声明和获取是一套代码 没有就创建 有就获取 在utils文件夹下创建DBUtils工具类
public class DBUtils {
//具体的实现数据库的初始化
public static SingleKvStore initOrGetDB(Context context,String storeId){
//要做的是事情,定义数据库,设计数据库的表里有什么字段,这里就举例子 自己根据自己的项目写
FieldNode fdid = new FieldNode("id");//字段名
fdid.setNullable(false);//不能为空
fdid.setType(FieldValueType.STRING);//数据类型
FieldNode fdmoney = new FieldNode("money");
fdmoney.setType(FieldValueType.DOUBLE);//数据类型
FieldNode fdpaymentMatters = new FieldNode("paymentMatters");
fdpaymentMatters.setType(FieldValueType.STRING);//数据类型
FieldNode fddateYear = new FieldNode("dateYear");
fddateYear.setType(FieldValueType.INTEGER);//数据类型
FieldNode fdinOrExp = new FieldNode("inOrExp");
fdinOrExp.setType(FieldValueType.BOOLEAN);//数据类型
//把上面的字段,封装到Schema对象
Schema schema = new Schema();
//设置索引
ArrayList<String> indexList = new ArrayList<>();
indexList.add("$.id"); //schema默认有一个rootFieldNode
schema.setIndexes(indexList);
schema.getRootFieldNode().appendChild(fdid);
schema.getRootFieldNode().appendChild(fdmoney);
schema.getRootFieldNode().appendChild(fdpaymentMatters);
schema.getRootFieldNode().appendChild(fddateYear);
schema.getRootFieldNode().appendChild(fdinOrExp);
schema.setSchemaMode(SchemaMode.STRICT);//严格模式
KvManagerConfig kvManagerConfig = new KvManagerConfig(context);
KvManager kvManager = KvManagerFactory.getInstance().createKvManager(kvManagerConfig);
//设置操作参数
Options options = new Options();
options.setCreateIfMissing(true)//是否默认创建
.setEncrypt(false)//是否默认加密
.setKvStoreType(KvStoreType.SINGLE_VERSION)//单版本类型
.setSchema(schema);
SingleKvStore singleKvStore = kvManager.getKvStore(options, storeId);
return singleKvStore;
}
}
分布式数据库参数说明
setKvStoreType 有两种类型 单版本类型SINGLE_VERSION 和协同数据库DEVICE_COLLABORATION
分布式数据服务支持的KV数据模型规格:
(1)设备协同数据库,Key最大支持896Byte,Value最大支持4MB - 1Byte。
(2)单版本数据库,Key最大支持1KB,Value最大支持4MB - 1Byte。
(3)每个应用程序最多支持同时打开16个KvStore。
分布式数据库使用注意事项
1、如果要改数据库字段,需要先关闭数据,删除数据库,再建新的数据库写入数据
2、更新Ui数据需要拿到主线程在任务Runnable中,向UI组件写值
getUITaskDispatcher().asyncDispatch(new Runnable() {
@Override
public void run() {
//在任务Runnable中,向UI组件写值
}
})
更多推荐
所有评论(0)