Ormlite android one to one

ORM в Android c помощью ORMLite

На данный момент для платформы Android существует несколько решений, позволяющих реализовать ORM-подход для работы с базой данных, но основных два. Это ORMLite и GreenDAO.

Для новичков стоит сделать отступление и рассказать что такое ORM вообще. ORM — object-ralational mapping. Объектно-реляционное отображение означает, что программисту гораздо удобнее оперировать с объектами, которые он использует в своём приложении, нежели чем с таблицами, в которых хранятся данные в реляционных базах данных. Для связи реляционных СУБД с объектной моделью приложения используются ORM-технологии. Так для решения задач объектно-реляционного отображения в Android используют один из сторонних фреймворков. GreenDAO и ORMLite — являются библиотеками с открытым кодом.

GreenDAO

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

Преимущества:
Недостатки:
  • Отсутствует механизм для переноса данных при обновлении схемы.
  • Невозможность аннотирования классов, а необходимость описания алгоритма построения новых сущностей.
ORMLite

Популярный фреймворк для Java, имеющий адаптированную версию под Android.

Преимущества:
Недостатки:

… хм… я их не находил) всё что кажется не возможным, реализуется при более глубоком изучении доков.

OrmLite я использую в нескольких и проектах и знаком с ним достаточно тесно. Поэтому рассажу как раз о нем.

Простая аннотация классов

Каждый класс, отображение в базу данных (сохрание в БД) которого мы хотим сделать должен быть аннотирован. (можно использовать class-configuration, но это совсем другая история)Стоит заметить, что у класса должен обязательно присутствовать конструктор без аргументов. Пример аннотации:

Первая аннотация @DatabaseTable(tableName = «goals») указывает название таблицы, куда будут отображены объекты этого класса.
Перед каждым полем должна быть аннотация @DatabaseField с различными аргументами. (также можно не указывать аргументов — всё установится по умолчанию, а название столбца в таблице будет совпадать с названием поля). У поля name три аргумента. canBeNull = false означает, что в таблице этот столбец не может быть пустым. dataType = DataType.STRING принудительно обязывает приводить тип столбца к типу String . (доступные типы можно посмотреть здесь). columnName = GOAL_NAME_FIELD_NAME — принудительное указание имени столбца в таблице поможет нам в дальнейшем при построении select-запросов для получения данных из БД.
Первичным ключем может служить любое поле — достаточно указать у него id = true , но рекомендуется сделать автогенерируемое значение id и поставить ему generatedId = true . ORMLite сама назначит ему уникальный номер.
Для индексации столбца в БД указывается index = true
Полное описание всех доступных агументов аннотации полей можно посмотреть здесь
Также помимо аннотаций ORMLite можно использовать привычные некоторым javax.persistence аннотации

Подключение к SQLite в андроид

Существует несколько способов получения доступа к данным БД с помощью ORMLite в андроид. Можно наследовать каждую activity от ORMLiteBaseActivity и тогда нам не придется следить за жизненным циклом соединения с БД, но при этом мы не сможем получить доступа из других классов. (см примеры)
Гораздо предпочтительнее подход, рассмотренный далее.

Нужно создать класс, который будет инстанцировать помощника в создании и работе с БД:

Обращение к нему будет происходить во время начала и конца жизни приложения:
Это предотвратит утечки памяти из-за незакрытого соединения с БД

Так же не забываем описать наш класс наследник Application в манифесте:

Создадим класс DataBaseHelper, который будет отвечать за создание БД и за получение ссылок на DAO:

Как видно в примере, нужно описать создание полей и таблицы, а также реализовать получение ссылки на синглтон с DAO-объектом. Теперь рассмотрим непосредственно сами DAO.

Самой простой реализацией является следующий класс

Здесь создан лишь один дополнительный метод для получения коллекции всех объектов класса Role.
Основные методы create, update, delete реализованы в предке BaseDaoImpl.
Для обращения к методом класса RoleDao в любом классе приложения достаточно обратиться к классу-фабрике:
RoleDAO roleDao = HelperFactory.GetHelper().getRoleDAO();

Создание запросов

Для построения специфичных запросов можно создавать свои методы в классе DAO.

Читайте также:  Droid cam веб камера андроид

Как видно, здесь производился поиск по объектам с соответствующим полем имени.
При построении более сложных запросов помимо eq (что означает equals) есть и другие вроде gt (greater), ge (greater and equals) и остальных соответсвующих стандартным where-конструкцииям в SQL (полный список здесь)
Для построения сложного запроса можно добавлять and :
queryBuilder.where().eq(Goal.GOAL_NAME_FIELD_NAME, «First goal»).and().eq(Goal.GOAL_NOTES_NAME_FIELD_NAME,”aaa”);

Соответсвенно помимо запросов из БД подобным образом можно удалять и обновлять таблицы.

