29 июля 2019 г. 3:41

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

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

Возврат 10% от суммы заказа отеля на Booking
Возврат 10% от суммы заказа отеля на Booking
Предлагаем ссылку с 10% возвратом от суммы заказа при бронировании отеля через Booking
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 г. 7: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);
}

Комментарии

Только авторизованные пользователи могут публиковать комментарии.
Пожалуйста, авторизуйтесь или зарегистрируйтесь
D
16 августа 2019 г. 11:58
Damir

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

  • Результат:92баллов,
  • Очки рейтинга8
D
16 августа 2019 г. 11:46
Damir

C++ - Тест 005. Структуры и Классы

  • Результат:75баллов,
  • Очки рейтинга2
u
14 августа 2019 г. 13:55
unrealproro

C++ - Тест 005. Структуры и Классы

  • Результат:83баллов,
  • Очки рейтинга4
Последние комментарии
19 августа 2019 г. 6:41
Андрей Янкович

это проблема дистрибутива, попробуйте установить через пакетный менеджер snap Суть проблемы: libQt5Core которая лежит в дистрибутиве требует версию glibc >= 2.25 у вас видимо …
b
18 августа 2019 г. 5:09
bbb116

cqtdeployer /home/aleks/CQtDeployer/bin/cqtdeployer: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.25' not found (required by /home/aleks/CQtDeployer/lib/libQt5Core.so.5) linux mint …
D
17 августа 2019 г. 8:04
Damir

github ChekableTView Правой групповая смена значения при перетаскивании левой как обычно.
Сейчас обсуждают на форуме
20 августа 2019 г. 12:37
Александр Панюшкин

Добрый день. Я бы хотел добавить, что в вашем коде можно было бы использовать слово auto и цикл for с перебором. Так код получился бы компактнее: auto map = new QMap<Qstring, QString&…
20 августа 2019 г. 12:17
Евгений Легоцкой

Добрый день. Вы делаете некорректную попытку создать исключение. Исключения генерируются кодом, то есть любое исключение, которое вы перехватываете, всегда генерируется оператором th…
20 августа 2019 г. 8:04
IscanderChe

Ещё раз здравствуйте. Собираю Qt-проект с помощью CMake. Применяю к полученному exe-файлу windeployqt. В результате подцепляются почему-то dll-ки, оканчивающиеся в наименованиях на "d": Qt…
20 августа 2019 г. 7:46
IscanderChe

Да, с таргетом тоже работает. Спасибо!
Ищу работу?
14,000.00 руб. - 40,000.00 руб.
Разработчик Qt
Annino, Moscow Oblast, Russia
5,000.00 руб. - 15,000.00 руб.
Дизайнер
Moskovskiy, Moscow, Russia
25,000.00 руб. - 30,000.00 руб.
Разработчик Qt/C++
Barnaul, Altai Krai, Russia

Для зарегистрированных пользователей на сайте присутствует минимальное количество рекламы

EVILEG
О нас
Услуги
© EVILEG 2015-2019
Рекомендует хостинг TIMEWEB