一. 场景介绍
跨设备数据同步功能(即分布式功能),指将数据同步到一个组网环境中的其他设备。常用于用户应用程序数据内容在可信认证的不同设备间,进行自由同步、修改和查询。
二. 跨设备同步访问控制机制
在进行开发之前,先要了解一下跨设备同步访问控制机制,数据跨设备同步时,数据管理基于设备等级和数据安全标签进行访问控制,具体如下:
设备安全级别 | 可同步的数据安全标签 |
---|---|
SL1 | S1 |
SL2 | S1~S2 |
SL3 | S2~S3 |
SL4 | S3~S4 |
SL5 | S4~S5 |
手表通常为低安全的SL1设备。若创建数据安全标签为S1的数据库,则此数据库数据可以在这些设备间同步;若创建的数据库标签为S2-S4,则不能在这些设备间同步。
总结:想要开设备同步,设备安全级别需要设置为:S1
具体设置代码:
javascript
const options: distributedKVStore.Options = {
//设置安全等级
securityLevel: distributedKVStore.SecurityLevel.S1
};
三.键值型数据库跨设备数据同步
1. 导入模块
javascript
import { distributedKVStore } from '@kit.ArkData';
2. 申请权限
在module.json5中requestPermissions里面配置权限:
javascript
{
"name": "ohos.permission.DISTRIBUTED_DATASYNC",
"reason": "$string:write_permission",
"usedScene": {
"abilities": [
"EntryAbility"
],
"when": "always"
}
},
3. 创建kvManager对象
javascript
let config: distributedKVStore.KVManagerConfig = {
bundleName: context.abilityInfo.bundleName,
context: context
};
try {
this.kvManager = distributedKVStore.createKVManager(config);
} catch (error) {
PhLog.error(`createKvStore createKVManager failed, err=${JSON.stringify(error)}`, 'KvStoreViewModel');
reject(`createKvStore createKVManager failed, err=${JSON.stringify(error)}`);
return;
}
4. 获取并得到指定类型的键值型数据库
javascript
let options: distributedKVStore.Options = {
createIfMissing: true,
encrypt: false,
backup: false,
autoSync: true,//自动同步功能
kvStoreType: distributedKVStore.KVStoreType.DEVICE_COLLABORATION,
securityLevel: distributedKVStore.SecurityLevel.S1//设置安全等级
};
// this.kvManager.getKVStore(CommonConstants.KV_STORE_ID, options).then((store: distributedKVStore.SingleKVStore) => {
this.kvManager.getKVStore(CommonConstants.KV_STORE_ID, options).then((store: distributedKVStore.DeviceKVStore) => {
if (store === null) {
PhLog.error(`createKvStore getKVStore store is null`, 'KvStoreViewModel');
reject(`createKvStore getKVStore store is null`);
return;
}
this.kvStore = store;
this.kvStore.enableSync(true).then(() => {
resolve(1);
PhLog.info('createKvStore enableSync success', 'KvStoreViewModel');
}).catch((error: Error) => {
reject(`createKvStore enableSync fail, error=${JSON.stringify(error)}`);
PhLog.error(`createKvStore enableSync fail, error=${JSON.stringify(error)}`, 'KvStoreViewModel');
});
this.setDataChangeListener(() => {});
}).catch((error: Error) => {
reject(`createKvStore getKVStore failed, error=${JSON.stringify(error)}`);
PhLog.error(`createKvStore getKVStore failed, error=${JSON.stringify(error)}`, 'KvStoreViewModel');
})
5. 订阅、移除分布式数据变化
javascript
try {
//订阅
kvStore.on('dataChange', distributedKVStore.SubscribeType.SUBSCRIBE_TYPE_ALL, (data) => {
console.info(`dataChange callback call data: ${data}`);
});
} catch (e) {
let error = e as BusinessError;
console.error(`An unexpected error occurred. code:${error.code},message:${error.message}`);
}
try {
//移除订阅数据变化
this.kvStore.off('dataChange');
} catch (error) {
PhLog.error(`removeDataChangeListener off('dataChange') failed, err=${JSON.stringify(error)}`, 'KvStoreViewModel');
}
6. 将数据写入分布式数据库。
javascript
put(key: string, value: string): void {
if (this.kvStore === undefined) {
return;
}
this.kvStore.put(key, value).then(() => {
PhLog.info(`kvStore.put key=${key} finished}`, 'KvStoreViewModel');
}).catch((error: Error) => {
PhLog.error(`kvStore.put key=${key} failed, error=${JSON.stringify(error)}`, 'KvStoreViewModel');
});
}
7. 查询数据
javascript
async get(key: string): Promise<boolean | string | number | Uint8Array> {
return new Promise((resolve, reject) => {
if (this.kvStore === undefined) {
PhLog.info('失败了')
reject();
return;
}
this.kvStore.get(key).then((res) => {
resolve(res)
PhLog.info(`kvStore.put key=${key} finished}`, 'KvStoreViewModel');
}).catch((error: Error) => {
resolve('')
PhLog.error(`kvStore.put key=${key} failed, error=${JSON.stringify(error)}`, 'KvStoreViewModel');
});
})
}
8. 同步数据到其他设备
javascript
try {
// 1000表示最大延迟时间为1000ms
kvStore.sync(deviceIds, distributedKVStore.SyncMode.PUSH_ONLY, 1000);
} catch (e) {
let error = e as BusinessError;
console.error(`An unexpected error occurred. Code:${error.code},message:${error.message}`);
}```
9.删除数据
javascript
async delete(key: string): Promise<void> {
return new Promise((resolve, reject) => {
if (this.kvStore === undefined) {
PhLog.info('失败了')
reject();
return;
}
this.kvStore.delete(key).then( ()=> {
resolve();
})
})
}```
到这里整个分布式跨设备数据同步就完成了,可以愉快的进行跨设备数据同步访问了,
PS:过程中需要注意的是安全等级不要忘了设置,要不然不成功哦!!
接下来还会分享分布式跨设备文件访问