Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
 Аватар для Fabeldyr
172 / 21 / 2
Регистрация: 11.09.2014
Сообщений: 239

Работа с базой данных под Android

23.01.2018, 16:03. Показов 2297. Ответов 8

Студворк — интернет-сервис помощи студентам
имеется программа, работающая с БД:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void Feeds::OpenDB()
{
    QString name = qApp->applicationDirPath() + QDir::separator() + "DATA.DB";
    db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(name);
    if (!db.open())
    {
        QMessageBox::critical(0, qApp->tr("Невозможно открыть базу"), qApp->tr("Невозможно создать подключение"), QMessageBox::Cancel);
        return ;
    }
 
    QSqlQuery query;
    query.exec("CREATE TABLE IF NOT EXISTS FEEDS (id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE, "
               "link varchar(100), "
               "title varchar(100), "
               "status INTEGER)");
    query.exec("CREATE TABLE IF NOT EXISTS FILTER (id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE, "
               "idFeed INTEGER,  "
               "title varchar(100), "
               "value varchar(100), "
               "status INTEGER)");
}

для переноса данного функционала в андроид сделал следующее:
скопировал файл DATA.DB из myproject в myproject/android/assets, добавил данный файл к проекту и изменил код:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
void Feeds::OpenDB()
{
#ifdef Q_OS_WIN32
    QString name = qApp->applicationDirPath() + QDir::separator() + "DATA.DB";
#endif
#ifdef Q_OS_ANDROID
    //find if database exists at user's home directory location
    QString tmpString = QStandardPaths::writableLocation(QStandardPaths::HomeLocation);
    QFileInfo databaseFileInfo(QString("%1/%2").arg(tmpString).arg("DATA.DB"));
    QString  name = databaseFileInfo.absoluteFilePath();
    if(!databaseFileInfo.exists())
    {
        bool copySuccess = QFile::copy(QString("assets:/DATA.DB"), name);
        if (!copySuccess)
        {
            QMessageBox::critical(0, QString("Error:"), QString("Could not copy database from assets to %1").arg(name), QMessageBox::Cancel);
            name.clear();
        }
    }
#endif
    db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(name);
    if (!db.open())
    {
        QMessageBox::critical(0, qApp->tr("Невозможно открыть базу"), qApp->tr("Невозможно создать подключение"), QMessageBox::Cancel);
        return ;
    }
 
    QSqlQuery query;
    query.exec("CREATE TABLE IF NOT EXISTS FEEDS (id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE, "
               "link varchar(100), "
               "title varchar(100), "
               "status INTEGER)");
    query.exec("CREATE TABLE IF NOT EXISTS FILTER (id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE, "
               "idFeed INTEGER,  "
               "title varchar(100), "
               "value varchar(100), "
               "status INTEGER)");
}

т.о. БД копируется из папки assets в куда там можно в андроиде (я так это понял) и далее мы работаем с ней
работа происходит, но только на чтение, изменения в БД не сохраняются, кроме того, если убрать копирование, БД не создаётся

это какие-то ограничения Android? в нём вообще возможна полноценная работа?
всё, что я нашёл в интернете датируется 2011-13 годами и не выглядит актуальным
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.01.2018, 16:03
Ответы с готовыми решениями:

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

Работа с базой данных в QT
Доброй ночи. Пишу проект на qt, опыта разработки приложений на этом фреймворке мало, как и опыта работы с бд. Как организовывать работу с...

Работа с базой данных по сети
Добрый день. Возникла такая проблема. Необходимо работать с базой данных по сети, через сервер. С помощью костылей организовал...

8
 Аватар для dark.k
80 / 69 / 9
Регистрация: 11.12.2009
Сообщений: 393
23.01.2018, 16:28
По идее создание базы, уже запись, странно что база не обновляется...

Точно в запросах UPDATE директиву используешь?
0
 Аватар для Fabeldyr
172 / 21 / 2
Регистрация: 11.09.2014
Сообщений: 239
23.01.2018, 16:33  [ТС]
Цитата Сообщение от dark.k Посмотреть сообщение
По идее создание базы, уже запись, странно что база не обновляется...
Точно в запросах UPDATE директиву используешь?
так в том-то и дело, что не создаётся, она копируется с компа:
C++ (Qt)
1
2
3
4
5
6
7
8
9
    if(!databaseFileInfo.exists())
    {
        bool copySuccess = QFile::copy(QString("assets:/DATA.DB"), name);
        if (!copySuccess)
        {
            QMessageBox::critical(0, QString("Error:"), QString("Could not copy database from assets to %1").arg(name), QMessageBox::Cancel);
            name.clear();
        }
    }
если этот код закомментировать, то вылезает сообщение "Невозможно создать подключение", т.е. !db.open()

