2

我正在使用自定义内容提供程序和 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();

所以,我的问题是这会导致网络服务调用的无限循环。我认为 notifyChange() 不会再次调用内容提供者的 query() 方法。如果用户在我的 UI 上点击“刷新”,我只想在我的 query() 中再次进行 WS 调用......我在这里错过了什么?

在此先感谢您的帮助!

4

1 回答 1

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;
    }
于 2014-07-15T14:31:26.480 回答