无法打开数据库文件Android NDK (Cocos2d-x)
Failure to open database file Android NDK (Cocos2d-x)
通过将目录传递给sqlite3_open()来打开sqlite3文件。
通过记录结果和dbPath的值,可以看出sqlite确实尝试了,并且已经找到了文件。我不确定的是dbPath的格式是否正确。
下面的代码返回false,作为result != SQLITE_OK,它等于SQLITE_CANTOPEN。
//load from the Data/ directory (or assets/ if android)
std::string dbPath = CCFileUtils::getInstance()->fullPathForFilename("molemioDB.sql");
result = sqlite3_open(dbPath.c_str(),&pDB);
//failed to open database?
if (result != SQLITE_OK){
CCLOG("ERROR: Failed to open database: %i", result);
return false;
}
Result的值为14,from sqlite3.h:
#define SQLITE_CANTOPEN 14 /* Unable to open the database file */
dbPath的值在使用MessageBox显示后显示。它等于:
"assets/molemioDB.sql"
为什么会发生这种情况?数据库文件位于project .android的资产文件中。而且,也在我电脑最高目录下的Data/文件夹中——尽管这是针对iOS版本的,它可以很好地加载数据库。
需要注意的几件事是,数据库显然是预先创建的,使用我编写的python脚本。molemioDB的权限。SQL文件是644,虽然数据库只被读取。
Android资源不能直接访问,无论是在Java中还是在本机代码中。它们不是文件系统上的文件,而是APK内部的压缩数据。
你应该这样做:
-
Android内置SQLite支持。而不是在你的应用程序中包含一个数据库文件,让你的应用程序在Java中创建数据库,使用android中提供的。数据库包。这将创建一个可在本机代码中访问的常规SQLite数据库文件(通常在
data/data/your.app.package/databases/
中找到)。 -
如果这是不可行的,你真的想去与资产的方法,使用
AssetManager
在Java 提取资产和创建一个常规文件可访问的本地代码,即有效地创建什么包含在资产的副本。
相关文章:
- 如何使用ndk-build.cmd构建Android.so文件
- Android NDK传感器向事件队列报告奇怪的间隔
- Android NDK 编译 LAME HAVE_MPGLIB > 'interface.h' 文件未找到
- NDK:如何通过ndkr15c包含"RefBase.h"?
- Android NDK clang 编译器错误在 Windows 上显示'No such file or directory'
- 为什么使用 NDK 不能存在不同的 stl 实现?
- 在 constexpr 构造函数 (c++17) 中赋值到 const char * 在使用 Android NDK 时
- 如何在 android ndk 上链接 C 和 C++ 代码,以及 C 和 C++ 运行时库(包括 STL)?
- Android NDK 未定义对ASensorEventQueue_registerSensor的引用
- 如何将 libjpeg-turbo Android NDK 添加为静态库
- 在 Flutter 应用程序中使用 Android NDK 中的 AssetManager 类
- Android NDK - 无法在 Visual Studio 2017 中调试
- 对于哪些 ABI,我可以使用 NDK v10e 构建 apk?
- -fno-unwind-tables 和 -fno-async-unwind-tables 不起作用 NDK clang
- 不再支持Android NDK APP_STL gnustl_shared
- 我在 ndk 中构建文件时遇到错误 android.mk
- Android NDK:用于第三方Java库的静态或共享C++运行时
- 为 Android NDK 编译库
- 将预编译的 C 共享库与 JNI/NDK 结合使用
- 无法打开数据库文件Android NDK (Cocos2d-x)