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

bps*_*ngh 2 c++ sqlite android-ndk

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

但是在使用sqlite3_open打开数据库时,我收到"无法打开数据库文件"错误.

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

String sqliteDir = getApplicationContext().getDatabasePath("MyDb").getPath();
Run Code Online (Sandbox Code Playgroud)

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));
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)

错误消息: 无法打开数据库:无法使用路径/data/data/com.packageName/databases/MyDb打开数据库文件

bps*_*ngh 5

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

String sqliteDir = getApplicationContext().getDatabasePath("MyDb").getPath();
Run Code Online (Sandbox Code Playgroud)

我得到它直到数据库:

String sqliteDir = "/data/data/" + getApplicationContext().getPackageName() + "/databases";
Run Code Online (Sandbox Code Playgroud)

现在在调用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";
Run Code Online (Sandbox Code Playgroud)

然后继续正常的代码:

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));
Run Code Online (Sandbox Code Playgroud)