Android NDK:无法使用sqlite3_open打开数据库文件

Android NDK: unable to open database file using sqlite3_open

本文关键字:open 文件 数据库 sqlite3 NDK Android      更新时间:2023-10-16

我需要在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 %sn", KSqlite3::sqlite3_errmsg(_db), dbPath);
else LOGD(" Opened database successfully %s n", sqlite3_errmsg(_db));

Android.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不存在,它将创建整个路径,但它不存在。所以我需要手动创建/数据库。而不是像这样获取数据库目录:

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 %sn", KSqlite3::sqlite3_errmsg(_db), dbPath);
else LOGD(" Opened database successfully %s n", sqlite3_errmsg(_db));
相关文章: