Как прочитать существующую базу данных SQLite в Android, используя Qt? - PullRequest
0 голосов
/ 20 апреля 2020

Я разрабатывал приложение на 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 база данных работает?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...