29 июля 2019 г. 4:41

Как в Qt записать базу в Android

Добрый день.
Как в Qt записать базу SQLite в Android?
Если просто копирую из ресурсов, то эту базу нельзя менять.
Если создаю через код, то не могу ее открыть (на виндовс работает).

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.
9

Добрый день.

Проблема скорее всего таже самая, что и с правами доступа при скачивании файла. Попробуйте устанавливать права на чтение и запись.

Не помогает, беда в чем то другом.

Вы используете QStandardPaths для создания базы данных? Или просто по какому-то пути? Нужно через QStandardPaths выбирать местоположение базы данных для создания.

Я делал так, создавал по определенному адресу (папка расположения + имя файла).
А как использовать для этого QStandardPaths ?

void AppCore::copyDbInFolder()
{
    requestAndroidPermissions();
    dbAdress = getDirApp() + "/dataBase.db";
    //dbAdress.replace("/","\\");
    if( ! QFile::exists(dbAdress))
    {
        //QFile::copy(":/dataBase/dataBase.db", dbAdress); //:/icons/close.png
        QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");//not dbConnection
        db.setDatabaseName(dbAdress);
        db.open();
        QSqlQuery query;
        query.exec("CREATE TABLE downloadTable ("
                   "id       INTEGER PRIMARY KEY "
                                    "NOT NULL,"
                  " nameFile TEXT,"
                   "fileUrl  TEXT"
               ");"
        );
        query.exec(" CREATE TABLE historyTable ("
                      " id       INTEGER PRIMARY KEY"
                                       " NOT NULL,"
                       "url      TEXT,"
                       "nameSite TEXT"
                   ");"
        );
        query.exec("CREATE TABLE openTabTable ("
                   "id       INTEGER NOT NULL"
                                   " PRIMARY KEY AUTOINCREMENT,"
                   "url      TEXT,"
                   "nameSite TEXT,"
                   "screen   TEXT"
               ");"
        );
    }
    //QFile f1(dbAdress);
    //f1.setPermissions(QFileDevice::WriteUser);
}
dbAdress  = QStandardPaths::standardLocations(QStandardPaths::DataLocation) + QDir::separator() + "dataBase.db"

Странно, если делаю так, то компилируется, правда этот файл тоже менять не могу

dbAdress = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation).append("/myDataBaseForBrowser.db");

А Ваш вариант не могу присвоить, т.к. тут QString и QChar

Какого типа dbAdress? Это QString? Мой вариант с QDir::separator() явдяется классическим примером из документации Qt. Если dbAdress - это QString, то должно работать.

Если только у вас там нет каких-то настроек, которые отключают автоматическиое преобразование строк. У Qt есть такое, но я сомневаюсь, что причина в этом.

Также пробуйте исправить права доступа к файлу через QFile::setPermissions

dbAdress это QString.
С QFile::setPermissions тоже пробовал.
Сейча попробовал один раз програмно удалить старую базу, после этого программа больше не может копировать базу, хотя строчки удаления я закаментировал, сделал qmake и удалил билды.
Скажите пожалуйста, почему так и как это исправить?

  • 29 июля 2019 г. 8:20
  • Ответ был помечен как решение.
