我正在使用自定义内容提供程序和CursorLoader来显示片段中的元素列表。
首先,CursorLoader调用ContentProvider的query()来获取存储在我的数据库中的所有元素。在我的query()函数中,我启动一个线程,它执行WebService调用以更新数据库中的元素。该线程正在解析WebServices的响应并调用我的ContentProviders bulkInsert()。
当我的bulkInsert()完成后,我调用notifyChange()。
现在发生了什么:我看到在notifyChange()之后,我的ContentProvider的query()方法再次被调用,这导致了一个新的WebService调用,依此类推。
这是我在ContentProvider中的query()方法:
...
// Database query
ticketCursor = mDb.query(TBL_TICKET_NAME, projection, selection, selectionArgs, null, null, orderBy);
// set Notification URI
ticketCursor.setNotificationUri(getContext().getContentResolver(), TICKET_CONTENT_URI);
// WebService call --> This starts a new Thread for the WebService call
asyncSoapQuery(where, uri);
return ticketCursor;
我的bulkInsert方法如下所示:
mDb.beginTransaction();
for (ContentValues value : values) {
mDb.insertWithOnConflict(table, null, value, SQLiteDatabase.CONFLICT_REPLACE);
}
mDb.setTransactionSuccessful();
getContext().getContentResolver().notifyChange(TICKET_CONTENT_URI, null);
mDb.endTransaction();
return values.length();
所以,我的问题是这会导致无休止的webservice调用循环。我想,notifyChange()没有再次调用内容提供者的query()方法。如果用户在我的UI上点击“刷新”,我只想再次在我的query()中进行WS调用... 我在这里缺少什么?
提前感谢您的帮助!
答案 0 :(得分:0)
我有同样的问题,但我在内容提供商中使用insert()而不是applyBatch()。我设法通过更改
来解决我的问题mDb.insertWithOnConflict(table, null, value, SQLiteDatabase.CONFLICT_REPLACE);
到
long rowId = mDb.insertWithOnConflict(table, null, value, SQLiteDatabase.CONFLICT_IGNORE);
我的下一步是检查rowId是否大于零。只有当它大于零时才执行
getContext().getContentResolver().notifyChange
所以它是这样的:
if (rowId > 0) {
notifyChange(uri);
return uri;
} else {
return null;
}