Я разрабатывал приложение на Qt для Ubuntu, которое работает с базой данных SQLite и несколькими ГБ файлов. В Ubuntu и Windows все работает хорошо, но ... когда я пытаюсь портировать на Android, у меня возникают некоторые проблемы. Я поместил файл database.db и другие файлы на SD-карту, установил его на целевое устройство и, наконец, смог «найти» его с помощью следующего кода:
QString dbName;
#ifdef Q_OS_ANDROID
QAndroidJniObject androidContext = QtAndroid::androidContext();
QAndroidJniObject dir = QAndroidJniObject::fromString(QString(""));
QAndroidJniObject path = androidContext.callObjectMethod("getExternalFilesDir",
"(Ljava/lang/String;)Ljava/io/File;",
dir.object());
// qInfo() << "Path: " + path.toString();
dbName = path.toString()+"/database.db";
#else
QSettings *sp = new QSettings();
dbName = sp->value( "dbName", "/database.db" ).toString();
sp->deleteLater();
#endif
qDebug( "Database::Database(%s)", qPrintable( dbName ) );
const QString DRIVER("QSQLITE");
if ( !QSqlDatabase::isDriverAvailable(DRIVER) )
{ qDebug( "QSqlDatabase::isDriverAvailable(%s) is false", qPrintable(DRIVER) ); }
else
{ db = QSqlDatabase::addDatabase(DRIVER);
db.setDatabaseName( dbName );
QSqlDriver *driver = QSqlDatabase::database().driver();
if ( !db.open() )
{ qDebug( "Error opening database %s: %s", qPrintable( dbName ), qPrintable( db.lastError().text() ) );
}
else
{ qDebug( "Database opened." );
}
}
Итак, наконец используя JNI для отслеживания папки на SD-карте, я получаю базу данных, чтобы сообщить, что она успешно открыта. Однако теперь, когда я пытаюсь прочитать мою первую таблицу, у меня возникает ошибка запроса query c () в Android (такого не происходит в Linux / Windows):
QSqlQuery query(db);
query.prepare( "SELECT time FROM history ORDER BY time DESC;" );
if ( !query.exec() ) { qDebug( "ERROR: %s, %s", qPrintable( query.lastError().text() ), qPrintable( query.executedQuery() ) ); return; }
это возвращает:
D MyApp: ОШИБКА: нет запроса Невозможно извлечь строку, ВЫБРАТЬ время из истории, ЗАКАЗАТЬ по времени DESC;
в Android, но работает в других ОС. Все последующие попытки чтения из базы данных также терпят неудачу в Android. MyApp - это консольное приложение, в итоге я хочу запустить его как сервис, но прежде чем сделать этот скачок, я бы хотел увидеть, как оно работает в «простом режиме». Вывод приложения выдает пару предупреждений (помеченных буквой W) перед запуском программы, но кажется, что они не подключены?
I zygote : Late-enabling -Xcheck:jni
W System : ClassLoader referenced unknown path:
I Qt : qt started
I zygote : Do partial code cache collection, code=26KB, data=23KB
I zygote : After code cache collection, code=26KB, data=23KB
I zygote : Increasing code cache capacity to 128KB
I zygote : Do partial code cache collection, code=62KB, data=55KB
I zygote : After code cache collection, code=62KB, data=55KB
I zygote : Increasing code cache capacity to 256KB
D OpenGLRenderer: HWUI GL Pipeline
I Adreno : QUALCOMM build : 94aeef9, Ie8d0be8cd4
I Adreno : Build Date : 11/09/17
I Adreno : OpenGL ES Shader Compiler Version: EV031.22.00.01
I Adreno : Local Branch :
I Adreno : Remote Branch :
I Adreno : Remote Branch :
I Adreno : Reconstruct Branch :
W RenderThread: type=1400 audit(0.0:2413): avc: denied { search } for name="proc" dev="debugfs" ino=12448 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:object_r:qti_debugfs:s0 tclass=dir permissive=0
I Adreno : PFP: 0x005ff087, ME: 0x005ff063
I OpenGLRenderer: Initialized EGL, version 1.4
D OpenGLRenderer: Swap behavior 2
I zygote : Do full code cache collection, code=112KB, data=112KB
I zygote : After code cache collection, code=110KB, data=100KB
D MyApp: Database::Database(/storage/emulated/0/Android/data/com.mangocats.myapp/files/database.db)
D MyApp: Database opened.
D MyApp: ERROR: No query Unable to fetch row, SELECT time FROM history ORDER BY time DESC;
Это с последней стабильной Android Studio, загруженной и настроенной вчера, JDK 1.8, последняя версия Qt Creator, загруженная и установленная вчера, работающая на Ubuntu 18.04, Qt 5.14.2, предназначенная для телефона Android 8.0. Примеры приложений Qt и простых GUI приложений, которые я успешно запустил на телефоне, и сторона консоли консольного приложения на http-сервере работает, как и ожидалось. Я дал приложению разрешения на ЧТЕНИЕ и ЗАПИСЬ ВНЕШНЕГО ХРАНЕНИЯ (хотя многие заметки указывают, что они не нужны для этих версий ...)
Что еще нужно сделать для Android, чтобы получить SQLite база данных работает?