void AppCore::copyDbInFolder()
{
    requestAndroidPermissions();
    //dbAdress = getDirApp() + "/dataBase.db";
    dbAdress = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation).append("/myDataBaseForBrowser.db");
    //dbAdress = QStandardPaths::standardLocations(QStandardPaths::DataLocation) + QDir::separator() + "dataBase.db"
    //dbAdress =  QStandardPaths::standardLocations(QStandardPaths::AppDataLocation).append("/myDataBaseForBrowser.db");
    //QFile f2(dbAdress);
    //if (f2.remove()) {"remuve file";} else {"dont remove file";};
    //dbAdress.replace("/","\\");
    if( ! QFile::exists(dbAdress))
    {
        qDebug()<<"файл с базой не существует";
        /*QFile::copy(":/dataBase/dataBase.db", dbAdress); //:/icons/close.png
        QFile f1(dbAdress);
        f1.setPermissions(QFileDevice::WriteUser);*/
        QFile *db1 = new QFile(dbAdress);
        if(db1->open(QFile::WriteOnly)){
        QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");//not dbConnection
        db.setDatabaseName(dbAdress);
        db.open();
        QSqlQuery query;
        query.exec("CREATE TABLE downloadTable ("
                   "id       INTEGER PRIMARY KEY "
                                    "NOT NULL,"
                  " nameFile TEXT,"
                   "fileUrl  TEXT"
               ");"
        );
        query.exec(" CREATE TABLE historyTable ("
                      " id       INTEGER PRIMARY KEY"
                                       " NOT NULL,"
                       "url      TEXT,"
                       "nameSite TEXT"
                   ");"
        );
        query.exec("CREATE TABLE openTabTable ("
                   "id       INTEGER NOT NULL"
                                   " PRIMARY KEY AUTOINCREMENT,"
                   "url      TEXT,"
                   "nameSite TEXT,"
                   "screen   TEXT"
               ");"
        );
        db.commit();
        db.close();
}
    }
    else {
        qDebug()<<"файл с базой уже существует";
    }
    if(QFile::exists(dbAdress)){qDebug()<<"файл с базой записался";} else {qDebug()<<"файл с базой не записался";}
    //QFile f1(dbAdress);
    //f1.setPermissions(QFileDevice::WriteUser);
}

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
Donate

Здравствуйте, уважаемые пользователи EVILEG !!!

Если сайт вам помог, то поддержите разработку сайта финансово, пожалуйста.

Вы можете сделать это следующими способами:

Спасибо, Евгений Легоцкой

AS
13 декабря 2019 г. 6:05
Aruzhan Seraliyeva

C++ - Тест 003. Условия и циклы

  • Результат:50баллов,
  • Очки рейтинга-4
AS
13 декабря 2019 г. 5:47
Aruzhan Seraliyeva

C++ - Тест 001. Первая программа и типы данных

  • Результат:40баллов,
  • Очки рейтинга-8
Т
11 декабря 2019 г. 16:56
Тома

C++ - Тест 003. Условия и циклы

  • Результат:50баллов,
  • Очки рейтинга-4
Последние комментарии
9 декабря 2019 г. 3:41
Евгений Легоцкой

Эта ошибка invalid use of incomplete type ‘class Ui::AnotherWindow’ обычно говорит о том, что не найдено определение класса или структуры. Типичная проблема - не подключён заголовочны…
НБ
9 декабря 2019 г. 3:36
Николай Батманов

Ну, не настолько со мной всё полхо...))) Вроде бы. Я ж кнопки отрисовываю.
9 декабря 2019 г. 3:14
Евгений Легоцкой

Добрый день. У вас ui файлов по ходу нет. UI файлы используются для вёрстки в графическом дизайнере.
НБ
9 декабря 2019 г. 3:05
Николай Батманов

Здравствуйте! Полностью скопировал ваш пример к себе, чтобы разобраться. А он не хочет запускаться, дает ошибку: invalid use of incomplete type ‘class Ui::AnotherWindow’ ui(new Ui…
8 декабря 2019 г. 7:23
Евгений Легоцкой

У меня здесь есть одна старая статья с примером векторного редактора. Там есть ответы на ваши вопросы. Поизучайте Qt/C++ - Урок 072. Пример векторного редактора на Qt QGraphicsItem, QG…
Сейчас обсуждают на форуме
t
13 декабря 2019 г. 17:17
tantrido

Всё работает, при чём тут колхоз?! ;) https://doc.qt.io/qt-5/qtqml-cppintegration-data.html Если что-то не работает - вопрос к собственным рукам и знаниям. Вопрос не корректен - мож…
13 декабря 2019 г. 10:16
Руслан Волшебник

Да, я посмотрел, вы абсолютно правы. Единственное, если я правильно понял, если срабатывает условие if (aggregates["max_id"] - aggregates["min_id"]) + 1 == aggregates["count"]: return sel…
t
13 декабря 2019 г. 9:53
tantrido

Ответ >>
13 декабря 2019 г. 8:39
Александр Панюшкин

Вроде да. Только там начинаются вопросы с тем, чтобы виджет бы в фокусе, чтобы до виджета это событие долетало.
ДК
13 декабря 2019 г. 7:48
Джон Кофи

Привет. Есть класс "ждун", который используется на разных виджетах: class WaiterDialog;#define WAITER_DIALOG Singleton<WaiterDialog>::instance()class WaiterDialog : public QObject, …
EVILEG
О нас
Услуги
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB