我一直在研究如何在 ListView 中显示数据库中的数据,同时跟踪数据库中的更改。
假设我有一个聊天应用程序,它显示我所属的所有聊天室的 ListView。
适配器的查询是SELECT * FROM CHAT_ROOM ORDER BY UPTDATE_TIME
,这意味着我希望首先显示最近 Activity 的聊天室。正如我在 ChatroomListActivity
中收到的一条关于 3 号聊天室的消息,这意味着它现在需要成为 1 号聊天室并相应地重新排列单元格。
我知道加载器能够在后台重新查询,但作为公共(public)软件在我的 previous question here 中回答,看来 Loaders 对此还不够好。
是否有不同的机制来实时观察数据库变化?
最佳答案
我的做法
- GroupChatActivity 类
- 消息数据源类
- HandleNewMessage 类
群聊 Activity 有点明显。 MessageDataSource 是从数据库插入和返回对象的类。 HandleNewMessage,这个不用我解释了。
- GroupChat -> MessageDataSource -> getMessages()
- HandleNewMessage -> MessageDataSource -> 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
}
}
因为你将构造函数设为私有(private),所以你不能这样做
MessageDataSource data = new MessageDataSource(context);
因为构造函数是私有(private)的,所以你必须这样做
MessageDataSource data = MessageDataSource.getInstance(context);
现在,您的类 GroupActivity 和 HandleNewMessage 可以与 MessageDataSource 的同一个实例通信,您可以创建一个自定义接口(interface)来通知任何观察监听器.
示例:
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);
}
}
您可以通过您认为需要的接口(interface)发送任意数量的对象。 现在,在您的 GroupChatActivity 中,您可以按照设置 OnClickListener 的常规方式设置(在我的例子中)OnInserListener。或者你可以让你的 Activity 实现接口(interface)。
这个示例可能不符合您的确切需求,但要观察何时将新内容插入到您的数据库中并且您需要更新您的 listView,我认为这是正确的方法,但如果有人找到更好的方法请给出意见。 :D
我希望这能让您朝着正确的方向前进。
亲切的问候。
关于android - SQLite 的 ContentObserver?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13488090/