【问题标题】:Android NDK: unable to open database file using sqlite3_openAndroid NDK:无法使用 sqlite3_open 打开数据库文件
【发布时间】:2014-03-09 09:55:54
【问题描述】:

我需要在 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));

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的数据库文件

【问题讨论】:

  • 路径真的缺少初始的/吗?
  • RSSFeed 是从哪里来的?
  • 已编辑正确的错误消息
  • 检查com.packageName/databases/ 是否存在。如果它不存在,我认为getDatabasePath() 不会创建它。
  • 是的,这是唯一的问题。谢谢!!!

标签: c++ sqlite android-ndk


【解决方案1】:

正如 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));

【讨论】:

  • 你好。我有类似的问题。我需要在 android 应用程序中用 c 打开 DB。我正在开发 .so 库。如何使用 natvie c 层中的库获取应用程序的包名?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多