无法打开数据库文件Android NDK (Cocos2d-x)

Failure to open database file Android NDK (Cocos2d-x)

本文关键字:NDK Cocos2d-x Android 文件 数据库      更新时间:2023-10-16

通过将目录传递给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内部的压缩数据。

你应该这样做:

  1. Android内置SQLite支持。而不是在你的应用程序中包含一个数据库文件,让你的应用程序在Java中创建数据库,使用android中提供的。数据库包。这将创建一个可在本机代码中访问的常规SQLite数据库文件(通常在data/data/your.app.package/databases/中找到)。

  2. 如果这是不可行的,你真的想去与资产的方法,使用AssetManager在Java 提取资产和创建一个常规文件可访问的本地代码,即有效地创建什么包含在资产的副本。

也许从长远来看,最好的事情是重构你的应用程序,这样你就不需要用本地代码处理数据库了。相反,应该在Java中打开并查询数据库(使用上述两种解决方案之一),并仅将必要的数据传递给本机代码。通常,您可以将更多的应用程序逻辑转移到Java中,效果越好。