gpt4 book ai didi

c++ - 安卓NDK : unable to open database file using sqlite3_open

转载 作者:搜寻专家 更新时间:2023-10-31 00:36:29 25 4
gpt4 key购买 nike

我需要在 Android 中使用 ndk 从 C++ 层执行数据库操作。

但是在使用 sqlite3_open 打开数据库时,出现“无法打开数据库文件”错误。

我正在使用 Java 获取数据库路径:

String sqliteDir = getApplicationContext().getDatabasePath("MyDb").getPath();

C++代码:

int rc = sqlite3_open(dbPath, _db);
if(rc != SQLITE3_OK) LOGD("Can't open database: %s with path %s\n", KSqlite3::sqlite3_errmsg(_db), dbPath);
else LOGD(" Opened database successfully %s \n", sqlite3_errmsg(_db));

安卓.mk

LOCAL_PATH := $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE := myMod
LOCAL_SRC_FILES := myMod.cpp sqlite3.c
LOCAL_LDLIBS := -llog
#Includes various C++ libraries
include $(BUILD_SHARED_LIBRARY)

错误信息:无法打开数据库:无法打开路径为/data/data/com.packageName/databases/MyDb 的数据库文件

最佳答案

正如 Seva Alekseyev 所建议的,问题是我错误地认为 sqlite3_open 将创建整个路径,如果它不存在但它不存在。所以我需要手动创建/databases。而不是像这样获取数据库目录:

String sqliteDir = getApplicationContext().getDatabasePath("MyDb").getPath();

我得到它直到数据库:

String sqliteDir = "/data/data/" + getApplicationContext().getPackageName() + "/databases";

现在在调用 sqlite3_open 之前的 cpp 代码中,检查它是否存在。

struct stat sb;
int32_t res = stat(path, &sb);
if (0 == res && (sb.st_mode & S_IFDIR)){
LOGD("Database already exists in path:%s", path);
}else{
LOGD("Creating database path:%s", path);
int status = mkdir(path, S_IRWXU | S_IRWXG | S_IWOTH | S_IXOTH);
if(status != 0){
LOGD("Error occurred while creating database path : %s", path);
return;
}
}
string dbPath = string(path) + "//MyDb";

然后继续正常的代码:

int rc = sqlite3_open(dbPath, _db);
if(rc != SQLITE3_OK) LOGD("Can't open database: %s with path %s\n", KSqlite3::sqlite3_errmsg(_db), dbPath);
else LOGD(" Opened database successfully %s \n", sqlite3_errmsg(_db));

关于c++ - 安卓NDK : unable to open database file using sqlite3_open,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21704813/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com