4

私は現在のアプリで GreenDAO を使用しており、その場で DB の変更と更新を監視するために、DB に接続するLoaderManagerが必要です。

Android のドキュメントで、アプリに内部 SQLite DB (私が持っているもの) しかない場合に使用することはお勧めできませんが、リアルタイムで UI を変更するためにオブザーバー パターンContentProviderを実装したいと考えています。 DBの更新によると。

LoaderManager を使用するには、CursorLoader の URI を指定する必要があることに気付きました。

私の質問は、これを使用するサンプル コードがどこかにあるということです。

Green-DAO の LoaderManager を作成するにはどうすればよいですか?

4

2 に答える 2

1

greenDAOでContentProviderとローダーを使用しないでください。現時点では、これらのテクノロジーは交差していません。

于 2012-11-26T16:43:56.663 に答える
0

はい、データベースにデータを保存するたびに、データベースの変更について手動で通知する必要があるカスタムローダーを作成できます。そのために、ブロードキャストレシーバー、グリーンロボットイベントバスなどを使用できます。以下のコードを参照してください。

イベントバスから通知を受けるたびにデータをロードするためのカスタム メッセージ ローダー クラス。 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);
    }
}

サンプルプロジェクトのダウンロードはこちらから

于 2016-03-24T04:53:49.303 に答える