в запросах Update делаю, под виндой всё работает
0
 Аватар для Fabeldyr
172 / 21 / 2
Регистрация: 11.09.2014
Сообщений: 239
25.01.2018, 16:28  [ТС]
написал
C++ (Qt)
1
2
    QString folder = QStandardPaths::writableLocation(QStandardPaths::HomeLocation);
    QString  name = folder + "/DATA.DB";
вместо
C++ (Qt)
1
2
3
    QString tmpString = QStandardPaths::writableLocation(QStandardPaths::HomeLocation);
    QFileInfo databaseFileInfo(QString("%1/%2").arg(tmpString).arg("DATA.DB"));
    QString  name = databaseFileInfo.absoluteFilePath();
теперь БД создаётся, но изменения по-прежнему не сохраняются
0
 Аватар для Fabeldyr
172 / 21 / 2
Регистрация: 11.09.2014
Сообщений: 239
10.04.2018, 10:30  [ТС]
вроде получилось, единственный минус описан в комментарии к строке кода
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
void Feeds::OpenDB()
{
#ifdef Q_OS_WIN32
    QString name = qApp->applicationDirPath() + QDir::separator() + "DATA.DB";
#endif
#ifdef Q_OS_ANDROID
 
    QString folder = QStandardPaths::writableLocation(QStandardPaths::AppDataLocation);
    QString name = folder + "/DATA.DB";
 
    QString new_name = QStandardPaths::locate(QStandardPaths::DownloadLocation, "DATA.DB", QStandardPaths::LocateFile);
 
    QFileInfo databaseFileInfo(name);
    if (databaseFileInfo.exists())
    {
        QMessageBox::critical(0, QString("Yeah:"), QString("Database exists at %1").arg(name), QMessageBox::Ok);
    }
    else
    {
        QMessageBox::critical(0, QString("Fuck:"), QString("No database").arg(name), QMessageBox::Ok);
    }
    QFileInfo newdatabaseFileInfo(new_name);
    if (newdatabaseFileInfo.exists())
    {
        QMessageBox::critical(0, QString("Attention!"), QString("New database at %1").arg(new_name), QMessageBox::Ok);
        QFile::remove(name); // удалим старую базу, иначе не скопируется
        bool copySuccess = QFile::copy(new_name, name);
        if (copySuccess)
        {
            QMessageBox::critical(0, QString("Yeah!"), "Database update success", QMessageBox::Ok);
            bool removetest = QFile::remove(new_name); // проводник Windows почему-то продолжает его видеть, но копировать и открыть не может
            if (removetest)
                QMessageBox::critical(0, QString("Yeah!"), "Success", QMessageBox::Ok);
            else
                QMessageBox::critical(0, QString("Error!"), "Suck ass", QMessageBox::Ok);
        }
        else
        {
            QMessageBox::critical(0, QString("Error!"), "Database update sucks ass", QMessageBox::Ok);
        }
    }
    else
    {
        QMessageBox::critical(0, QString("Fuck:"), QString("No new database").arg(name), QMessageBox::Ok);
    }
#endif
 
    db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName(name);
    if (!db.open())
    {
        QMessageBox::critical(0, qApp->tr("Невозможно открыть базу"), qApp->tr("Невозможно создать подключение"), QMessageBox::Cancel);
        return ;
    }
 
    QSqlQuery query;
    query.exec("CREATE TABLE IF NOT EXISTS FEEDS (id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE, "
               "link varchar(100), "
               "title varchar(100), "
               "status INTEGER)");
    query.exec("CREATE TABLE IF NOT EXISTS FILTER (id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE, "
               "idFeed INTEGER,  "
               "title varchar(100), "
               "value varchar(100), "
               "status INTEGER)");
}
0
1 / 1 / 0
Регистрация: 24.01.2018
Сообщений: 43
10.04.2018, 16:27
Вот посмотри код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
GeneralObject::GeneralObject(QObject *parent) :
    QObject(parent)
{
    QFile dbfile("./easy.db");
    if (!dbfile.exists()) {
        QFile dfile("assets:/easy.db");
        if (dfile.exists())
        {
             dfile.copy("./easy.db");
             QFile::setPermissions("./easy.db",QFile::WriteOwner | QFile::ReadOwner);
        }
    }
 
    db = QSqlDatabase::addDatabase("QSQLITE");
    db.setDatabaseName("easy.db");
    db.open();
}
 
GeneralObject::~GeneralObject()
{
 
}
 
