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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Сохранить объект в SQLite  (Прочитано 4596 раз)
PinkPanther
Самовар
**
Offline Offline

Сообщений: 169



Просмотр профиля
« : Октябрь 23, 2013, 22:35 »

Добрый вечер.

Необходимо сохранить экземпляр пользовательского объекта в базе (SQLite/BLOB) и потом считать его назад.

Подскажите пожалуйста, как это практически реализовать? Если я правильно понимаю, объект должен быть сначала преобразован в QByteArray, потом записан в базу. Потом считан в QByteArray и преобразован в объект нужного типа. Или нет?
Записан

Эвтаназия - наше хобби!
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #1 : Октябрь 23, 2013, 23:11 »

да
Записан
PinkPanther
Самовар
**
Offline Offline

Сообщений: 169



Просмотр профиля
« Ответ #2 : Октябрь 24, 2013, 04:33 »

да

А как это сделать технически?
Записан

Эвтаназия - наше хобби!
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #3 : Октябрь 24, 2013, 08:19 »

А как это сделать технически?
Технически так. Создать поток QDataStream, связать его с QByteArray и, используя оператор << поместить объект в поток. Это называется сериализацией.
Подробнее можно посмотреть тут http://habrahabr.ru/post/150827/
Однако нужно помнить, что полнота "сериализуемости" объекта целиком и полностью лежит на совести авторов класса этого объекта.
Записан
PinkPanther
Самовар
**
Offline Offline

Сообщений: 169



Просмотр профиля
« Ответ #4 : Октябрь 25, 2013, 10:14 »

А как это сделать технически?
Технически так. Создать поток QDataStream, связать его с QByteArray и, используя оператор << поместить объект в поток. Это называется сериализацией.
Подробнее можно посмотреть тут http://habrahabr.ru/post/150827/
Однако нужно помнить, что полнота "сериализуемости" объекта целиком и полностью лежит на совести авторов класса этого объекта.

Спасибо!
А что делать в случае, если пользовательский класс создан на базе класса Qt?
Я использую QNetworkCookieJar. Как реализовать его сериализацию и гарантированно ничего не потерять?

Примерно полгода назад попадалась в сети статья с примером, который можно было использовать с любым классом. К сожалению, не могу ее найти. Если память не изменяет, автор использовал класс QVariant для подготовки объекта к размещению в базе, а потоком не пользовался. Единственная претензия к автору заключалась в том, что неразумные пользователи могли попытаться использовать старый объект, который содержал ссылки на ресурсы, которых в памяти уже нет. А так - нормальное решение.
Записан

Эвтаназия - наше хобби!
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #5 : Ноябрь 04, 2013, 12:27 »

А что делать в случае, если пользовательский класс создан на базе класса Qt?
Я использую QNetworkCookieJar. Как реализовать его сериализацию и гарантированно ничего не потерять?
Вариант № 1. Просто посмотреть, есть ли у класса QNetworkCookieJar перегруженные операторы << и >> . Если - да, то довериться авторам класса (если не хотите проверять) и делать как я уже тут писал. Если - нет, то вариант 2.
Вариант № 2. Унаследоваться от QNetworkCookieJar и перегрузить у него операторы << и >> так, чтобы максимально полно сохранять/восстанавливать состояние класса.

Примерно полгода назад попадалась в сети статья с примером, который можно было использовать с любым классом. Если память не изменяет, автор использовал класс QVariant для подготовки объекта к размещению в базе, а потоком не пользовался.
Никакой принципиальной разницы между этими подходами нет - просто в этом случае в классе должны быть корректно реализованы не потоковые операторы, а функции преобразования в QVariant. Всё равно скатываемся к тому насколько добросовестно авторы класса подошли к их реализациям.

Если суть вопроса состоит в записи/восстановлении именно QNetworkCookieJar, то в примерах Qt есть приложение browser (http://qt.gitorious.org/qt/qt/trees/4.8/demos/browser) с классом CookieJar, который, похоже, решает именно такую задачу.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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