Не удалось открыть файл базы данных Android NDK (Cocos2d-x)

У меня проблемы с открытием файла 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 */

И значение dbPath отображается после использования MessageBox для его отображения. Это равно:

"assets/molemioDB.sql"

Почему это происходит? Файл базы данных находится внутри файла активов в proj.android. И также в папке Data / в самом высоком каталоге на моем компьютере — хотя это для версии iOS, которая прекрасно загружает базу данных.

Несколько вещей, на которые стоит обратить внимание, — это то, что база данных явно создана с использованием написанного мной скрипта Python. Разрешения для файла molemioDB.sql — 644, хотя база данных только для чтения.

Заранее спасибо.

1

Решение

К ресурсам Android нельзя получить доступ напрямую ни в Java, ни в собственном коде. Oни не файлы в файловой системе, но сжатые данные внутри вашего APK.

Вот что вы должны сделать:

  1. Android имеет встроенную поддержку SQLite. Вместо того, чтобы включать файл базы данных в ваше приложение, позвольте вашему приложению создать базу данных в Java, используя то, что предусмотрено в android.database пакет. Это создаст обычный файл базы данных SQLite (обычно находится в data/data/your.app.package/databases/) доступно в родном коде.

  2. Если это невозможно, и вы действительно хотите использовать подход с активами, используйте AssetManager в Java для экстракт актив и создать обычный файл, доступный в собственном коде, то есть эффективно создать копию того, что содержится в активе.

Возможно, лучшая вещь в долгосрочной перспективе будет состоять в том, чтобы реструктурировать ваше приложение так, чтобы вам вообще не нужно было обрабатывать базу данных в нативном коде. Вместо этого откройте и запросите базу данных на Java (используя одно из двух решений выше) и передайте только необходимые данные в родной код. Как правило, чем больше логики приложения вы можете перейти на Java, тем лучше.

1

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector