分布式数据服务主要实现对用户设备中应用程序的数据内容的分布式同步。当设备 1 上的应用 A 在分布式数据库中增、删、改数据后,设备2上的应用 A 也可以获取到该数据库变化。可在分布式图库、信息、通讯录、文件管理器等场景中使用。
HarmonyOS 系统中的分布式数据服务模块为开发者提供下面几种功能:
功能分类 | 接口名称 | 描述 |
---|---|---|
分布式数据库创建、打开、关闭和删除。 | isCreateIfMissing() | 数据库不存在时是否创建。 |
setCreateIfMissing(boolean isCreateIfMissing) | 数据库不存在时是否创建。 | |
isEncrypt() | 获取数据库是否加密。 | |
setEncrypt(boolean isEncrypt) | 设置数据库是否加密。 | |
getStoreType() | 获取分布式数据库的类型。 | |
setStoreType(KvStoreType storeType) | 设置分布式数据库的类型。 | |
KvStoreType.DEVICE_COLLABORATION | 设备协同分布式数据库类型。 | |
KvStoreType.SINGLE_VERSION | 单版本分布式数据库类型。 | |
getKvStore(Options options, String storeId) | 根据Options配置创建和打开标识符为 storeId 的分布式数据库。 | |
closeKvStore(KvStore kvStore) | 关闭分布式数据库。 | |
deleteKvStore(String storeId) | 删除分布式数据库。 | |
分布式数据增、删、改、查。 | getStoreId() | 根据配置构造帐号键值数据库管理类实例。 |
putBoolean(String key, boolean value)putInt(String key, int value)putFloat(String key, float value)putDouble(String key, double value)putString(String key, String value)putByteArray(String key, byte[] value)putBatch(List<Entry> entries) | 插入和更新数据。 | |
delete(String key)deleteBatch(List<String> keys) | 删除数据。 | |
getInt(String key)getFloat(String key)getDouble(String key)getString(String key)getByteArray(String key)getEntries(String keyPrefix) | 查询数据。 | |
分布式数据谓词查询。 | select()reset()equalTo(String field, int value)equalTo(String field, long value)equalTo(String field, double value)equalTo(String field, String value)equalTo(String field, boolean value)notEqualTo(String field, int value)notEqualTog(String field, long value)notEqualTo(String field, boolean value)notEqualTo(String field, String value)notEqualTo(String field, double value)greaterThan(String field, int value)greaterThan(String field, long value)greaterThan(String field, double value)greaterThan(String field, String value)lessThan(String field, int value)lessThan(String field, long value)lessThan(String field, double value)lessThan(String field, String value)greaterThanOrEqualTo(String field, int value)greaterThanOrEqualTo(String field, long value)greaterThanOrEqualTo(String field, double value)greaterThanOrEqualTo(String field, String value)lessThanOrEqualTo(String field, int value)lessThanOrEqualTo(String field, long value)lessThanOrEqualTo(String field, double value)lessThanOrEqualTo(String field, String value)isNull(String field)orderByDesc(String field)orderByAsc(String field)limit(int number, int offset)like(String field, String value)unlike(String field, String value)inInt(String field, List<Integer> valueList)inLong(String field, List<Long> valueList)inDouble(String field, List<Double> valueList)inString(String field, List<String> valueList)notInInt(String field, List<Integer> valueList)notInLong(String field, List<Long> valueList)notInDouble(String field, List<Double> valueList)notInString(String field, List<String> valueList)and()or() | 对于Schema数据库谓词查询数据。 |
订阅分布式数据变化。 | subscribe(SubscribeType subscribeType, KvStoreObserver observer) | 订阅数据库中数据的变化。 |
分布式数据同步。 | sync(List<String> deviceIdList, SyncMode mode) | 在手动模式下,触发数据库同步。 |
以单版本分布式数据库为例,说明开发步骤。
以下为创建分布式数据库管理器的代码示例:
Context context;
...
KvManagerConfig config = new KvManagerConfig(context);
KvManager kvManager = KvManagerFactory.getInstance().createKvManager(config);
以下为创建单版本分布式数据库的代码示例:
Options CREATE = new Options();
CREATE.setCreateIfMissing(true).setEncrypt(false).setKvStoreType(KvStoreType.SINGLE_VERSION);
String storeID = "testApp";
SingleKvStore singleKvStore = kvManager.getKvStore(CREATE, storeID);
\1. 客户端需要实现KvStoreObserver接口。
\2. 构造并注册KvStoreObserver实例。
以下为订阅单版本分布式数据库所有(本地及远端)数据变化通知的代码示例:
class KvStoreObserverClient implements KvStoreObserver() {
@Override
public void onChange(ChangeNotification notification) {
List<Entry> insertEntries = notification.getInsertEntries();
List<Entry> updateEntries = notification.getUpdateEntries();
List<Entry> deleteEntries = notification.getDeleteEntries();
}
}
KvStoreObserver kvStoreObserverClient = new KvStoreObserverClient();
singleKvStore.subscribe(SubscribeType.SUBSCRIBE_TYPE_ALL, kvStoreObserverClient);
以下为将字符串类型键值数据写入单版本分布式数据库的代码示例:
String key = "todayWeather";
String value = "Sunny";
singleKvStore.putString(key, value);
以下为从单版本分布式数据库中查询字符串类型数据的代码示例:
String key = "todayWeather";String value = singleKvStore.getString(key);
\1. 获取已连接的设备列表。
\2. 选择同步方式进行数据同步。
以下为单版本分布式数据库进行数据同步的代码示例,其中同步方式为 PUSH_ONLY:
List<DeviceInfo> deviceInfoList = kvManager.getConnectedDevicesInfo(DeviceFilterStrategy.NO_FILTER);
List<String> deviceIdList = new ArrayList<>();
for (DeviceInfo deviceInfo : deviceInfoList) {
deviceIdList.add(deviceInfo.getId());
}
singleKvStore.sync(deviceIdList, SyncMode.PUSH_ONLY);
kvManager.closeKvStore(singleKvStore);
kvManager.deleteKvStore(storeID);
(c) 2024 chaojicainiao.com MIT license