Как можно использовать DAO с областью? Потому что, когда в своей деятельности я пытаюсь установить членов своего модельного класса, я получаю исключение:
java.lang.IllegalStateException: изменение данных области может быть сделано только из транзакции.
Я знаю, что использование realm.executeTransaction
решает проблему, но код в моей деятельности больше не зависит от базы данных, потому что он будет исходным кодом, специфичным для связи с базами данных низкого уровня. Поэтому позже, если я захочу изменить базу данных, рефакторинг будет стоить много времени и работы ... Кроме того, мне придется обрабатывать во всех моих действиях ссылку на Realm.getDefaultInstance();
Вот пример кода моей деятельности
protected void onCreate(Bundle savedInstanceState)
{
mBook = mBookDaoImpl.getBookById(bookId);
}
// Later in the code
private void saveBook(String name)
{
mBook.setName(name);
}
Вот мой класс модели
public class Book extends RealmObject
{
@Required
@PrimaryKey
private String id;
private String name;
public Book() {
}
public Book(String id, String name) {
this.id = id;
this.name = name;
}
// getter setter methods
}
Вот мой интерфейс DAO:
public interface BookDao
{
List<Book> getAllBooks();
Book getBookByIsbn(int isbn);
void saveBook(Book book);
void deleteBook(Book book);
}
И, наконец, моя реализация:
public class BookDaoImpl implements BookDao
{
private static BookDaoImpl INSTANCE = null;
private Realm mRealm;
private BookDaoImpl()
{
mRealm = Realm.getDefaultInstance();
}
public static BookDaoImpl getInstance()
{
if (INSTANCE == null)
INSTANCE = new BookDaoImpl();
return INSTANCE;
}
@Override
public List<Book> getAllBooks()
{
return mRealm.where(Book.class).findAll();
}
@Override
public Book getBookById(String id)
{
return mRealm.where(Book.class).equalTo("id", id).findFirst();
}
@Override
public void saveBook(final Book book)
{
mRealm.executeTransaction(new Realm.Transaction()
{
@Override
public void execute(Realm realm)
{
if (book.getId() == null)
book.setId(UUID.randomUUID().toString());
realm.copyToRealmOrUpdate(book);
}
});
}
@Override
public void deleteBook(final Book book)
{
mRealm.executeTransaction(new Realm.Transaction()
{
@Override
public void execute(Realm realm)
{
mRealm.where(Counter.class).equalTo("id", book.getId())
.findFirst()
.deleteFromRealm();
}
});
}
}