У меня проблемы с открытием файла 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, хотя база данных только для чтения.
Заранее спасибо.
К ресурсам Android нельзя получить доступ напрямую ни в Java, ни в собственном коде. Oни не файлы в файловой системе, но сжатые данные внутри вашего APK.
Вот что вы должны сделать:
Android имеет встроенную поддержку SQLite. Вместо того, чтобы включать файл базы данных в ваше приложение, позвольте вашему приложению создать базу данных в Java, используя то, что предусмотрено в android.database пакет. Это создаст обычный файл базы данных SQLite (обычно находится в data/data/your.app.package/databases/
) доступно в родном коде.
Если это невозможно, и вы действительно хотите использовать подход с активами, используйте AssetManager
в Java для экстракт актив и создать обычный файл, доступный в собственном коде, то есть эффективно создать копию того, что содержится в активе.
Возможно, лучшая вещь в долгосрочной перспективе будет состоять в том, чтобы реструктурировать ваше приложение так, чтобы вам вообще не нужно было обрабатывать базу данных в нативном коде. Вместо этого откройте и запросите базу данных на Java (используя одно из двух решений выше) и передайте только необходимые данные в родной код. Как правило, чем больше логики приложения вы можете перейти на Java, тем лучше.