HarmonyOS rdbstore 在 c++ 层开多线程进行事务操作具体有什么限制?
如题,在 worker 里面 beginTransation 会有异常,执行失败,但用 c 层开启了子线程查询并没有出现异常,测试代码如下
// 创建数据库 config 对象
static napi_value OpenDB(napi_env env, napi_callback_info info)
{
size_t argc = 1;
napi_value argv[1] = {nullptr};
napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr);
// 获取函数argv[1],此为为rawfile相对路径
size_t strSize;
char strBuf[256];
napi_get_value_string_utf8(env, argv[0], strBuf, sizeof(strBuf), &strSize);
std::string dirName(strBuf, strSize);
std::cout << "dir is" << dirName << std::endl;
const char* your_dataBaseDir = dirName.c_str();
const char* your_storeName = "RdbTest.db";
const char* your_bundleName = "com.example.ndk";
const char* your_moduleName = "entry";
bool your_isEncrypt = false; // 或者true,根据你的需求
int your_securityLevel = OH_Rdb_SecurityLevel::S1; // 根据你的需求设置
int your_area = RDB_SECURITY_AREA_EL1; // 根据你的需求设置
OH_Rdb_Config oh_rdb_config = {
.selfSize = sizeof(OH_Rdb_Config),
.dataBaseDir = your_dataBaseDir,
.storeName = your_storeName,
.bundleName = your_bundleName,
.moduleName = your_moduleName,
.isEncrypt = your_isEncrypt,
.securityLevel = your_securityLevel,
.area = your_area
};
int errCode = 0;
// 获取获取OH_Rdb_Store实例
OH_Rdb_Store *store_ = OH_Rdb_GetOrOpen(&oh_rdb_config, &errCode);
char createTableSql[] = "CREATE TABLE IF NOT EXISTS EMPLOYEE (ID INTEGER PRIMARY KEY AUTOINCREMENT, NAME TEXT NOT NULL, "
"AGE INTEGER, SALARY REAL, CODES BLOB)";
// 执行建表语句
OH_Rdb_Execute(store_, createTableSql);
// 创建键值对实例
OH_VBucket *valueBucket = OH_Rdb_CreateValuesBucket();
valueBucket->putText(valueBucket, "NAME", "Lisa");
valueBucket->putInt64(valueBucket, "AGE", 188);
valueBucket->putReal(valueBucket, "SALARY", 100.5);
uint8_t arr[] = {1, 2, 3, 4, 5};
int len = sizeof(arr) / sizeof(arr[0]);
valueBucket->putBlob(valueBucket, "CODES", arr, len);
// 插入数据
int rowId = OH_Rdb_Insert(store_, "EMPLOYEE", valueBucket);
// 开启线程开启事务查询
std::thread mythread([=]() {
int64_t age;
int transactionId = OH_Rdb_BeginTransaction (store_);
OH_Predicates *predicates = OH_Rdb_CreatePredicates("EMPLOYEE");
const char *columnNames[] = {"NAME", "AGE"};
int len = sizeof(columnNames) / sizeof(columnNames[0]);
OH_Cursor *cursor = OH_Rdb_Query(store_, predicates, columnNames, len);
int columnCount = 0;
cursor->getColumnCount(cursor, &columnCount);
// OH_Cursor是一个数据集合的游标,默认指向第-1个记录,有效的数据从0开始
while (cursor->goToNextRow(cursor) == OH_Rdb_ErrCode::RDB_OK) {
cursor->getInt64(cursor, 1, &age);
}
OH_Rdb_Commit (store_);
// 释放谓词实例
predicates->destroy(predicates);
// 释放结果集
cursor->destroy(cursor);
});
mythread.detach();
// 销毁键值对实例
valueBucket->destroy(valueBucket);
napi_value num;
napi_create_double(env, rowId, &num);
return num;
}
HarmonyOS
赞
收藏 0
回答 1
待解决
相关问题
HarmonyOS commonEventManager 在C++层有接口吗?
1141浏览 • 1回复 待解决
HarmonyOS 多线程写法限制
1040浏览 • 1回复 待解决
将C++层分配的对象在ArkTS层管理,ArkTS层通过接口访问C++层对象业务
2017浏览 • 1回复 待解决
HarmonyOS 在C++中提示一个错误,说组件无法在多线程中调用
1056浏览 • 1回复 待解决
HarmonyOS C++子线程调用ArkTS业务层接口方法
1267浏览 • 1回复 待解决
HarmonyOS ets层传递Array<string>到C++层,C++层如何获取数组内容
1293浏览 • 1回复 待解决
在多线程的场景下EGL同时操作一块buffer进行绘制
1336浏览 • 1回复 待解决
应用有少量C++代码,C++代码如何进行适配?
1407浏览 • 1回复 待解决
HarmonyOS C++异步操作
1334浏览 • 1回复 待解决
是否支持应用层开发在c层自己开启线程操作文件
2638浏览 • 1回复 待解决
HarmonyOS 数据库多线程操作
1220浏览 • 1回复 待解决
HarmonyOS 在native侧开发,c++多线程开发中,子线程中如何丢一个任务到主线程中执行
879浏览 • 1回复 待解决
在HarmonyOS NEXT中,如何进行多线程通信?
541浏览 • 0回复 待解决
HarmonyOS ETS和c++层通信
1244浏览 • 1回复 待解决
在ArkTS层往C++层注册一个object或function,C++层可以按需往这个回调上进行扔消息同步到上层应用么?
2772浏览 • 1回复 待解决
HarmonyOS native C++ 层传递buffer 到ArkTS 层
1572浏览 • 1回复 待解决
ArkTS层通过接口访问C++层对象
1454浏览 • 1回复 待解决
HarmonyOS在C++线程上调用napi_create_ark_runtime,如何调用到js层的对象
1656浏览 • 1回复 待解决
HarmonyOS 从C++层触发通知到ArkTS层
1356浏览 • 1回复 待解决
ts给c++传递数组,c++层如何解析
3089浏览 • 1回复 待解决
HarmonyOS 是否有C++ native层读取音频文件并在上层进行播放的例子
861浏览 • 1回复 待解决
EGL绘制是否支持多线程?如何在多线程的场景下同时操作一块buffer进行图形绘制
2968浏览 • 1回复 待解决
HarmonyOS可以在Native层用C代码创建线程吗?
3087浏览 • 1回复 待解决
#鸿蒙通关秘籍# 如何使用AKI实现C++跨线程调用JS函数,并进行加10操作?
888浏览 • 0回复 待解决
c/c++层主动调用ArkTS存在问题
1927浏览 • 1回复 待解决
目前不能并发操作事务,开启事务和提交事务要在同一个线程中,并且此时另一个线程不能并发的再去开启事务和提交事务。