Android SQLite的ContentObserver?
我一直在研究如何在ListView中显示数据库中的数据,同时跟踪数据库中的更改 假设我有一个聊天应用程序,它显示了我所属的所有聊天室的列表视图 适配器的查询是Android SQLite的ContentObserver?,android,observer-pattern,android-sqlite,android-cursoradapter,Android,Observer Pattern,Android Sqlite,Android Cursoradapter,我一直在研究如何在ListView中显示数据库中的数据,同时跟踪数据库中的更改 假设我有一个聊天应用程序,它显示了我所属的所有聊天室的列表视图 适配器的查询是SELECT*FROM CHAT\u ORDER BY update\u TIME,这意味着我希望首先显示最近有活动的聊天室。当我在聊天室列表活动中时,3号聊天室收到一条消息,这意味着它现在需要成为1号聊天室,并相应地重新排列单元格 我知道加载器可以在后台重新查询,但正如我的文章中回答的,加载器似乎还不够好 实时观察数据库更改是否有不同的机
SELECT*FROM CHAT\u ORDER BY update\u TIME
,这意味着我希望首先显示最近有活动的聊天室。当我在聊天室列表活动中时,3号聊天室收到一条消息,这意味着它现在需要成为1号聊天室,并相应地重新排列单元格
我知道加载器可以在后台重新查询,但正如我的文章中回答的,加载器似乎还不够好
实时观察数据库更改是否有不同的机制 我做这件事的方式
- 班级集体聊天活动
- 类MessageDataSource
- 类句柄消息
- GroupChat->MessageDataSource->getMessages()
- HandleNewMessage->MessageDataSource->insertNewMessage()李>
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);
}
}
您可以通过您认为需要的接口发送任意数量的对象。
现在,在您的群组聊天活动中,可以按照设置onClick侦听器的正常方式设置OnInserListener(在我的例子中)。或者,您可以让活动实现接口
此示例可能不符合您的确切需求,但为了观察何时将新的内容插入数据库,并且您需要更新listView,我认为这是一种方法,但如果有人找到更好的方法,请发表评论:D
我希望这能帮你找到正确的方向
亲切的问候。我这样做了
- 班级集体聊天活动
- 类MessageDataSource
- 类句柄消息
- GroupChat->MessageDataSource->getMessages()
- HandleNewMessage->MessageDataSource->insertNewMessage()李>
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);
}
}
您可以通过您认为需要的接口发送任意数量的对象。
现在,在您的群组聊天活动中,可以按照设置onClick侦听器的正常方式设置OnInserListener(在我的例子中)。或者,您可以让活动实现接口
此示例可能不符合您的确切需求,但为了观察何时将新的内容插入数据库,并且您需要更新listView,我认为这是一种方法,但如果有人找到更好的方法,请发表评论:D
我希望这能帮你找到正确的方向
亲切问候。这就是我喜欢内容提供商的原因。。。你可以很容易地插入/更新/删除其他应用程序(如果你允许的话),但仍然可以了解其他应用程序的更改…在这种情况下,我必须使用数据库,而不是内容提供商。为什么?您可以在ContentProvider中包装数据库,然后在
update/inser/delete
中添加getContext().getContentResolver().notifyChange(uri)
,如果在query
中使用类似的uri
,则query/Cursor
将被通知更改。。。这在ListView中是受支持的,所以您不需要编写代码来刷新itcheck。。。这是我的助手库(带示例),它在运行时从Anotations自动生成内容提供者我只是好奇,但我的回答有帮助吗?你找到问题的答案了吗?这就是为什么我喜欢内容提供商。。。你可以很容易地插入/更新/删除其他应用程序(如果你允许的话),但仍然可以了解其他应用程序的更改…在这种情况下,我必须使用数据库,而不是内容提供商。为什么?您可以在ContentProvider中包装数据库,然后在update/inser/delete
中添加getContext().getContentResolver().notifyChange(uri)
,如果在query
中使用类似的uri
,则query/Cursor
将被通知更改。。。这在ListView中是受支持的,所以您不需要编写代码来刷新itcheck。。。这是我的助手库(带示例),它在运行时从Anotations自动生成内容提供者我只是好奇,但我的回答有帮助吗?您找到问题的解决方案了吗?困扰我的是,您用于初始化MessageDataSource
的上下文可能会变得无效(例如,活动重新启动)。因此,我将在类中创建MessageDataSource
的实例