我无法通过将sqlite3文件的目录传递到sqlite3_open()来打开它。
通过记录结果和dbPath的值,可以看出sqlite确实尝试了该操作,并且已找到该文件。我不确定的是dbPath的格式是否正确。
以下代码返回false,结果为!= 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;
}
结果的值为14,来自sqlite3.h:
#define SQLITE_CANTOPEN 14 /* Unable to open the database file */
使用MessageBox显示dbPath的值后,将显示它。它等于:
"assets/molemioDB.sql"
为什么会这样?该数据库文件位于proj.android中的资产文件中。并且,也位于我计算机上最高目录的Data /文件夹中-尽管这是针对iOS版本的,它可以很好地加载数据库。
需要注意的几件事是,数据库显然是使用我编写的python脚本预先创建的。尽管仅读取数据库,molemioDB.sql文件的权限为644。
提前致谢。
最佳答案
无法使用Java或本机代码直接访问Android资产。它们不是文件系统上的文件,而是APK内部的压缩数据。
这是您应该做的:
data/data/your.app.package/databases/
中找到)。 AssetManager
来提取资产并创建可通过本机代码访问的常规文件,即有效地创建资产中包含内容的副本。 从长远来看,也许最好的办法是重组应用程序,以使您根本不需要使用本机代码来处理数据库。相反,请使用Java(使用上述两种解决方案之一)打开并查询数据库,并将仅必要的数据传递给本机代码。通常,可以转移到Java的应用程序逻辑越多越好。