我一直在研究如何在列表视图中显示数据库中的数据,同时跟踪数据库中的更改。
假设我有一个聊天应用程序,它显示了我所属的所有聊天室的列表视图。
对适配器的查询是SELECT * FROM CHAT_ROOM ORDER BY UPTDATE_TIME
,这意味着我希望首先显示最近活动的聊天室。当我在ChatroomListActivity
中时,会收到3号聊天室的消息,这意味着它现在需要成为1号聊天室,并相应地重新排列单元格。
我知道加载程序能够在后台重新查询,但正如my aa>中的commonware所回答的那样,加载程序似乎还不够好。
是否有不同的机制来实时观察数据库的变化?
最佳答案
我做的方式
类GroupChatActivity
类MessageDataSource
类句柄消息
群聊活动是很明显的。
MessageDataSource从数据库插入和返回对象的类。
简单的消息,我不需要解释这个。
组聊天->消息数据源->获取消息()
handleNewMessage->消息数据源->insertNewMessage();
现在需要的是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);
}
}
你可以通过你认为你需要的接口发送任意多的对象。
现在在groupchattactivity中,您可以设置oninserlistener(在我的例子中),就像设置onclicklistener一样。或者可以让活动实现接口。
这个例子可能不符合您的确切需求,但要观察什么时候新的东西插入到您的数据库,您需要更新您的列表视图,这是我认为的方式,但如果有人找到更好的方式,请评论。:天
我希望这能帮你找到正确的方向。
谨致问候。