void GeneralObject::getUsername(QString user)
{
    QSqlQuery query;
    QString uRecived;
    QString qStr = "INSERT INTO users(user, curVal, spent)"
                   "VALUES(:user, :cur, :spent)";
    query.prepare(qStr);
    query.bindValue(":user", user);
    query.bindValue(":cur", 0);
    query.bindValue(":spent", 0);
    query.exec();
    emit recieveUsername(uRecived);
}
 
void GeneralObject::userNameList()
{
    getUsers();
}
 
void GeneralObject::getUsers()
{
    QList <QSqlRecord> qRecList;
    QStringList userList;
    QSqlQuery query;
    query.prepare("SELECT * from users");
    query.exec();
    while (query.next())
    {
        qRecList.append(query.record());
        userList.append(query.record().field(1).value().toString());
    }
    count = qRecList.count();
    emit recieveCount(count);
    emit getUsersList(userList);
}
 
void GeneralObject::delUser(int id)
{
    QSqlQuery query;
    query.prepare("DELETE FROM users WHERE _id in (:id)");
    query.bindValue(":id", id);
    query.exec();
}
в папке с проектом создал папку android/assets, туба положил файл базы sqlite. на ндроиде база кудато записалась(так и не смог выловить куда, даже с разлоченным девайсом ), изменения сохраняются, но если руками в базе чтото меняешь надо перед компиляцией удалять приложение с устройства
0
 Аватар для Fabeldyr
172 / 21 / 2
Регистрация: 11.09.2014
Сообщений: 239
10.04.2018, 16:37  [ТС]
Цитата Сообщение от anatoliy26 Посмотреть сообщение
в папке с проектом создал папку android/assets, туба положил файл базы sqlite. на ндроиде база кудато записалась(так и не смог выловить куда, даже с разлоченным девайсом ), изменения сохраняются, но если руками в базе чтото меняешь надо перед компиляцией удалять приложение с устройства
этот этап я проходил, сейчас у меня всё работает корректно:
если базы на телефоне нет - она создаётся
если вносишь изменения - они сохраняются
если положить новую базу с компьютера в телефон в папку "Внутренний накопитель\Download" - она заменит имеющуюся в телефоне

т.е. именно по работе - всё супер, всё что хотелось - есть

но, почему-то, даже после удаления новой базы программой, проводник винды видит файл, как-будто он не удалился, но сделать с ним ничего не может, как-будто его нет
и это не кэш - при подключении к другому компу файл тоже "видится"
0
1 / 1 / 0
Регистрация: 24.01.2018
Сообщений: 43
10.04.2018, 17:09
попробуй задать скопированному тобой файлу разрешения на чтение.запись QFile::setPermissions() и после этого попробуй взаимодействовать с файлом
такое чувство что файл копируется без переименования
0
 Аватар для Fabeldyr
172 / 21 / 2
Регистрация: 11.09.2014
Сообщений: 239
11.04.2018, 12:57  [ТС]
Цитата Сообщение от anatoliy26 Посмотреть сообщение
такое чувство что файл копируется без переименования
так и есть
1)проверяется есть ли файл DATA.DB в папке Download
2)если есть, то файл DATA.DB, который лежит где-то непонятно, откуда программа с ним работает удаляется
3)на его место копируется файл из папки Download
4)файл из папки Download удаляется, чтобы при следующем запуске база опять не обновлялась

только вот при подключении к компу (любому) проводник (Windows) видит файл в папке Download, хотя все программные проверки говорят, что он удалён и проводник телефона тоже ничего в папке Download не видит

при этом, при попытке скопировать "удалённый" файл на комп ничего не происходит, как-будто его нет
при попытке закинуть новый файл с компа на телефон появляется вопрос "заменить?", как-будто файл есть
при попытке переименовать файл в проводнике, после нажатия "enter" он остаётся с прежним именем
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
11.04.2018, 12:57
Помогаю со студенческими работами здесь

Qt и работа с существующей базой данных
Есть Qt 4.7 есть база данных в формате *.xls. Какой менеджер баз данных лучше выбрать для работы с этой базой данных, и соответственно в...

Android связь с базой данных
делаю мессенджер и столкнулся с проблемой!!!! Я через xampp сделал в mysql БД когда я регистрацию прохожу то в базу отправляются данные ....

Синхронизация с базой данных (Android или IOs)
Значит, есть клиентская часть и серверная. Пока в раздумьях на какой ОС писать приложение. Суть заключается в том, что клиент может выбрать...

Используя функции категории Работа с базой данных в excel 2010, реализовать запрос к базе данных
Используя функции категории Работа с базой данных, реализовать запрос к базе данных: средняя закупочная цена для одного вида мороженого.

PHP и работа с базой данных (замена данных)
Добрый вечер. Начал ознакомление с бд. Создал ее + таблицу, написал добавление через форму, теперь пытаюсь написать изменение данных....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru