Android 为什么在内容提供者查询方法中通知侦听器?
Vogella有关于内容提供商的介绍,下面(底部)的代码段有以下几行:Android 为什么在内容提供者查询方法中通知侦听器?,android,android-contentprovider,Android,Android Contentprovider,Vogella有关于内容提供商的介绍,下面(底部)的代码段有以下几行: cursor.setNotificationUri(getContext().getContentResolver(),uri) 我很好奇为什么有人想通知侦听器查询操作 @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { //
cursor.setNotificationUri(getContext().getContentResolver(),uri)代码>
我很好奇为什么有人想通知侦听器查询操作
@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
// Using SQLiteQueryBuilder instead of query() method
SQLiteQueryBuilder queryBuilder = new SQLiteQueryBuilder();
// Check if the caller has requested a column which does not exists
checkColumns(projection);
// Set the table
queryBuilder.setTables(TodoTable.TABLE_TODO);
int uriType = sURIMatcher.match(uri);
switch (uriType) {
case TODOS:
break;
case TODO_ID:
// Adding the ID to the original query
queryBuilder.appendWhere(TodoTable.COLUMN_ID + "=" + uri.getLastPathSegment());
break;
default:
throw new IllegalArgumentException("Unknown URI: " + uri);
}
SQLiteDatabase db = database.getWritableDatabase();
Cursor cursor = queryBuilder.query(db, projection, selection, selectionArgs, null, null, sortOrder);
// Make sure that potential listeners are getting notified
cursor.setNotificationUri(getContext().getContentResolver(), uri);
return cursor;
}
它告诉游标要监视哪个uri,以便它知道其源数据何时更改。修改任何数据时,ContentProvider
通知ContentResolver
有关更改,然后ContentResolver
通知所有注册的观察者。然后,如果您有任何已注册观察者的游标加载程序
,可以通过此加载新数据(如果我可以这么大胆的话),更直接的解释是:
我假设OP想知道为什么查询要通知侦听器。没有。它并没有立即通知监听器,只是设置为在与光标关联的数据发生更改时触发监听器。侦听器附加到当前上下文的ContentResolver;setNotificationUri只是告诉听众“注意这个URI”的一种简便方法
在类似于CursorLoader的情况下,加载器会自动在ContentResolver的上下文中注册ContentObserver,然后加载器在执行查询时调用setNotificationUri。如果光标中的数据发生更改,ContentObserver将关闭,这将告诉加载程序重置并执行新的查询。我认为它会告诉观察者要监视哪些uri而不是光标。