【问题标题】:How to use LoaderManager with Green-DAO如何在 Green-DAO 中使用 LoaderManager
【发布时间】:2012-11-18 07:08:24
【问题描述】:

我在我当前的应用程序中使用 GreenDAO,并希望有一个与数据库连接的LoaderManager,以便实时监控数据库上的更改和更新。

我在 Android 文档中看到,当您的应用只有一个内部 SQLite 数据库(这是我所拥有的)时,不建议使用 ContentProvider,但是,我真的想按顺序实现 Observer Pattern根据数据库中的更新实时更改用户界面。

我注意到为了使用 LoaderManager,我需要为 CursorLoader 提供一个 URI。

我的问题是,在任何地方都有一些示例代码使用它吗?

如何为 Green-DAO 创建 LoaderManager?

【问题讨论】:

    标签: android android-loadermanager greendao


    【解决方案1】:

    您不会将 ContentProvider 和 Loaders 与 greenDAO 一起使用。目前,这些技术还没有交叉。

    【讨论】:

    • 我想可以写一个使用greenDAO的自定义加载器,不是吗?
    • 我认为GreenDao应该真正支持观察者模式,即使它使用了另一种方式。这正是我使用内容提供商的原因。
    【解决方案2】:

    是的,您可以编写一个自定义加载程序,当您将数据保存在数据库中时,您必须手动通知数据库更改。为此,您可以使用广播接收器、绿色机器人事件总线等。请参阅下面的代码

    自定义消息加载器类在收到事件总线通知时加载数据。 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);
        }
    }
    

    Download Sample Project from Here

    【讨论】:

      猜你喜欢
      • 2013-03-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 2014-09-04
      相关资源
      最近更新 更多