Работа с вложенным сущностями

Рассмотрим отношения вида много к одному. Допустим объект Goal имеет поле указывающее на Role.
Соответственно в классе Goal поле должно быть аннотированно

Теперь мы можем сохранить наши объекты в БД

Чтобы получить доступ к объекту класса Role, который связан с объектом типа Goal:

refresh() необходимо выполнять, чтобы r получил все поля из БД соответвующие этому объекту.

При хранинии ссылки на коллекцию подход немного отличается:

Аргумент в аннотации eager означает, что все объекты из roleList будут получаться из БД вместе с извлечением объекта типа Goal. Обязательной является ссылка на Goal в объекте Role. А так же нужно отдельно сохранять с помощью RoleDAO каждый из объектов Role.
Соответственно в классе Role должна быть аннотация:

Если не ставить eager=true , то будет осуществлена lazy-инициализация, т.е. при запросе объекта Goal объекты соотвествующие коллекции roleList не будут извлечены. Для их извлечения нужно будет произвести их итерацию:

Источник

One-To-Many отношения в ORMLite Android

Как реализовать отношение «один-много» в ORMLite Android?

пожалуйста, найдите пример

Б имеет коллекцию А. Я звоню dao.create(b);

Теперь я создаю Дао б, так как Б имеет все данные. Но таблица B была создана только с данными, а никогда не создается. Не мог бы кто-нибудь помочь?

3 ответа

Я понимаю, что таблица поиска необходима, когда мы имеем дело с отношением many-to-many. Но как насчет отношения one-to-many — нужна ли нам таблица поиска или внешний ключ в одной из таблиц? Другой вопрос, является ли one-to-many тем же самым, что и many-to-one ?

В настоящее время я играю с ORMlite, чтобы создать модель с таблицами и отношениями. Одно отношение-это отношение many-to-many. Как лучше всего это реализовать? Чтобы быть более конкретным: Допустим, у меня есть эти два стола Product id brand Purchase id Покупка может иметь несколько продуктов, и.

Теперь я создаю dao b, так как у b есть все данные. Но таблица B была создана только с данными, А никогда не создается. Не мог бы кто — нибудь помочь?

Верно. Вам нужно создать A элементов с помощью:

ORMLite не создает их автоматически для вас.

Вы должны переопределить DAO класса B, чтобы при создании или обновлении объекта B также обновлялись объекты в коллекции.

Взгляните на этот вопрос: Коллекции в ORMLite .

я столкнулся с той же проблемой. Мой json был похож на:

я решил эту проблему следующим образом:

Похожие вопросы:

У меня есть два класса с отношением many-to-many, поэтому я создал таблицу соединений между ними (очень классический пример!) В java+hibernate я хочу знать, какой путь лучше? наличие отношения.

Мне нужно выразить несколько отношений one-to-many в Django. То есть, учитывая несколько различных моделей, мне нужно, чтобы каждая из них имела отношение one-to-many с одной таблицей. Логически.

У меня два стола. Я хочу установить отношения one-to-many, но также и отношения many-to-one. Страница может иметь один фон-это фон страницы. Страница также может иметь много фонов — это коллекция.

Я понимаю, что таблица поиска необходима, когда мы имеем дело с отношением many-to-many. Но как насчет отношения one-to-many — нужна ли нам таблица поиска или внешний ключ в одной из таблиц? Другой.

В настоящее время я играю с ORMlite, чтобы создать модель с таблицами и отношениями. Одно отношение-это отношение many-to-many. Как лучше всего это реализовать? Чтобы быть более конкретным.

Может ли кто-нибудь объяснить, как реализовать отношения one-to-one, one-to-many и many-to-many при проектировании таблиц на некоторых примерах?

У меня есть следующие классы, которые я хочу сохранить в DB с помощью Ormlite: public class Quantity < private int normalisedAmount; private String unit; . >public class Article < private String.

Для веб-сайта, похожего на форум, который я создаю, у меня есть PHP классов ‘user’ и ‘post’. У пользователя есть массив сообщений. Как создать подобие этого соединения в реляционной базе данных? С.

Читайте также:  Android get notification manager

Мне нужна помощь с отношением «one-many». я хотел бы использовать ORMLite DB для Android. Как я могу сделать этот простой пример? спасибо

Как лучше всего смоделировать эти отношения в DynamoDB? One-to-one отношения One-to-many отношения Many-to-many отношения

Источник

Ormlite android one to one

Android and databases are powerful and really good to have but it is also not so fun working with. I’m going to show if not a funny way at least an easier way of working with SQLLite. I’m using ORMLite that is a Lightweight Object Relational Mapping that gives you the most features you need in a simple way and still gives you access to the SQL if needed.

Setting up ORMLite

Setting up ORMLite for your project is easy just add the dependency to your app’s build.gradle file.

First add ORMLite dependencies in your gradle.build file:

