Название: Сохранить объект в 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? Вариант № 1. Просто посмотреть, есть ли у класса QNetworkCookieJar перегруженные операторы << и >> . Если - да, то довериться авторам класса (если не хотите проверять) и делать как я уже тут писал. Если - нет, то вариант 2.Я использую QNetworkCookieJar. Как реализовать его сериализацию и гарантированно ничего не потерять? Вариант № 2. Унаследоваться от QNetworkCookieJar и перегрузить у него операторы << и >> так, чтобы максимально полно сохранять/восстанавливать состояние класса. Примерно полгода назад попадалась в сети статья с примером, который можно было использовать с любым классом. Если память не изменяет, автор использовал класс QVariant для подготовки объекта к размещению в базе, а потоком не пользовался. Никакой принципиальной разницы между этими подходами нет - просто в этом случае в классе должны быть корректно реализованы не потоковые операторы, а функции преобразования в QVariant. Всё равно скатываемся к тому насколько добросовестно авторы класса подошли к их реализациям.Если суть вопроса состоит в записи/восстановлении именно QNetworkCookieJar, то в примерах Qt есть приложение browser (http://qt.gitorious.org/qt/qt/trees/4.8/demos/browser) с классом CookieJar, который, похоже, решает именно такую задачу. |