【发布时间】:2015-02-20 04:04:03
【问题描述】:
我有一种情况,我需要在某个日期插入一行并在活动中的特定日期之后更新所有条目。
为此,我想我会使用LoaderManager 回调加载日期之后的条目,并使用ContentProviderOperation 数组从onLoadFinished() 方法中批量更新所有条目。
我面临的问题是我的光标有setNotificationUri,因此再次调用onLoadfinished,它再次插入行并继续循环(不设置通知Uri不是我的选择)。
是否有任何优雅的解决方案来停止递归调用?
下面是我的onCreateLoader和onLoadFinished的简化代码:
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
//retrieve data before the start date
mStartDate = ProjectContract.getDateFromDb(mUserProjectEntryData.getAsString(ProjectContract.ProjectEntryTable.COLUMN_DATETEXT));
Date nextDate = Utilities.addDays(mStartDate,1);
String sortOrder = ProjectContract.ProjectEntryTable.COLUMN_DATETEXT + " ASC";
Uri projectEntryUri = ProjectContract.ProjectEntryTable.buildProjectEntryWithStartDateUri(mProjectId,
ProjectContract.getDbDateString(nextDate));
return new CursorLoader(
this,
projectEntryUri,
PROJECT_ENTRY_COLUMNS,
null,
null,
sortOrder
);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
mDbOperations = new ArrayList<ContentProviderOperation>();
long newTotalCount;
String selection = ProjectContract.ProjectEntryTable.COLUMN_PROJECT_ID + " = ? AND "
+ ProjectContract.ProjectEntryTable.COLUMN_DATETEXT + " = ? ";
//Some code to calculate the entry needed
mDbOperations.add(
ContentProviderOperation.newInsert(ProjectContract.ProjectEntryTable.CONTENT_URI)
.withValues(mUserProjectEntryData)
.withYieldAllowed(true)
.build()
);
while (data.moveToNext()) {
data.getString(COL_DATETEXT));
newTotalCount = mCurrentWordCount + data.getLong(COL_WORD_COUNT);
mDbOperations.add(ContentProviderOperation.newUpdate(ProjectContract.ProjectEntryTable.CONTENT_URI)
.withValue(ProjectContract.ProjectEntryTable.COLUMN_TOTAL_WORD_COUNT, newTotalCount)
.withSelection(selection, new String[]{
Long.toString(data.getLong(COL_PROJECT_ID)),
data.getString(COL_DATETEXT)
})
.build());
}
//Hacky solution I put in just to make the code working.
// data.close();
try {
getContentResolver().applyBatch(ProjectContract.CONTENT_AUTHORITY, mDbOperations);
} catch (RemoteException e) {
e.printStackTrace();
} catch (OperationApplicationException e) {
e.printStackTrace();
}
}
【问题讨论】:
-
cursor = contentresolver.query(); iterate cursor; cursor.close();在其他线程中......根本没有加载器...... -
我会尝试使用 AsyncTask .. 这样可以吗?在 doInBackground 中调用 Content 提供程序并遍历 onPostExecute 中的光标......因为我的查询很小,它应该可以正常工作。但是如果它很大并且屏幕旋转会弄乱 AsyncTask 实现呢?
-
no... 在 doInBackground 中执行所有操作 ... 不涉及 UI(或者如果您需要通知 UI 在 onPostExecute 中执行 - 不要在那里迭代)... 或者只是 @987654332 @ ...哦,我看到了您的编辑... AsyncTask 应该保留commonsware.com/blog/2010/09/10/asynctask-screen-rotation.html
-
嗯..让我尝试实现它...谢谢:)
标签: android cursor android-contentprovider loader android-cursorloader