Database Helper

If you have worked with SQLite on Android you have worked with the SQLiteOpenHelper class. When working with ORMLite you need to extend the OrmLiteSqliteOpenHelper instead, but they are similar in the way that they have an onCreate, an onUpgrade ect. And you do the same kind of operations in them but with the help of ORMLite.

To create a table you use the TableUtils class like this:

This line create a table from the domain object I have called User. To delete the same table you use this line:

The last boolean, ignoreErrors, is to indicate if ORMLite should stop on first error or keep trying the rest.

With ORMLite you also need to have a dao (data access object) to work with your data. You get this dao objects by calling on getDAO…

…or getRuntimeExceptionDao even though it is easier to work with I would suggest ignoring that one, no body likes a runtime exception and don’t forget to nullify the reference to the dao object when closing the database.

The complete code for this database helper would look something like this:

Singel Object

So to the object we like to store in the database, in this case it is called User.

It is here in your object you define the table, you can use annotations for setting up the name to use, if you skip annotations ORMLite will use the class and field names. I prefer to use annotations since it gives me a better control. The @DatabaseTable let me chose name for the table and the @DatabaseField let me chose name for the field and some extra settings as well.

I prefer to have the names as constants for easier access when doing queries later on.

Ok, so we have our helper and we have an object we like to store. Let store some data.

create

First thing is to obtain the dao object:

Now we can create our object:

… and then we save it to the database:

That’s it! We have stored data!

update

If we update our object and need to save it we use the update method:

createOrUpdate

If we don’t know if the object already is saved or not we can use createOrUpdate, it is slower but if the object already exist it will be updated otherwise it will be created.

refresh

You might end up in a situation where you need to ensure the object you have is in sync with the database, then you can refresh the object.

delete

And delete what would a database be if we could not delete:

query

To query for all users:

Or if you just want one and you have the id:

queryBuilder

There is something called a query builder for more complex selections.

To select objects where a field is equals to something:

To select objects where a field is equals to something and/or something else:

To select objects where a field is between two values:

Читайте также:  Что называют русским андроид

All this queries can be ended with .query() for a collection or with .queryForFirst() for a singel object.

You can also count the number or items in a selection:

There is a lot of more you can do read more about it here: ORMLite documentation and you will see a more complex query with joins further down under many-to-many relations.

Relationship

One-to-one

One-to-one relationships are easy, start by creating the foreign object we call it Role and don’t forget to add it to the database helper.

When the foreign class is defined we add it to our User class.

We need to set some annotation properties so ORMLite knows what to do with the object. First we tell ORMLite that it is a foreign object with “foreign = true”.

The “foreignAutoCreate = true” tells ORMLite to automatically create the foreign object when the User object is created if the reference is not null meaning you still need to instantiate the object. You also need to have the Role objects id field set to be auto generated with “generatedId = true”

The “foreignAutoRefresh = true” means when the parent object (the User object) is refreshed the Role object will be as well.

And to access the Role object:

One-to-many

Lets give the user one or more email addresses. So it will have to be a collection of foreign objects. We get a little bit of help my the ForeignCollection. So lets start by adding a ForeignCollection to our User object.

The eager = true means that when the User is retrieved the emails will be retrieved as well.

To let ORMLite be able to find all emails belonging to a User the Email class need to have a foreign field connected to the User giving us an Email class looking like this:

To get this to work the User object need to be created, otherwise we won’t have a user id for the email object.

Lets list all users and their e-mail addresses:

Many-to-many

Many to Many relations are not covered by ORMLite but there is a way to do this anyway. First lets att a new class called Project.

Then we need a relation class lets call it UserProject

Now for the tricky part to join these. First we look at getting all project one user is part of.

And getting all the users for one project.

foreign key

It happens that you need to use an external id as key. You can do that by replacing the “generatedId = true” with “id = true”.

One example would be if you are downloading your data in a json format from a server, it is easy to map the json property names to the database just by adding gson annotations.

Custom DAO

More often then not you need to get an update somewhere about changes in the database made somewhere else. One way of doing this is to create your own DAO object that sends an event when it updates the database. You can create your custom dao by extending BaseDaoImpl and eg. override the create method and send an event with Otto or EventBus or by creating your own callbacks.

A custom dao could look something like this:

To use this custom dao we need to point it out in the table annotation with the daoClass properties like this:

Source

If you like to checkout the code go to: android-ormlite-tutorial.

This Post Has 8 Comments

Thanks for the nice article. Many-to-many case is very tricky though. Also, seems like the code can get quite complicated if the number of persistent classes increase because we would need to create and use many Dao classes – one per persistent class.

Thanks, best post that I found about ORMLite because you explain the relation one-to-many very clearly.

Hello, Great tutorial! But there is a problem with the CustomDao, is throws in exception, did You solve that?

Источник

Оцените статью