Как использовать LoaderManager с Green-DAO

Я использую GreenDAO в своем текущем приложении и хочу иметь LoaderManager с подключением к БД, чтобы отслеживать изменения и обновления в БД на лету.

Я видел в документации на Android, что не рекомендуется использовать ContentProvider когда у вашего приложения есть только внутренний SQLite DB (это то, что у меня есть), однако я действительно хочу реализовать шаблон Observer , чтобы изменить пользовательский интерфейс в реальном Время в соответствии с обновлениями в БД.

Я заметил, что для использования LoaderManager мне нужно предоставить URI для CursorLoader.

Мой вопрос в том, есть ли какой-нибудь пример кода в любом месте, используя это?

Как я могу создать LoaderManager для Green-DAO?

Вы не используете ContentProvider и Loaders с greenDAO. В настоящее время эти технологии не пересекаются.

Да, вы можете написать пользовательский загрузчик, в котором вы должны вручную уведомлять об изменениях базы данных при сохранении данных в базе данных. Для этой цели вы можете использовать широковещательные приемники, зеленую шину событий робота и т. Д. Смотрите код ниже

Пользовательский класс загрузчика сообщений для загрузки данных всякий раз, когда он получает уведомление через eventbus. MessageListLoader.java

 public class MessageListLoader extends AsyncTaskLoader<List<Message>> { private List<Message> mMessages; private long mGroupId; private Context mContext; public MessageListLoader(Context context, long groupId) { super(context); mGroupId = groupId; } private IMobileService getMobileService() { return MobileServiceImpl.getInstance(mContext); } @Override public List<Message> loadInBackground() { return getMobileService().getMessagesByGroupId(mGroupId); } @Override public void deliverResult(List<Message> newMessageList) { if (isReset()) { mMessages = null; return; } List<Message> oldMessageList = mMessages; mMessages = newMessageList; if (isStarted()) { super.deliverResult(newMessageList); } // Invalidate the old data as we don't need it any more. if (oldMessageList != null && oldMessageList != newMessageList) { oldMessageList = null; } } /** * The OnEvent method will called when new message is added to database. * * @param event */ @Subscribe public void onEvent(NewMessageEvent event) { // reload data from data base forceLoad(); } @Override protected void onStartLoading() { if (mMessages != null) { // If we currently have a result available, deliver it // immediately. deliverResult(mMessages); } if (!EventBus.getDefault().isRegistered(this)) { EventBus.getDefault().register(this); } } @Override protected void onReset() { mMessages = null; EventBus.getDefault().unregister(this); } } 

Класс мобильных услуг используется для предоставления всех услуг, связанных с базой данных.

MobileServiceImpl.java

 public class MobileServiceImpl implements IMobileService { private static final String TAG = "MobileServiceImpl"; private static final String DATABASE_NAME = "demo.db"; private static IMobileService instance = null; private DaoSession mDaoSession; private MobileServiceImpl(Context context) { DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, DATABASE_NAME, null); SQLiteDatabase db = helper.getWritableDatabase(); DaoMaster daoMaster = new DaoMaster(db); mDaoSession = daoMaster.newSession(); } public static IMobileService getInstance(Context context) { if (instance == null) { instance = new MobileServiceImpl(context); } return instance; } private MessageDao getMessageDao() { return mDaoSession.getMessageDao(); } /** * The saveMessage() method is used to save given message into database. * * @param message Specifies the message object to be saved. * @param notifyUi Specifies the boolean flag to notify the change in database to ui. * @return Saved message id. */ @Override public long saveMessage(Message message, boolean notifyUi) { long id = getMessageDao().insert(message); if (notifyUi) EventBus.getDefault().post(new NewMessageEvent(id)); return id; } @Override public List<Message> getMessagesByGroupId(long groupId) { return getMessageDao() .queryBuilder() .where(MessageDao.Properties.GroupId.eq(groupId)) .orderDesc(MessageDao.Properties.Id).list(); } @Override public Message getMessageById(long messageId) { return getMessageDao().load(messageId); } } 

Загрузить образец проекта отсюда