1e41f4b71Sopenharmony_ci# RelationalStore开发指导 (C/C++) 2e41f4b71Sopenharmony_ci 3e41f4b71Sopenharmony_ci 4e41f4b71Sopenharmony_ci## 场景介绍 5e41f4b71Sopenharmony_ci 6e41f4b71Sopenharmony_ciRelationalStore提供了一套完整的对本地数据库进行管理的机制,对外提供了一系列的增、删、改、查等接口,也可以直接运行用户输入的SQL语句来满足复杂的场景需要。 7e41f4b71Sopenharmony_ci 8e41f4b71Sopenharmony_ci 9e41f4b71Sopenharmony_ci## 基本概念 10e41f4b71Sopenharmony_ci 11e41f4b71Sopenharmony_ci- **谓词**:数据库中用来代表数据实体的性质、特征或者数据实体之间关系的词项,主要用来定义数据库的操作条件。 12e41f4b71Sopenharmony_ci 13e41f4b71Sopenharmony_ci- **结果集**:指用户查询之后的结果集合,可以对数据进行访问。结果集提供了灵活的数据访问方式,可以更方便地拿到用户想要的数据。 14e41f4b71Sopenharmony_ci 15e41f4b71Sopenharmony_ci 16e41f4b71Sopenharmony_ci## 约束限制 17e41f4b71Sopenharmony_ci 18e41f4b71Sopenharmony_ci- 系统默认日志方式是WAL(Write Ahead Log)模式,系统默认落盘方式是FULL模式。 19e41f4b71Sopenharmony_ci 20e41f4b71Sopenharmony_ci- 数据库中连接池的最大数量是4个,用以管理用户的读操作。 21e41f4b71Sopenharmony_ci 22e41f4b71Sopenharmony_ci- 为保证数据的准确性,数据库同一时间只能支持一个写操作。 23e41f4b71Sopenharmony_ci 24e41f4b71Sopenharmony_ci- 当应用被卸载完成后,设备上的相关数据库文件及临时文件会被自动清除。 25e41f4b71Sopenharmony_ci 26e41f4b71Sopenharmony_ci- 使用API11新增的端云同步等接口时,需要确保已实现云服务功能。 27e41f4b71Sopenharmony_ci 28e41f4b71Sopenharmony_ci 29e41f4b71Sopenharmony_ci## 接口说明 30e41f4b71Sopenharmony_ci 31e41f4b71Sopenharmony_ci详细的接口说明请参考[RDB](../reference/apis-arkdata/_r_d_b.md)。 32e41f4b71Sopenharmony_ci 33e41f4b71Sopenharmony_ci| 接口名称 | 描述 | 34e41f4b71Sopenharmony_ci| -------- | -------- | 35e41f4b71Sopenharmony_ci| OH_Rdb_GetOrOpen(const OH_Rdb_Config *config, int *errCode) | 获得一个相关的OH_Rdb_Store实例,操作关系型数据库。 | 36e41f4b71Sopenharmony_ci| OH_Rdb_Execute(OH_Rdb_Store *store, const char *sql) | 执行包含指定参数但不返回值的SQL语句。 | 37e41f4b71Sopenharmony_ci| OH_Rdb_Insert(OH_Rdb_Store *store, const char *table, OH_VBucket *valuesBucket) | 向目标表中插入一行数据。 | 38e41f4b71Sopenharmony_ci| OH_Rdb_Update(OH_Rdb_Store *store, OH_VBucket *valuesBucket, OH_Predicates *predicates) | 根据OH_Predicates的指定实例对象更新数据库中的数据。 | 39e41f4b71Sopenharmony_ci| OH_Rdb_Delete(OH_Rdb_Store *store, OH_Predicates *predicates) | 根据OH_Predicates的指定实例对象从数据库中删除数据。 | 40e41f4b71Sopenharmony_ci| OH_Rdb_Query(OH_Rdb_Store *store, OH_Predicates *predicates, const char *const *columnNames, int length) | 根据指定条件查询数据库中的数据。 | 41e41f4b71Sopenharmony_ci| OH_Rdb_DeleteStore(const OH_Rdb_Config *config) | 删除数据库。 | 42e41f4b71Sopenharmony_ci| OH_VBucket_PutAsset(OH_VBucket *bucket, const char *field, Rdb_Asset *value) | 把Rdb_Asset类型的数据放到指定的OH_VBucket对象中。 | 43e41f4b71Sopenharmony_ci| OH_VBucket_PutAssets(OH_VBucket *bucket, const char *field, Rdb_Asset *value, uint32_t count) | 把Rdb_Asset数组类型的数据放到指定的OH_VBucket对象中。 | 44e41f4b71Sopenharmony_ci| OH_Rdb_SetDistributedTables(OH_Rdb_Store *store, const char *tables[], uint32_t count, Rdb_DistributedType type, const Rdb_DistributedConfig *config) | 设置分布式数据库表。 | 45e41f4b71Sopenharmony_ci| OH_Rdb_FindModifyTime(OH_Rdb_Store *store, const char *tableName, const char *columnName, OH_VObject *values) | 获取数据库指定表中指定列的数据的最后修改时间。 | 46e41f4b71Sopenharmony_ci| OH_Rdb_CloudSync(OH_Rdb_Store *store, Rdb_SyncMode mode, const char *tables[], uint32_t count, const Rdb_ProgressObserver *observer) | 手动执行对指定表的端云同步,使用该接口需要实现云服务功能。 | 47e41f4b71Sopenharmony_ci| int OH_Data_Asset_SetName(Data_Asset *asset, const char *name) | 为资产类型数据设置名称。 | 48e41f4b71Sopenharmony_ci| int OH_Data_Asset_SetUri(Data_Asset *asset, const char *uri) | 为资产类型数据设置绝对路径。 | 49e41f4b71Sopenharmony_ci| int OH_Data_Asset_SetPath(Data_Asset *asset, const char *path) | 为资产类型数据设置应用沙箱里的相对路径。 | 50e41f4b71Sopenharmony_ci| int OH_Data_Asset_SetCreateTime(Data_Asset *asset, int64_t createTime) | 为资产类型数据设置创建时间。 | 51e41f4b71Sopenharmony_ci| int OH_Data_Asset_SetModifyTime(Data_Asset *asset, int64_t modifyTime) | 为资产类型数据设置最后修改时间。 | 52e41f4b71Sopenharmony_ci| int OH_Data_Asset_SetSize(Data_Asset *asset, size_t size) | 为资产类型数据设置占用空间大小。 | 53e41f4b71Sopenharmony_ci| int OH_Data_Asset_SetStatus(Data_Asset *asset, Data_AssetStatus status) | 为资产类型数据设置状态码。 | 54e41f4b71Sopenharmony_ci| int OH_Data_Asset_GetName(Data_Asset *asset, char *name, size_t *length) | 获取资产类型数据的名称。 | 55e41f4b71Sopenharmony_ci| int OH_Data_Asset_GetUri(Data_Asset *asset, char *uri, size_t *length) | 获取资产类型数据的绝对路径。 | 56e41f4b71Sopenharmony_ci| int OH_Data_Asset_GetPath(Data_Asset *asset, char *path, size_t *length) | 获取资产类型数据在应用沙箱内的相对路径。 | 57e41f4b71Sopenharmony_ci| int OH_Data_Asset_GetCreateTime(Data_Asset *asset, int64_t *createTime) | 获取资产类型数据的创建时间。 | 58e41f4b71Sopenharmony_ci| int OH_Data_Asset_GetModifyTime(Data_Asset *asset, int64_t *modifyTime) | 获取资产类型数据的最后修改时间。 | 59e41f4b71Sopenharmony_ci| int OH_Data_Asset_GetSize(Data_Asset *asset, size_t *size) | 获取资产类型数据的占用空间大小。 | 60e41f4b71Sopenharmony_ci| int OH_Data_Asset_GetStatus(Data_Asset *asset, Data_AssetStatus *status) | 获取资产类型数据的状态码。 | 61e41f4b71Sopenharmony_ci| Data_Asset *OH_Data_Asset_CreateOne() | 创造一个资产类型实例。使用完毕后需要调用OH_Data_Asset_DestroyOne释放内存。 | 62e41f4b71Sopenharmony_ci| int OH_Data_Asset_DestroyOne(Data_Asset *asset) | 销毁一个资产类型实例并回收内存。 | 63e41f4b71Sopenharmony_ci| Data_Asset **OH_Data_Asset_CreateMultiple(uint32_t count) | 创造指定数量的资产类型实例。使用完毕后需要调用OH_Data_Asset_DestroyMultiple释放内存。 | 64e41f4b71Sopenharmony_ci| int OH_Data_Asset_DestroyMultiple(Data_Asset **assets, uint32_t count) | 销毁指定数量的资产类型实例并回收内存。 | 65e41f4b71Sopenharmony_ci| int OH_Rdb_Subscribe(OH_Rdb_Store *store, Rdb_SubscribeType type, const Rdb_DataObserver *observer) | 为数据库注册观察者, 当分布式数据库中的数据发生更改时,将调用回调。 | 66e41f4b71Sopenharmony_ci| int OH_Rdb_Unsubscribe(OH_Rdb_Store *store, Rdb_SubscribeType type, const Rdb_DataObserver *observer) | 从数据库中删除指定类型的指定观察者。 | 67e41f4b71Sopenharmony_ci| int OH_Rdb_SubscribeAutoSyncProgress(OH_Rdb_Store *store, const Rdb_ProgressObserver *observer) | 订阅RDB存储的自动同步进程, 当收到自动同步进度的通知时,将调用回调。 | 68e41f4b71Sopenharmony_ci| int OH_Rdb_UnsubscribeAutoSyncProgress(OH_Rdb_Store *store, const Rdb_ProgressObserver *observer) | 取消订阅RDB存储的自动同步进程。 | 69e41f4b71Sopenharmony_ci 70e41f4b71Sopenharmony_ci 71e41f4b71Sopenharmony_ci## 开发步骤 72e41f4b71Sopenharmony_ci 73e41f4b71Sopenharmony_ci**添加动态链接库** 74e41f4b71Sopenharmony_ci 75e41f4b71Sopenharmony_ciCMakeLists.txt中添加以下lib。 76e41f4b71Sopenharmony_ci 77e41f4b71Sopenharmony_ci```txt 78e41f4b71Sopenharmony_cilibnative_rdb_ndk.z.so 79e41f4b71Sopenharmony_ci``` 80e41f4b71Sopenharmony_ci 81e41f4b71Sopenharmony_ci**头文件** 82e41f4b71Sopenharmony_ci 83e41f4b71Sopenharmony_ci```c++ 84e41f4b71Sopenharmony_ci#include <database/data/data_asset.h> 85e41f4b71Sopenharmony_ci#include <database/rdb/oh_cursor.h> 86e41f4b71Sopenharmony_ci#include <database/rdb/oh_predicates.h> 87e41f4b71Sopenharmony_ci#include <database/rdb/oh_value_object.h> 88e41f4b71Sopenharmony_ci#include <database/rdb/oh_values_bucket.h> 89e41f4b71Sopenharmony_ci#include <database/rdb/relational_store.h> 90e41f4b71Sopenharmony_ci#include <database/rdb/relational_store_error_code.h> 91e41f4b71Sopenharmony_ci``` 92e41f4b71Sopenharmony_ci 93e41f4b71Sopenharmony_ci1. 获取OH_Rdb_Store实例,创建数据库文件。其中dataBaseDir变量为应用沙箱路径,Stage模式下建议使用数据库目录,参考[Context](../reference/apis-ability-kit/js-apis-inner-application-context.md)的databaseDir属性。FA模式下,由于没有接口获取数据库沙箱路径,可使用应用程序的文件目录,可参考[Context](../reference/apis-ability-kit/js-apis-inner-app-context.md)的getFilesDir接口。area为数据库文件存放的安全区域,详见[contextConstant](../reference/apis-ability-kit/js-apis-app-ability-contextConstant.md),开发时需要实现由AreaMode枚举值对Rdb_SecurityArea枚举值的转换。示例代码如下所示: 94e41f4b71Sopenharmony_ci 95e41f4b71Sopenharmony_ci ```c 96e41f4b71Sopenharmony_ci // 创建OH_Rdb_Config对象 97e41f4b71Sopenharmony_ci OH_Rdb_Config config; 98e41f4b71Sopenharmony_ci // 该路径为应用沙箱路径 99e41f4b71Sopenharmony_ci config.dataBaseDir = "xxx"; 100e41f4b71Sopenharmony_ci // 数据库文件名 101e41f4b71Sopenharmony_ci config.storeName = "RdbTest.db"; 102e41f4b71Sopenharmony_ci // 应用包名 103e41f4b71Sopenharmony_ci config.bundleName = "xxx"; 104e41f4b71Sopenharmony_ci // 应用模块名 105e41f4b71Sopenharmony_ci config.moduleName = "xxx"; 106e41f4b71Sopenharmony_ci // 数据库文件安全等级 107e41f4b71Sopenharmony_ci config.securityLevel = OH_Rdb_SecurityLevel::S3; 108e41f4b71Sopenharmony_ci // 数据库是否加密 109e41f4b71Sopenharmony_ci config.isEncrypt = false; 110e41f4b71Sopenharmony_ci // config所占内存大小 111e41f4b71Sopenharmony_ci config.selfSize = sizeof(OH_Rdb_Config); 112e41f4b71Sopenharmony_ci // 数据库文件存放的安全区域 113e41f4b71Sopenharmony_ci config.area = RDB_SECURITY_AREA_EL1; 114e41f4b71Sopenharmony_ci 115e41f4b71Sopenharmony_ci int errCode = 0; 116e41f4b71Sopenharmony_ci // 获取获取OH_Rdb_Store实例 117e41f4b71Sopenharmony_ci OH_Rdb_Store *store_ = OH_Rdb_GetOrOpen(&config, &errCode); 118e41f4b71Sopenharmony_ci ``` 119e41f4b71Sopenharmony_ci 120e41f4b71Sopenharmony_ci2. 获取到OH_Rdb_Store后,调用OH_Rdb_Execute接口创建表,并调用OH_Rdb_Insert接口插入数据。示例代码如下所示: 121e41f4b71Sopenharmony_ci 122e41f4b71Sopenharmony_ci ```c 123e41f4b71Sopenharmony_ci char createTableSql[] = "CREATE TABLE IF NOT EXISTS EMPLOYEE (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT NOT NULL, " 124e41f4b71Sopenharmony_ci "AGE INTEGER, SALARY REAL, CODES BLOB)"; 125e41f4b71Sopenharmony_ci // 执行建表语句 126e41f4b71Sopenharmony_ci OH_Rdb_Execute(store_, createTableSql); 127e41f4b71Sopenharmony_ci 128e41f4b71Sopenharmony_ci // 创建键值对实例 129e41f4b71Sopenharmony_ci OH_VBucket *valueBucket = OH_Rdb_CreateValuesBucket(); 130e41f4b71Sopenharmony_ci valueBucket->putText(valueBucket, "NAME", "Lisa"); 131e41f4b71Sopenharmony_ci valueBucket->putInt64(valueBucket, "AGE", 18); 132e41f4b71Sopenharmony_ci valueBucket->putReal(valueBucket, "SALARY", 100.5); 133e41f4b71Sopenharmony_ci uint8_t arr[] = {1, 2, 3, 4, 5}; 134e41f4b71Sopenharmony_ci int len = sizeof(arr) / sizeof(arr[0]); 135e41f4b71Sopenharmony_ci valueBucket->putBlob(valueBucket, "CODES", arr, len); 136e41f4b71Sopenharmony_ci // 插入数据 137e41f4b71Sopenharmony_ci int rowId = OH_Rdb_Insert(store_, "EMPLOYEE", valueBucket); 138e41f4b71Sopenharmony_ci // 销毁键值对实例 139e41f4b71Sopenharmony_ci valueBucket->destroy(valueBucket); 140e41f4b71Sopenharmony_ci ``` 141e41f4b71Sopenharmony_ci 142e41f4b71Sopenharmony_ci > **说明:** 143e41f4b71Sopenharmony_ci > 144e41f4b71Sopenharmony_ci > 关系型数据库没有显式的flush操作实现持久化,数据插入即保存在持久化文件。 145e41f4b71Sopenharmony_ci 146e41f4b71Sopenharmony_ci3. 根据谓词指定的实例对象,对数据进行修改或删除。 147e41f4b71Sopenharmony_ci 148e41f4b71Sopenharmony_ci 调用OH_Rdb_Update方法修改数据,调用OH_Rdb_Delete方法删除数据。示例代码如下所示: 149e41f4b71Sopenharmony_ci 150e41f4b71Sopenharmony_ci ```c 151e41f4b71Sopenharmony_ci // 修改数据 152e41f4b71Sopenharmony_ci OH_VBucket *valueBucket = OH_Rdb_CreateValuesBucket(); 153e41f4b71Sopenharmony_ci valueBucket->putText(valueBucket, "NAME", "Rose"); 154e41f4b71Sopenharmony_ci valueBucket->putInt64(valueBucket, "AGE", 22); 155e41f4b71Sopenharmony_ci valueBucket->putReal(valueBucket, "SALARY", 200.5); 156e41f4b71Sopenharmony_ci uint8_t arr[] = {1, 2, 3, 4, 5}; 157e41f4b71Sopenharmony_ci int len = sizeof(arr) / sizeof(arr[0]); 158e41f4b71Sopenharmony_ci valueBucket->putBlob(valueBucket, "CODES", arr, len); 159e41f4b71Sopenharmony_ci 160e41f4b71Sopenharmony_ci OH_Predicates *predicates = OH_Rdb_CreatePredicates("EMPLOYEE"); 161e41f4b71Sopenharmony_ci OH_VObject *valueObject = OH_Rdb_CreateValueObject(); 162e41f4b71Sopenharmony_ci const char *name = "Lisa"; 163e41f4b71Sopenharmony_ci valueObject->putText(valueObject, name); 164e41f4b71Sopenharmony_ci predicates->equalTo(predicates, "NAME", valueObject)->andOperate(predicates); 165e41f4b71Sopenharmony_ci uint32_t count = 1; 166e41f4b71Sopenharmony_ci double salary = 100.5; 167e41f4b71Sopenharmony_ci valueObject->putDouble(valueObject, &salary, count); 168e41f4b71Sopenharmony_ci predicates->equalTo(predicates, "SALARY", valueObject); 169e41f4b71Sopenharmony_ci 170e41f4b71Sopenharmony_ci int changeRows = OH_Rdb_Update(store_, valueBucket, predicates); 171e41f4b71Sopenharmony_ci valueObject->destroy(valueObject); 172e41f4b71Sopenharmony_ci valueBucket->destroy(valueBucket); 173e41f4b71Sopenharmony_ci predicates->destroy(predicates); 174e41f4b71Sopenharmony_ci ``` 175e41f4b71Sopenharmony_ci 176e41f4b71Sopenharmony_ci ```c 177e41f4b71Sopenharmony_ci // 删除数据 178e41f4b71Sopenharmony_ci OH_Predicates *predicates = OH_Rdb_CreatePredicates("EMPLOYEE"); 179e41f4b71Sopenharmony_ci OH_VObject *valueObject = OH_Rdb_CreateValueObject(); 180e41f4b71Sopenharmony_ci const char *name = "Lisa"; 181e41f4b71Sopenharmony_ci valueObject->putText(valueObject, name); 182e41f4b71Sopenharmony_ci predicates->equalTo(predicates, "NAME", valueObject); 183e41f4b71Sopenharmony_ci int deleteRows = OH_Rdb_Delete(store_, predicates); 184e41f4b71Sopenharmony_ci valueObject->destroy(valueObject); 185e41f4b71Sopenharmony_ci predicates->destroy(predicates); 186e41f4b71Sopenharmony_ci ``` 187e41f4b71Sopenharmony_ci 188e41f4b71Sopenharmony_ci4. 根据谓词指定的查询条件查找数据。 189e41f4b71Sopenharmony_ci 190e41f4b71Sopenharmony_ci 调用OH_Rdb_Query方法查找数据,返回一个OH_Cursor结果集。示例代码如下所示: 191e41f4b71Sopenharmony_ci 192e41f4b71Sopenharmony_ci ```c 193e41f4b71Sopenharmony_ci OH_Predicates *predicates = OH_Rdb_CreatePredicates("EMPLOYEE"); 194e41f4b71Sopenharmony_ci 195e41f4b71Sopenharmony_ci const char *columnNames[] = {"NAME", "AGE"}; 196e41f4b71Sopenharmony_ci int len = sizeof(columnNames) / sizeof(columnNames[0]); 197e41f4b71Sopenharmony_ci OH_Cursor *cursor = OH_Rdb_Query(store_, predicates, columnNames, len); 198e41f4b71Sopenharmony_ci 199e41f4b71Sopenharmony_ci int columnCount = 0; 200e41f4b71Sopenharmony_ci cursor->getColumnCount(cursor, &columnCount); 201e41f4b71Sopenharmony_ci 202e41f4b71Sopenharmony_ci // OH_Cursor是一个数据集合的游标,默认指向第-1个记录,有效的数据从0开始 203e41f4b71Sopenharmony_ci int64_t age; 204e41f4b71Sopenharmony_ci while (cursor->goToNextRow(cursor) == OH_Rdb_ErrCode::RDB_OK) { 205e41f4b71Sopenharmony_ci cursor->getInt64(cursor, 1, &age); 206e41f4b71Sopenharmony_ci } 207e41f4b71Sopenharmony_ci 208e41f4b71Sopenharmony_ci // 释放谓词实例 209e41f4b71Sopenharmony_ci predicates->destroy(predicates); 210e41f4b71Sopenharmony_ci // 释放结果集 211e41f4b71Sopenharmony_ci cursor->destroy(cursor); 212e41f4b71Sopenharmony_ci ``` 213e41f4b71Sopenharmony_ci 214e41f4b71Sopenharmony_ci5. 向数据库表中插入资产类型数据。 215e41f4b71Sopenharmony_ci 216e41f4b71Sopenharmony_ci ```c 217e41f4b71Sopenharmony_ci // 列的属性为单个资产类型时,sql语句中应指定为asset,多个资产类型应指定为assets。 218e41f4b71Sopenharmony_ci char createAssetTableSql[] = "CREATE TABLE IF NOT EXISTS asset_table (id INTEGER PRIMARY KEY AUTOINCREMENT, data1 asset, data2 assets );"; 219e41f4b71Sopenharmony_ci errCode = OH_Rdb_Execute(store_, createAssetTableSql); 220e41f4b71Sopenharmony_ci Data_Asset *asset = OH_Data_Asset_CreateOne(); 221e41f4b71Sopenharmony_ci OH_Data_Asset_SetName(asset, "name0"); 222e41f4b71Sopenharmony_ci OH_Data_Asset_SetUri(asset, "uri0"); 223e41f4b71Sopenharmony_ci OH_Data_Asset_SetPath(asset, "path0"); 224e41f4b71Sopenharmony_ci OH_Data_Asset_SetCreateTime(asset, 1); 225e41f4b71Sopenharmony_ci OH_Data_Asset_SetModifyTime(asset, 1); 226e41f4b71Sopenharmony_ci OH_Data_Asset_SetSize(asset, 1); 227e41f4b71Sopenharmony_ci OH_Data_Asset_SetStatus(asset, Data_AssetStatus::ASSET_NORMAL); 228e41f4b71Sopenharmony_ci errCode = OH_VBucket_PutAsset(valueBucket, "data1", asset); 229e41f4b71Sopenharmony_ci 230e41f4b71Sopenharmony_ci Data_Asset **assets = OH_Data_Asset_CreateMultiple(2); 231e41f4b71Sopenharmony_ci 232e41f4b71Sopenharmony_ci OH_Data_Asset_SetName(assets[0], "name0"); 233e41f4b71Sopenharmony_ci OH_Data_Asset_SetUri(assets[0], "uri0"); 234e41f4b71Sopenharmony_ci OH_Data_Asset_SetPath(assets[0], "path0"); 235e41f4b71Sopenharmony_ci OH_Data_Asset_SetCreateTime(assets[0], 1); 236e41f4b71Sopenharmony_ci OH_Data_Asset_SetModifyTime(assets[0], 1); 237e41f4b71Sopenharmony_ci OH_Data_Asset_SetSize(assets[0], 1); 238e41f4b71Sopenharmony_ci OH_Data_Asset_SetStatus(assets[0], Data_AssetStatus::ASSET_NORMAL); 239e41f4b71Sopenharmony_ci 240e41f4b71Sopenharmony_ci OH_Data_Asset_SetName(assets[1], "name1"); 241e41f4b71Sopenharmony_ci OH_Data_Asset_SetUri(assets[1], "uri1"); 242e41f4b71Sopenharmony_ci OH_Data_Asset_SetPath(assets[1], "path1"); 243e41f4b71Sopenharmony_ci OH_Data_Asset_SetCreateTime(assets[1], 1); 244e41f4b71Sopenharmony_ci OH_Data_Asset_SetModifyTime(assets[1], 1); 245e41f4b71Sopenharmony_ci OH_Data_Asset_SetSize(assets[1], 1); 246e41f4b71Sopenharmony_ci OH_Data_Asset_SetStatus(assets[1], Data_AssetStatus::ASSET_NORMAL); 247e41f4b71Sopenharmony_ci 248e41f4b71Sopenharmony_ci errCode = OH_VBucket_PutAssets(valueBucket, "data2", assets, assetsCount); 249e41f4b71Sopenharmony_ci int rowID = OH_Rdb_Insert(cursorTestRdbStore_, table, valueBucket); 250e41f4b71Sopenharmony_ci // 释放Data_Asset*和Data_Asset** 251e41f4b71Sopenharmony_ci OH_Data_Asset_DestroyMultiple(assets, 2); 252e41f4b71Sopenharmony_ci OH_Data_Asset_DestroyOne(asset); 253e41f4b71Sopenharmony_ci ``` 254e41f4b71Sopenharmony_ci 255e41f4b71Sopenharmony_ci6. 从结果集中读取资产类型数据。 256e41f4b71Sopenharmony_ci 257e41f4b71Sopenharmony_ci ```c 258e41f4b71Sopenharmony_ci OH_Predicates *predicates = OH_Rdb_CreatePredicates("asset_table"); 259e41f4b71Sopenharmony_ci 260e41f4b71Sopenharmony_ci OH_Cursor *cursor = OH_Rdb_Query(cursorTestRdbStore_, predicates, NULL, 0); 261e41f4b71Sopenharmony_ci cursor->goToNextRow(cursor); 262e41f4b71Sopenharmony_ci 263e41f4b71Sopenharmony_ci uint32_t assetCount = 0; 264e41f4b71Sopenharmony_ci // assetCount作为出参获取该列资产类型数据的数量 265e41f4b71Sopenharmony_ci errCode = cursor->getAssets(cursor, 2, nullptr, &assetCount); 266e41f4b71Sopenharmony_ci Data_Asset **assets = OH_Data_Asset_CreateMultiple(assetCount); 267e41f4b71Sopenharmony_ci errCode = cursor->getAssets(cursor, 2, assets, &assetCount); 268e41f4b71Sopenharmony_ci Data_Asset *asset = assets[1]; 269e41f4b71Sopenharmony_ci 270e41f4b71Sopenharmony_ci char name[10] = ""; 271e41f4b71Sopenharmony_ci size_t nameLength = 10; 272e41f4b71Sopenharmony_ci errCode = OH_Data_Asset_GetName(asset, name, &nameLength); 273e41f4b71Sopenharmony_ci 274e41f4b71Sopenharmony_ci char uri[10] = ""; 275e41f4b71Sopenharmony_ci size_t uriLength = 10; 276e41f4b71Sopenharmony_ci errCode = OH_Data_Asset_GetUri(asset, uri, &uriLength); 277e41f4b71Sopenharmony_ci 278e41f4b71Sopenharmony_ci char path[10] = ""; 279e41f4b71Sopenharmony_ci size_t pathLength = 10; 280e41f4b71Sopenharmony_ci errCode = OH_Data_Asset_GetPath(asset, path, &pathLength); 281e41f4b71Sopenharmony_ci 282e41f4b71Sopenharmony_ci int64_t createTime = 0; 283e41f4b71Sopenharmony_ci errCode = OH_Data_Asset_GetCreateTime(asset, &createTime); 284e41f4b71Sopenharmony_ci 285e41f4b71Sopenharmony_ci int64_t modifyTime = 0; 286e41f4b71Sopenharmony_ci errCode = OH_Data_Asset_GetModifyTime(asset, &modifyTime); 287e41f4b71Sopenharmony_ci 288e41f4b71Sopenharmony_ci size_t size = 0; 289e41f4b71Sopenharmony_ci errCode = OH_Data_Asset_GetSize(asset, &size); 290e41f4b71Sopenharmony_ci 291e41f4b71Sopenharmony_ci Data_AssetStatus status = Data_AssetStatus::ASSET_NULL; 292e41f4b71Sopenharmony_ci errCode = OH_Data_Asset_GetStatus(asset, &status); 293e41f4b71Sopenharmony_ci 294e41f4b71Sopenharmony_ci predicates->destroy(predicates); 295e41f4b71Sopenharmony_ci OH_Data_Asset_DestroyMultiple(assets, assetCount); 296e41f4b71Sopenharmony_ci cursor->destroy(cursor); 297e41f4b71Sopenharmony_ci ``` 298e41f4b71Sopenharmony_ci 299e41f4b71Sopenharmony_ci7. 查询数据的最后修改时间。调用OH_Rdb_FindModifyTime查询指定表中指定列的数据的最后修改时间,该接口返回一个有两列数据的OH_Cursor对象,第一列为传入的主键/RowId,第二列为最后修改时间。示例代码如下所示: 300e41f4b71Sopenharmony_ci 301e41f4b71Sopenharmony_ci ```c 302e41f4b71Sopenharmony_ci OH_VObject *values = OH_Rdb_CreateValueObject(); 303e41f4b71Sopenharmony_ci int64_t keys[] = { 1 }; 304e41f4b71Sopenharmony_ci values->putInt64(values, keys, 1); 305e41f4b71Sopenharmony_ci OH_Cursor *cursor; 306e41f4b71Sopenharmony_ci cursor = OH_Rdb_FindModifyTime(store_, "EMPLOYEE", "ROWID", values); 307e41f4b71Sopenharmony_ci ``` 308e41f4b71Sopenharmony_ci 309e41f4b71Sopenharmony_ci8. 创建分布式表。调用OH_Rdb_Execute接口创建表之后,可以将已创建的表设置成分布式表,并配置相关的分布式选项。使用该接口需要实现云服务功能。示例代码如下所示: 310e41f4b71Sopenharmony_ci 311e41f4b71Sopenharmony_ci ```c 312e41f4b71Sopenharmony_ci constexpr int TABLE_COUNT = 1; 313e41f4b71Sopenharmony_ci const char *table[TABLE_COUNT]; 314e41f4b71Sopenharmony_ci table[0] = "EMPLOYEE"; 315e41f4b71Sopenharmony_ci int errcode = OH_Rdb_SetDistributedTables(store_, table, TABLE_COUNT, Rdb_DistributedType::DISTRIBUTED_CLOUD, &config); 316e41f4b71Sopenharmony_ci ``` 317e41f4b71Sopenharmony_ci 318e41f4b71Sopenharmony_ci9. 对分布式表手动执行端云同步。调用OH_Rdb_SetDistributedTables创建分布式表之后,可以对该表进行手动端云同步。使用该接口需要实现云服务功能。示例代码如下所示: 319e41f4b71Sopenharmony_ci 320e41f4b71Sopenharmony_ci ```c 321e41f4b71Sopenharmony_ci // 定义回调函数 322e41f4b71Sopenharmony_ci void CloudSyncObserverCallback(void *context, Rdb_ProgressDetails *progressDetails) 323e41f4b71Sopenharmony_ci { 324e41f4b71Sopenharmony_ci // do something 325e41f4b71Sopenharmony_ci } 326e41f4b71Sopenharmony_ci const Rdb_ProgressObserver observer = { .context = nullptr, .callback = CloudSyncObserverCallback }; 327e41f4b71Sopenharmony_ci OH_Rdb_CloudSync(store_, Rdb_SyncMode::SYNC_MODE_TIME_FIRST, table, TABLE_COUNT, &observer); 328e41f4b71Sopenharmony_ci ``` 329e41f4b71Sopenharmony_ci 330e41f4b71Sopenharmony_ci10. 将数据观察者注册到指定的存储对象(store)上,并订阅指定类型(type)的事件。在数据发生变化时,系统会调用相应的回调函数来处理进度观察。调用OH_Rdb_Subscribe接口订阅数据变化事件。使用该接口需要实现云服务功能。示例代码如下所示: 331e41f4b71Sopenharmony_ci 332e41f4b71Sopenharmony_ci ```c 333e41f4b71Sopenharmony_ci // 定义回调函数 334e41f4b71Sopenharmony_ci void RdbSubscribeBriefCallback(void *context, const char *values[], uint32_t count) 335e41f4b71Sopenharmony_ci { 336e41f4b71Sopenharmony_ci // do something 337e41f4b71Sopenharmony_ci } 338e41f4b71Sopenharmony_ci Rdb_BriefObserver briefObserver; 339e41f4b71Sopenharmony_ci const Rdb_BriefObserver briefObserver = { .context = nullptr, .callback = RdbSubscribeBriefCallback }; 340e41f4b71Sopenharmony_ci // 订阅数据变化 341e41f4b71Sopenharmony_ci OH_Rdb_Subscribe(store_, Rdb_SubscribeType::RDB_SUBSCRIBE_TYPE_CLOUD, &briefObserver); 342e41f4b71Sopenharmony_ci ``` 343e41f4b71Sopenharmony_ci 344e41f4b71Sopenharmony_ci 调用OH_Rdb_Subscribe接口订阅本地数据库数据变更的事件。示例代码如下所示: 345e41f4b71Sopenharmony_ci 346e41f4b71Sopenharmony_ci ```c 347e41f4b71Sopenharmony_ci // 定义回调函数 348e41f4b71Sopenharmony_ci void LocalDataChangeObserverCallback1(void *context, const Rdb_ChangeInfo **changeInfo, uint32_t count) 349e41f4b71Sopenharmony_ci { 350e41f4b71Sopenharmony_ci for (uint32_t i = 0; i < count; i++) { 351e41f4b71Sopenharmony_ci EXPECT_EQ(DISTRIBUTED_CHANGE_INFO_VERSION, changeInfo[i]->version); 352e41f4b71Sopenharmony_ci // 表名为employee 353e41f4b71Sopenharmony_ci changeInfo[i]->tableName; 354e41f4b71Sopenharmony_ci changeInfo[i]->ChangeType; 355e41f4b71Sopenharmony_ci // 添加行数为1 356e41f4b71Sopenharmony_ci changeInfo[i]->inserted.count; 357e41f4b71Sopenharmony_ci // 修改行数为0 358e41f4b71Sopenharmony_ci changeInfo[i]->updated.count; 359e41f4b71Sopenharmony_ci // 删除行数为0 360e41f4b71Sopenharmony_ci changeInfo[i]->deleted.count; 361e41f4b71Sopenharmony_ci } 362e41f4b71Sopenharmony_ci } 363e41f4b71Sopenharmony_ci Rdb_DetailsObserver callback = LocalDataChangeObserverCallback1; 364e41f4b71Sopenharmony_ci Rdb_DataObserver observer = { nullptr, { callback } }; 365e41f4b71Sopenharmony_ci // 订阅本地数据库数据变更的事件 366e41f4b71Sopenharmony_ci OH_Rdb_Subscribe(store_, Rdb_SubscribeType::RDB_SUBSCRIBE_TYPE_LOCAL_DETAILS, &observer); 367e41f4b71Sopenharmony_ci 368e41f4b71Sopenharmony_ci OH_VBucket* valueBucket = OH_Rdb_CreateValuesBucket(); 369e41f4b71Sopenharmony_ci valueBucket->putText(valueBucket, "NAME", "Lisa"); 370e41f4b71Sopenharmony_ci valueBucket->putInt64(valueBucket, "AGE", 18); 371e41f4b71Sopenharmony_ci valueBucket->putReal(valueBucket, "SALARY", 100.5); 372e41f4b71Sopenharmony_ci uint8_t arr[] = {1, 2, 3, 4, 5}; 373e41f4b71Sopenharmony_ci int len = sizeof(arr) / sizeof(arr[0]); 374e41f4b71Sopenharmony_ci valueBucket->putBlob(valueBucket, "CODES", arr, len); 375e41f4b71Sopenharmony_ci // 插入数据 376e41f4b71Sopenharmony_ci int rowId = OH_Rdb_Insert(store_, "EMPLOYEE", valueBucket); 377e41f4b71Sopenharmony_ci // 销毁键值对实例 378e41f4b71Sopenharmony_ci valueBucket->destroy(valueBucket); 379e41f4b71Sopenharmony_ci ``` 380e41f4b71Sopenharmony_ci 381e41f4b71Sopenharmony_ci11. 从指定的存储对象(store)中取消对指定类型(type)的事件的订阅。取消后,系统将不再调用相应的回调函数来处理进度观察。调用OH_Rdb_Unsubscribe接口取消订阅数据变化事件。使用该接口需要实现云服务功能。示例代码如下所示: 382e41f4b71Sopenharmony_ci 383e41f4b71Sopenharmony_ci ```c 384e41f4b71Sopenharmony_ci // 定义回调函数 385e41f4b71Sopenharmony_ci void RdbSubscribeBriefCallback(void *context, const char *values[], uint32_t count) 386e41f4b71Sopenharmony_ci { 387e41f4b71Sopenharmony_ci // do something 388e41f4b71Sopenharmony_ci } 389e41f4b71Sopenharmony_ci Rdb_BriefObserver briefObserver = RdbSubscribeBriefCallback; 390e41f4b71Sopenharmony_ci const Rdb_DataObserver briefObs = { .context = nullptr, .callback.briefObserver = briefObserver }; 391e41f4b71Sopenharmony_ci // 取消订阅数据变化事件 392e41f4b71Sopenharmony_ci OH_Rdb_Unsubscribe(store_, Rdb_SubscribeType::RDB_SUBSCRIBE_TYPE_CLOUD, &briefObs); 393e41f4b71Sopenharmony_ci ``` 394e41f4b71Sopenharmony_ci 调用OH_Rdb_Unsubscribe接口取消订阅本地数据库数据变更的事件。示例代码如下所示: 395e41f4b71Sopenharmony_ci ```c 396e41f4b71Sopenharmony_ci // 定义回调函数 397e41f4b71Sopenharmony_ci void LocalDataChangeObserverCallback1(void *context, const Rdb_ChangeInfo **changeInfo, uint32_t count) 398e41f4b71Sopenharmony_ci { 399e41f4b71Sopenharmony_ci // do something 400e41f4b71Sopenharmony_ci } 401e41f4b71Sopenharmony_ci Rdb_DetailsObserver callback = LocalDataChangeObserverCallback1; 402e41f4b71Sopenharmony_ci Rdb_DataObserver observer = { nullptr, { callback } }; 403e41f4b71Sopenharmony_ci // 取消订阅本地数据库数据变更的事件 404e41f4b71Sopenharmony_ci OH_Rdb_Unsubscribe(store_, Rdb_SubscribeType::RDB_SUBSCRIBE_TYPE_LOCAL_DETAILS, &observer); 405e41f4b71Sopenharmony_ci ``` 406e41f4b71Sopenharmony_ci 407e41f4b71Sopenharmony_ci 408e41f4b71Sopenharmony_ci12. 将进度观察者注册到指定的存储对象(store)上,以便订阅自动同步进度的事件。当存储对象进行自动同步时,系统会调用相应的回调函数处理进度观察。调用OH_Rdb_SubscribeAutoSyncProgress接口订阅自动同步进度事件。使用该接口需要实现云服务功能。示例代码如下所示: 409e41f4b71Sopenharmony_ci 410e41f4b71Sopenharmony_ci ```c 411e41f4b71Sopenharmony_ci // 定义回调函数 412e41f4b71Sopenharmony_ci void RdbProgressObserverCallback(void *context, Rdb_ProgressDetails *progressDetails) 413e41f4b71Sopenharmony_ci { 414e41f4b71Sopenharmony_ci // do something 415e41f4b71Sopenharmony_ci } 416e41f4b71Sopenharmony_ci const Rdb_ProgressObserver observer = { .context = nullptr, .callback = RdbProgressObserverCallback }; 417e41f4b71Sopenharmony_ci OH_Rdb_SubscribeAutoSyncProgress(store_, &observer); 418e41f4b71Sopenharmony_ci ``` 419e41f4b71Sopenharmony_ci 420e41f4b71Sopenharmony_ci13. 从指定的存储对象(store)中取消订阅自动同步进度的事件。取消后,系统将不再调用相应的回调函数来处理进度观察。调用OH_Rdb_UnsubscribeAutoSyncProgress接口取消订阅自动同步进度事件。使用该接口需要实现云服务功能。示例代码如下所示: 421e41f4b71Sopenharmony_ci 422e41f4b71Sopenharmony_ci ```c 423e41f4b71Sopenharmony_ci // 定义回调函数 424e41f4b71Sopenharmony_ci void RdbProgressObserverCallback(void *context, Rdb_ProgressDetails *progressDetails) 425e41f4b71Sopenharmony_ci { 426e41f4b71Sopenharmony_ci // do something 427e41f4b71Sopenharmony_ci } 428e41f4b71Sopenharmony_ci const Rdb_ProgressObserver observer = { .context = nullptr, .callback = RdbProgressObserverCallback }; 429e41f4b71Sopenharmony_ci OH_Rdb_UnsubscribeAutoSyncProgress(store_, &observer); 430e41f4b71Sopenharmony_ci ``` 431e41f4b71Sopenharmony_ci 432e41f4b71Sopenharmony_ci14. 删除数据库。调用OH_Rdb_DeleteStore方法,删除数据库及数据库相关文件。示例代码如下: 433e41f4b71Sopenharmony_ci 434e41f4b71Sopenharmony_ci ```c 435e41f4b71Sopenharmony_ci // 释放数据库实例 436e41f4b71Sopenharmony_ci OH_Rdb_CloseStore(store_); 437e41f4b71Sopenharmony_ci // 删除数据库文件 438e41f4b71Sopenharmony_ci OH_Rdb_DeleteStore(&config); 439e41f4b71Sopenharmony_ci ``` 440e41f4b71Sopenharmony_ci 441e41f4b71Sopenharmony_ci 442e41f4b71Sopenharmony_ci 443e41f4b71Sopenharmony_ci 444e41f4b71Sopenharmony_ci 445e41f4b71Sopenharmony_ci 446