我无法通过将sqlite3文件的目录传递到sqlite3_open()来打开它。

通过记录结果和db​​Path的值,可以看出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内部的压缩数据。

这是您应该做的:

  • Android内置了对SQLite的支持。 不是在应用程序中包含数据库文件,而是让您的应用程序使用android.database包中提供的内容在Java中创建数据库。这将创建一个本机代码可访问的常规SQLite数据库文件(通常在data/data/your.app.package/databases/中找到)。
  • 如果这不可行,并且您真的想使用资产方法,请在Java中使用 AssetManager 提取资产并创建可通过本机代码访问的常规文件,即有效地创建资产中包含内容的副本。

  • 从长远来看,也许最好的办法是重组应用程序,以使您根本不需要使用本机代码来处理数据库。相反,请使用Java(使用上述两种解决方案之一)打开并查询数据库,并将仅必要的数据传递给本机代码。通常,可以转移到Java的应用程序逻辑越多越好。

    09-26 17:59
    查看更多