2

我一直在研究如何在 ListView 中显示我的数据库中的数据,同时跟踪数据库中的更改。

假设我有一个聊天应用程序,它显示了我所属的所有聊天室的 ListView。

适配器的查询是SELECT * FROM CHAT_ROOM ORDER BY UPTDATE_TIME,这意味着我希望首先显示具有最近活动的聊天室。正如我在ChatroomListActivity收到 3 号聊天室的消息一样,这意味着它现在需要成为 1 号聊天室并相应地重新排列单元格。

我知道 Loaders 能够在后台重新查询,但正如我在上一个问题中回答的 commonsware一样,Loaders 似乎还不够好。

是否有不同的机制来实时观察数据库的变化?

4

1 回答 1

4

我做的方式

  • 类 GroupChatActivity
  • 类 MessageDataSource
  • 类句柄NewMessage

GroupChat 活动有点明显。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
    }
}

因为您将构造函数设为私有,所以您不能这样做

MessageDataSource data = new MessageDataSource(context);

因为构造函数是私有的,所以你必须这样做

MessageDataSource data = MessageDataSource.getInstance(context);

现在,您的GroupActivityHandleNewMessage类可以与 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 的正常方式一样。或者你可以让你 Activity 实现接口。

此示例可能无法满足您的确切需求,但要观察何时将新内容插入您的数据库并且您需要更新您的 listView,我认为这是要走的路,但如果有人找到更好的方法,请发表评论。:D

我希望这可以使您朝着正确的方向前进。

亲切的问候。

于 2012-11-21T07:58:08.123 回答