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打开数据库文件
正如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)
| 归档时间: |
|
| 查看次数: |
1626 次 |
| 最近记录: |