首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ContentObserver for SQLite?

ContentObserver for SQLite?
EN

Stack Overflow用户
提问于 2012-11-21 07:12:01
回答 1查看 3.9K关注 0票数 2

我一直在研究如何在ListView中显示来自DB的数据,同时跟踪数据库中的变化。

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

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

我知道装载机能够在后台重新查询,但正如我的previous question here中回答的那样,装载机似乎还不够好。

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

EN

回答 1

Stack Overflow用户

发布于 2012-11-21 07:58:08

我就是这么做的

  • 类GroupChatActivity
  • 类MessageDataSource
  • 类HandleNewMessage

GroupChat的活动比较明显。MessageDataSource,从DB中插入和返回对象的类。HandleNewMessage,我不认为我需要解释这个。

  • GroupChat -> MessageDataSource -> getMessages()
  • HandleNewMessage -> MessageDataSource -> insertNewMessage();

您现在想要的是GroupChat & HandleNewMessage与MessageDataSource的同一个实例进行对话。因此,您要做的是在MessageDataSource示例中对MessageDataSource进行静态引用:

代码语言:javascript
复制
 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
    }
}

因为你把构造函数变成私有的,所以你做不到

代码语言:javascript
复制
MessageDataSource data = new MessageDataSource(context);

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

代码语言:javascript
复制
MessageDataSource data = MessageDataSource.getInstance(context);

现在,您的类GroupActivityHandleNewMessage可以与MessageDataSource的同一个实例对话,您可以创建一个自定义接口,通知任何观察侦听器。

示例:

代码语言:javascript
复制
    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的正常方式。或者你可以让你的活动实现接口。

这个例子并不能完全满足您的需要,但是要观察在DB中插入了什么新的内容,并且您需要更新您的listView,我认为这样做是可行的,但是如果有人找到了更好的方法,请评论。:D

我希望这能让你走上正确的方向。

致以亲切的问候。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13488090

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档