最小 API 10 で CursorLoader と LoaderManager を実装しようとしています。
ただし、AsyncTaskLoader.class の 63 行目で IllegalArgument Exception が発生し続けます (例外が発生している AsyncTaskLoader.class のソース コードは以下とこのリンクにあります。
/* Runs on the UI thread */
@Override
protected void onPostExecute(D data) {
if (DEBUG) Log.v(TAG, this + " onPostExecute");
try {
AsyncTaskLoader.this.dispatchOnLoadComplete(this, data);
} finally {
done.countDown();
}
}
以下は、エラー時のスタックです。
AsyncTaskLoader$LoadTask.onPostExecute(Object) line: 63
AsyncTaskLoader$LoadTask(ModernAsyncTask).finish(Object) line: 461
ModernAsyncTask.access$500(ModernAsyncTask, Object) line: 47
ModernAsyncTask$InternalHandler.handleMessage(Message) line: 474
ModernAsyncTask$InternalHandler(Handler).dispatchMessage(Message) line: 99
Looper.loop() line: 137
ActivityThread.main(String[]) line: 4424
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method]
Method.invoke(Object, Object...) line: 511
ZygoteInit$MethodAndArgsCaller.run() line: 784
ZygoteInit.main(String[]) line: 551
NativeStart.main(String[]) line: not available [native method]
コンテンツ プロバイダーをテストし、クエリ メソッドが Sqlite データベースから有効なカーソルを返すことを確認しました。以下は、CursorLoader と LoaderManager を実装しようとしているアクティビティのソース コードです。
import android.database.Cursor;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.CursorLoader;
import android.support.v4.content.Loader;
import android.support.v4.widget.SimpleCursorAdapter;
import android.widget.ListView;
public class Screen1_MainData extends FragmentActivity implements LoaderManager.LoaderCallbacks<Cursor> {
SimpleCursorAdapter adapter;
ListView lv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.screen1_maindata);
initLoader();
}
void initLoader() {
String[] uiBindFrom = { Useful_Info_TableMetaData.USEFUL_INFO_COLUMN_NAME };
int[] uiBindTo = { R.id.name };
lv = (ListView) findViewById(R.id.screen1_MainListView);
getSupportLoaderManager().initLoader(0, null, this);
adapter = new SimpleCursorAdapter(this, R.layout.row, null, uiBindFrom,
uiBindTo, 0);
lv.setAdapter(adapter);
}
@Override
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) {
String[] projection = { Useful_Info_TableMetaData.USEFUL_INFO_COLUMN_NAME };
return new CursorLoader(
this, // The Activity context
Useful_Info_TableMetaData.CONTENT_URI, projection, null, null,
null);
}
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
adapter.swapCursor(data);
}
@Override
public void onLoaderReset(Loader<Cursor> loader) {
adapter.swapCursor(null);
}
}
ここで私が間違っていることを誰かが見ていますか?
ありがとう。
アプリはそれを作るようです
@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor data) {
adapter.swapCursor(data);
}
そして、そこで例外をスローします。
以下はlogcatです:
08-03 23:33:20.736: E/AndroidRuntime(17256): FATAL EXCEPTION: main
08-03 23:33:20.736: E/AndroidRuntime(17256): java.lang.IllegalArgumentException: column '_id' does not exist
08-03 23:33:20.736: E/AndroidRuntime(17256): at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:267)
08-03 23:33:20.736: E/AndroidRuntime(17256): at android.database.CursorWrapper.getColumnIndexOrThrow(CursorWrapper.java:78)
08-03 23:33:20.736: E/AndroidRuntime(17256): at android.support.v4.widget.CursorAdapter.swapCursor(CursorAdapter.java:344)
08-03 23:33:20.736: E/AndroidRuntime(17256): at android.support.v4.widget.SimpleCursorAdapter.swapCursor(SimpleCursorAdapter.java:326)