我在我当前的应用程序中使用GreenDAO,并希望LoaderManager与数据库建立连接,以便动态监视数据库的更改和更新。
我在Android文档中看到,当你的应用只有一个内部SQLite数据库(这就是我所拥有的)时,不建议使用ContentProvider
但是,我真的想要实现{{3为了根据数据库中的更新实时更改UI。
我注意到为了使用LoaderManager,我需要为CursorLoader提供一个URI。
我的问题是,是否有一些示例代码使用它?
如何为Green-DAO创建LoaderManager?
答案 0 :(得分:1)
您不使用带有greenDA的ContentProvider和Loaders。目前,这些技术并不相交。
答案 1 :(得分:0)
是的,您可以编写自定义加载程序,只要您在数据库中保存数据,就必须手动通知数据库更改。为此,您可以使用广播接收器,绿色机器人事件总线等。请参阅下面的代码
自定义消息加载器类,用于在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);
}
}