現時点では、テーブルの一番上の行を見つけるクエリがあります。このクエリは、OnCreateLoader メソッドでローダーを使用して呼び出されます。
@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
// TODO Auto-generated method stub
int age = args.getInt("age");
int yearDay = args.getInt("year");
String sort = "(CASE WHEN DateSeen IS NULL "
+ "THEN 1 ELSE 0 END) DESC," + "DateSeen DESC," + "Abs((" + age
+ " * 365) - (Age * 365) + (" + yearDay
+ " - (Case When YearDay is null then " + yearDay
+ "- 50 ELSE Yearday END)))";
String[] projection = new String[] { DatabaseProvider.KEY_DESCRIPTION,
DatabaseProvider.KEY_INT_AGE, DatabaseProvider.KEY_INT_YEARDAY,
DatabaseProvider.KEY_ID };
return new CursorLoader(this, DatabaseProvider.CONTENT_URI, projection,
null, null, sort);
}
onLoadFinished メソッドでは、結果を画面にレンダリングしますが、行の DateSeen 列も更新します (更新してもこの行が再び表示されないようにするため)。
@Override
public void onLoadFinished(Loader<Cursor> arg0, Cursor c) {
// lots of code to display results in UI
// update SeenDate
c.moveToFirst();
String Id = c.getString(c.getColumnIndex(DatabaseProvider.KEY_ID));
ContentResolverCaller.UpdateDateSeen(Id);
}
私の問題 (少なくとも私は推測しています) は、結果の DateSeen 列が更新されたときです。これは、データが変更された場合にローダーが自動更新するコンテンツ オブザーバーを持っているためです。無限ループに。
私の質問は、ローダーの自動更新機能をオフにすることは可能ですか? ローダーをトリガーしてクエリを再度実行せずに、DateSeen 列を更新するにはどうすればよいですか?
編集: 問題が発生した場合に備えて、UpdateDateSeen メソッドを含めるのを忘れていました。それは以下のとおりです (私はすべての ContentResolver 呼び出しを保存するクラスを持っていますが、それが最善の解決策であるかどうかはわかりません - きちんとしているだけです)
public static int UpdateDateSeen(String Id) {
ContentValues cv = new ContentValues();
cv.put(DatabaseProvider.KEY_DATESEEN, new Date().getTime());
return context.getContentResolver().update(
Uri.withAppendedPath(DatabaseProvider.CONTENT_URI, Id), cv,
null, null);
}