android - SQLite 的 ContentObserver?

标签 android observer-pattern android-sqlite android-cursoradapter

我一直在研究如何在 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);

现在,您的类 GroupActivityHandleNewMessage 可以与 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/

相关文章:

c# - C# observer/observable with delegates 的 super 简单示例

c++ - 具有不同通知的观察者模式

java - 构建 Observer 和 Observable 类

android - 在预创建的 SQLite 数据库上从 android 应用程序文件夹存储和检索图像路径并将图像设置为 ImageView

android - 使用 cordova 插件初始化 Android In App Billing

Android将日志写入文本文件

java - Facebook API 如何等待 graphRequestexecuteAsync 完成

android - 使用 facebook sdk 3.0 for android 的登录问题

android - 如何在不使用 CONFLICT_REPLACE 的情况下获得 "insert or update"行为?

java - android.database.CursorIndexOutOfBoundsException异常