Russian Qt Forum

Qt => Вопросы новичков => Тема начата: PinkPanther от Октябрь 23, 2013, 22:35



Название: Сохранить объект в SQLite
Отправлено: PinkPanther от Октябрь 23, 2013, 22:35
Добрый вечер.

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

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


Название: Re: Сохранить объект в SQLite
Отправлено: Alex Custov от Октябрь 23, 2013, 23:11
да


Название: Re: Сохранить объект в SQLite
Отправлено: PinkPanther от Октябрь 24, 2013, 04:33
да

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


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


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

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

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


Название: Re: Сохранить объект в SQLite
Отправлено: xokc от Ноябрь 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, который, похоже, решает именно такую задачу.