Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android SQLite的ContentObserver?_Android_Observer Pattern_Android Sqlite_Android Cursoradapter - Fatal编程技术网

Android SQLite的ContentObserver?

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号聊天室,并相应地重新排列单元格 我知道加载器可以在后台重新查询,但正如我的文章中回答的,加载器似乎还不够好 实时观察数据库更改是否有不同的机

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

假设我有一个聊天应用程序,它显示了我所属的所有聊天室的列表视图

适配器的查询是
SELECT*FROM CHAT\u ORDER BY update\u TIME
,这意味着我希望首先显示最近有活动的聊天室。当我在聊天室列表活动中时,3号聊天室收到一条消息,这意味着它现在需要成为1号聊天室,并相应地重新排列单元格

我知道加载器可以在后台重新查询,但正如我的文章中回答的,加载器似乎还不够好

实时观察数据库更改是否有不同的机制

我做这件事的方式

  • 班级集体聊天活动
  • 类MessageDataSource
  • 类句柄消息
GroupChat活动有点明显。 MessageDataSource从数据库插入和返回对象的类。 HandleNewMessage,我想我不需要解释这个

  • GroupChat->MessageDataSource->getMessages()
  • HandleNewMessage->MessageDataSource->insertNewMessage()
您现在想要的是GroupChat和HandleNewMessage与MessageDataSource的同一个实例进行对话。 因此,您要做的是在MessageDataSource中对MessageDataSource进行静态引用 例如:

因为你让你的构造函数私有化了,你不能这么做

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);
    }
}
您可以通过您认为需要的接口发送任意数量的对象。 现在,在您的群组聊天活动中,可以按照设置onClick侦听器的正常方式设置OnInserListener(在我的例子中)。或者,您可以让活动实现接口

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

我希望这能帮你找到正确的方向

亲切的问候。

我这样做了

  • 班级集体聊天活动
  • 类MessageDataSource
  • 类句柄消息
GroupChat活动有点明显。 MessageDataSource从数据库插入和返回对象的类。 HandleNewMessage,我想我不需要解释这个

  • GroupChat->MessageDataSource->getMessages()
  • HandleNewMessage->MessageDataSource->insertNewMessage()
您现在想要的是GroupChat和HandleNewMessage与MessageDataSource的同一个实例进行对话。 因此,您要做的是在MessageDataSource中对MessageDataSource进行静态引用 例如:

因为你让你的构造函数私有化了,你不能这么做

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);
    }
}
您可以通过您认为需要的接口发送任意数量的对象。 现在,在您的群组聊天活动中,可以按照设置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
的实例