Russian Qt Forum
Ноябрь 23, 2024, 22:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Данные неправильно записываются в базу  (Прочитано 5154 раз)
bibelwort
Гость
« : Апрель 22, 2012, 14:20 »

Привет всем!
Я новичок в работе с базами данных вообще и с базами данных с помощью Qt в частности.

Возникла такая проблема:

Использую базу SQLite. В записях есть поле "children"

Код:
query.exec("create table mft "
               "(id integer primary key, "
               "parent integer, "
               "children blob, "
               "type integer, "
               "name text, "
               "item integer)");

Хочу в него записывать QVariantList. Делаю это так:

Код:
    QVariantList children;
    children.append(2);
    children.append(3);
    children.append(4);
    children.append(5);
    mftBase->setData(mftBase->index(0,2),QVariant(children));

, где mftBase это QSqlTableModel. Инициализирую ее правильно, это видно по другим полям, в которые заносятся стандартные типы.

Собственно проблема: после вызова функции submitAll или submit, то есть собственно после занесения изменений в БД, во-первых, QVariant определяет тип поля "children" как QString, а во-вторых, возвращает пустую строку, то есть данные записываются некорректно, хотя submitAll() возвращает true:

Код:
QString string(mftBase->record(0).value("children").typeName());
//string = "QString"
QString string2(mftBase->record(0).value("children").toString());
//string2 = "";

Подскажите, пожалуйста, в чем проблема? Это свойство SQLite или я что-то неправильно делаю?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Апрель 22, 2012, 14:36 »

Скачайте Sqlite Expert Personal (или другую программу просмотрщик, если у вас не Win) и посмотрите что у вас лежит в базе.
BLOB лучше получать через toByteArray.
Ну а к типам полей SQLite весьма фривольно относится.
Записан
bibelwort
Гость
« Ответ #2 : Апрель 22, 2012, 21:27 »

Скачайте Sqlite Expert Personal (или другую программу просмотрщик, если у вас не Win) и посмотрите что у вас лежит в базе.
BLOB лучше получать через toByteArray.
Ну а к типам полей SQLite весьма фривольно относится.

Проверил, что в базе находится. Оказалось, что поле  children пустое. Попробовал записать данные через query:

Код:
    query.prepare("insert into mft (parent, children, type, name, item) "
               "values(?, ?, ?, ?, ?)");
    query.addBindValue(0);
    QVariantList children;
    children.append(2);
    children.append(3);
    children.append(4);
    children.append(5);
    query.addBindValue(children);
    children.clear();
    query.addBindValue(Subject);
    query.addBindValue("Alexey");
    query.addBindValue(0);
    query.exec();

Эффект тот же самый. Ничего не записывается. Поле остается пустым. Все остальное нормально пишется.

Что же не так? Грустный
Записан
bibelwort
Гость
« Ответ #3 : Апрель 22, 2012, 22:17 »

Попробовал записывать QByteArray с тем же содержимым. Получилось!
Но дело в том, что с ByteArray не удобно. В будущем хочу использовать QMap. Боюсь с ним будет тоже самое, что и c QList Грустный
Кто может сказать, почему не любой QVariant записывается?
Записан
V1KT0P
Гость
« Ответ #4 : Апрель 22, 2012, 22:26 »

Попробовал записывать QByteArray с тем же содержимым. Получилось!
Но дело в том, что с ByteArray не удобно. В будущем хочу использовать QMap. Боюсь с ним будет тоже самое, что и c QList Грустный
Кто может сказать, почему не любой QVariant записывается?
Посмотри исходники Qt и все станет ясно.
Записан
bibelwort
Гость
« Ответ #5 : Апрель 22, 2012, 22:44 »

Попробовал записывать QByteArray с тем же содержимым. Получилось!
Но дело в том, что с ByteArray не удобно. В будущем хочу использовать QMap. Боюсь с ним будет тоже самое, что и c QList Грустный
Кто может сказать, почему не любой QVariant записывается?
Посмотри исходники Qt и все станет ясно.

Если вы знаете в чем причина, подскажите пожалуйста, так как мне не ясно...
Записан
V1KT0P
Гость
« Ответ #6 : Апрель 22, 2012, 22:55 »

Попробовал записывать QByteArray с тем же содержимым. Получилось!
Но дело в том, что с ByteArray не удобно. В будущем хочу использовать QMap. Боюсь с ним будет тоже самое, что и c QList Грустный
Кто может сказать, почему не любой QVariant записывается?
Посмотри исходники Qt и все станет ясно.

Если вы знаете в чем причина, подскажите пожалуйста, так как мне не ясно...
Нет я не смотрел, но просто QVariant не может преобразовать твое содержимое в что-нибудь подходящее для запроса. В этом легко убедиться. Вот такой код:
Код
C++ (Qt)
   QVariantList children;
   children.append(2);
   children.append(3);
   children.append(4);
   children.append(5);
   QVariant d = QVariant(children);
   qDebug() << d.toString();
   qDebug() << d.toByteArray();
Всегда будет пустоту возвращать.
Как ты вообще представляешь логику преобразования массива значений разных типов в бинарный массив?
Записан
bibelwort
Гость
« Ответ #7 : Апрель 22, 2012, 23:34 »

Цитата: V1KT0P
Как ты вообще представляешь логику преобразования массива значений разных типов в бинарный массив?

Да, я понял проблему...

Таким образом получается, что в базу данных принципиально нельзя записать произвольные пользовательские типы (и struct и class), если только самостоятельно не реализовать конвертацию в QByteArray? Странно это, ведь Qt самостоятельно записывает зарегистрированные данные на диск...

Я понял! Можно в этом случае формировать QDataStream и его переводить в QByteArray для записи данных в БД и наоборот!

П.С. ИМХО разработчики могли бы сделать это и сами... Эхх...
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.14 секунд. Запросов: 23.