在notifyChange()之后再次调用query()

时间:2013-11-04 13:10:29

标签: android android-contentprovider android-cursorloader

我正在使用自定义内容提供程序和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调用... 我在这里缺少什么?

提前感谢您的帮助!

1 个答案:

答案 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;
    }