Android NDK:无法使用sqlite3_open打开数据库文件
Android NDK: unable to open database file using sqlite3_open
我需要在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));
相关文章:
- C++:std::ofstream 方法 open() 在第二次迭代时擦除打开的 ifstream 文件
- 从生成文件编译错误:"Unable to open output file" ..."No such file or directory"
- 我可以对"int 文件 = open(path, flag);"做点什么吗?
- 进口。TLB文件给出"cannot open source file x.tlh"
- Open() 用于创建文件和打开现有文件.有人能分辨出其中的区别
- 成功使用CMakeLists制作后如何修复"open: No such file or directory"错误(该文件实际上存在)
- 为什么打开许多文件时"open file failed"?
- 已安装 SDK 的头文件的"Cannot open source file"
- 如何使用 C/C++检查 ZIP 文件(Office Open XML 文件)的完整性
- 读取视频文件"Open CV WARNING: Couldn't read movie file bird.avi"时出现问题
- C++ 中的文件处理错误 - 调用"std::basic_fstream<char, std::char_traits<char> >::open(const char[8],
- open() 的参数:每个人都应该拥有对文件的所有访问权限,并且应该在创建时被截断
- 包括新文件夹中的头文件 "cannot open include file - no such file or directory"
- 系统调用 open() 创建可执行文件
- 使用ofstream或fstream-open不会出错,也不会打开文件
- Qt/QML:如何在不重新启动应用程序的情况下"switch to"或"open"另一个 QML 文件?
- Qt:如何通过外部程序打开文件,"open with..."对话框
- 文件打开时"QIODevice::write: device not open"
- "Error C1083: Cannot open include file"但我有包含文件的路径
- C++Open文件在运行后似乎破坏了文件