我一直在研究如何在ListView中显示来自DB的数据,同时跟踪数据库中的变化。
假设我有一个聊天应用程序,它显示了我所在的所有聊天室的ListView。
对适配器的查询是SELECT * FROM CHAT_ROOM ORDER BY UPTDATE_TIME,这意味着我希望首先显示具有最近活动的聊天室。由于我在ChatroomListActivity中,一条消息被接收到聊天室3号,这意味着它现在需要成为聊天室一号,并相应地重新排列单元格。
我知道装载机能够在后台重新查询,但正如我的previous question here中回答的那样,装载机似乎还不够好。
是否有一种实时观察数据库变化的不同机制?
发布于 2012-11-21 07:58:08
我就是这么做的
GroupChat的活动比较明显。MessageDataSource,从DB中插入和返回对象的类。HandleNewMessage,我不认为我需要解释这个。
您现在想要的是GroupChat & HandleNewMessage与MessageDataSource的同一个实例进行对话。因此,您要做的是在MessageDataSource示例中对MessageDataSource进行静态引用:
public class MessageDataSource {
private static MessageDataSource mInstance;
public static MessageDataSource getInstance(Context context) {
if(mInstance == null){
mInstance = new MessageDataSource(context);
}
return mInstance;
}
private MessageDataSource(Context context) {
// NOTE: private constructor
}
}因为你把构造函数变成私有的,所以你做不到
MessageDataSource data = new MessageDataSource(context);因为构造函数是私有的,所以必须这样做。
MessageDataSource data = MessageDataSource.getInstance(context);现在,您的类GroupActivity和HandleNewMessage可以与MessageDataSource的同一个实例对话,您可以创建一个自定义接口,通知任何观察侦听器。
示例:
public class MessageDataSource {
private static MessageDataSource mInstance;
private SQLiteDatabase mDataBase;
private SQLiteHelper DBHelper;
private OnInsert mOnInsert;
public static MessageDataSource getInstance(Context context) {
if(mInstance == null){
mInstance = new MessageDataSource(context);
}
return mInstance;
}
private MessageDataSource(Context context) {
DBHelper = SQLiteHelper.getInstance(context);
}
public void createMessage(String JID, String message, String sender) {
// Do DB Stuff here
if(mOnInsert != null) {
mOnInsert.onInsert(message);
}
}
public void setOnInsertListener(final OnInsert onInsert) {
mOnInsert = onInsert;
}
public static interface OnInsert {
// Notify the observer that an insert has bin made
public String onInsert(String message);
}
}您可以通过您认为需要的接口发送尽可能多的对象。现在,在您的GroupChatActivity中,您可以设置(在我的例子中)一个OnInserListener,这是设置OnClickListener的正常方式。或者你可以让你的活动实现接口。
这个例子并不能完全满足您的需要,但是要观察在DB中插入了什么新的内容,并且您需要更新您的listView,我认为这样做是可行的,但是如果有人找到了更好的方法,请评论。:D
我希望这能让你走上正确的方向。
致以亲切的问候。
https://stackoverflow.com/questions/13488090
复制相似问题