Пользовательские данные ORMLite сохраняются с несколькими столбцами - PullRequest
5 голосов
/ 21 октября 2011

Скажем, у меня есть класс с именем Person, который обычно сохраняется в таблице БД с использованием ORMLite.

Теперь у меня есть член внутри этого Person класса с именем House. Класс House содержит 3 свойства и НИКОГДА не сохраняется в базе данных.

Я хочу, чтобы при сохранении Person я хотел сохранить 3 поля House в таблице Person в 3 разных столбцах.

Таким образом, таблица Person будет иметь: { person_name, person_contact, house_address, house_type, house_date }.

Последние 3 поля будут получены из House объекта.

Я думаю, мне следует использовать DataPersister для переменной-члена House, но означает ли это, что весь объект House будет записан в ОДИН столбец? Я хочу разделить его на 3 столбца в таблице Person. Может кто-нибудь помочь?

Спасибо!

Ответы [ 3 ]

7 голосов
/ 11 декабря 2012

На самом деле идеальный обходной путь для Serializable объектов это может быть:

@DatabaseField (dataType = DataType.SERIALIZABLE) 
public Person person;

В результате Person сохраняется в одном столбце как обычная примитивная переменная.

6 голосов
/ 22 октября 2011

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

Извините, но сейчас (12/2012) ORMLite не поддерживает встроенные объекты. Это находится в списке TODO, но никакие планы не мешают этому. Как уже упоминалось @ user999717, мы поддерживаем посторонние объекты, которые можно автоматически обновлять. Это позволяет вам сохранить объект House в другой таблице, и ORMLite запросит его при извлечении Person. Вот документы для этого:

http://ormlite.com/docs/foreign

3 голосов
/ 13 октября 2014

Вы можете использовать это:

@DatabaseField (useGetSet = true)
private String personStr; // Dummy

public Person person;
public String getPersonStr(){ person.toString(); }
public void setPersonStr(String personstr){ person = Person(personstr); }

Жаль, что следующее не работает, и вам нужно дополнительное пустое поле:

@DatabaseField (dataType = DataType.String, useGetSet = true) 
public Person person;
public String getPerson(){ person.toString(); }
public void setPerson(String personstr){ person = Person(personstr); }

Вы также можете использовать dataType = DataType.SERIALIZABLE, как указано в других ответах, НО использует настраиваемую сериализацию, что означает фактическую реализацию Serializable и обработку всех возможных версий сериализации при чтении.Сериализация по умолчанию НЕ должна использоваться, так как в итоге вы получите испорченную БД.

...