1

ormlite-extrasCursorLoaderライブラリを使用してOrmliteを使用しています ( Android 2.2 以降をターゲットにするつもりなので、このパッケージを使用します)。support.extras

次の例外があります。

FATAL EXCEPTION: main
java.lang.IllegalArgumentException: column '_id' does not exist
    at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:314)
    at android.support.v4.widget.CursorAdapter.swapCursor(CursorAdapter.java:344)
    at rainstudios.meleo.ui.eventlv.EventLvFragment.onLoadFinished(EventLvFragment.java:274)
    at rainstudios.meleo.ui.eventlv.EventLvFragment.onLoadFinished(EventLvFragment.java:1)
    at android.support.v4.app.LoaderManagerImpl$LoaderInfo.callOnLoadFinished(LoaderManager.java:427)
    at android.support.v4.app.LoaderManagerImpl$LoaderInfo.onLoadComplete(LoaderManager.java:395)
    at android.support.v4.content.Loader.deliverResult(Loader.java:103)
    at rainstudios.meleo.data.RainstudiosOrmliteCursorLoader.deliverResult(RainstudiosOrmliteCursorLoader.java:68)
    at rainstudios.meleo.data.RainstudiosOrmliteCursorLoader.deliverResult(RainstudiosOrmliteCursorLoader.java:1)
    at android.support.v4.content.AsyncTaskLoader.dispatchOnLoadComplete(AsyncTaskLoader.java:221)
    at android.support.v4.content.AsyncTaskLoader$LoadTask.onPostExecute(AsyncTaskLoader.java:61)
    at android.support.v4.content.ModernAsyncTask.finish(ModernAsyncTask.java:461)
    at android.support.v4.content.ModernAsyncTask.access$500(ModernAsyncTask.java:47)
    at android.support.v4.content.ModernAsyncTask$InternalHandler.handleMessage(ModernAsyncTask.java:474)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:130)
    at android.app.ActivityThread.main(ActivityThread.java:3835)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:847)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:605)
    at dalvik.system.NativeStart.main(Native Method)

私はいくつかの掘り下げを行い、CursorLoader のコードによって返されたに実際に'_id'は存在しないことに気付きました。results

詳細については、上記のコードを参照してください。

/* Runs on a worker thread */
@Override
public Cursor loadInBackground() {
    Cursor cursor = null;
    try {
        CloseableIterator<T> iterator = mDao.iterator(mQuery);

        // get the raw results which can be cast under Android
        AndroidDatabaseResults results = (AndroidDatabaseResults) iterator
                .getRawResults();
        cursor = results.getRawCursor();
    } catch (SQLException e) {
        e.printStackTrace();
    }
    if (cursor != null) {
        // Ensure the cursor window is filled
        cursor.getCount();
        registerContentObserver(cursor, mObserver);
    }
    return cursor;
}

デバッガーを使用すると、次のように表示されます。

results.columnNameMap = [id, code, name, popular, rating, voteCount, shortDescription, description, hoursDescription, url, modificationDate, syncDate, artist_id, district_id, pictures, frontPicture, userRating, venue_id, userComment, userFavorite, situation_id, caFrontPictureId, caResources]

results.columnNames = {syncDate=11, userRating=16, district_id=13, pictures=14, userFavorite=19, artist_id=12, code=1, situation_id=20, frontPicture=15, voteCount=5, url=9, caResources=22, id=0, hoursDescription=8, userComment=18, shortDescription=6, description=7, popular=3, name=2, venue_id=17, rating=4, caFrontPictureId=21, modificationDate=10}

準備されたクエリの作成はかなり標準的です:

public PreparedQuery<EventDb> findAllEventsQuery() {
    try {

        QueryBuilder<EventDb, Integer> eventQb = getEventDao()
                .queryBuilder();
        return eventQb.prepare();

    } catch (Throwable e) {
        Out.handleSilentError("Cannot retrieve all events", e);
    }
    return null;
}

クエリを実行して結果を List として取得するテストを行いました。すべて正常に動作します。

今のところ、私は困惑しています。

その上、私は ormlite の専門家のために別のものを持っています.

  • を呼び出してイテレータを閉じることになっていますiterator.closeQuietly()か?
4

1 に答える 1

3

@patheticpatが指摘したように、解決策はstackoverflowで利用できます:AndroidのCursorAdapterを備えたORMLite

4.42で Cursor を使用するには、 id フィールドを _id という名前の列にマップする必要があります。Ormlite

このような :

@DatabaseTable(tableName = "event")
public class EventDb extends BaseDaoEnabled<EventDb, Integer> {

    @DatabaseField(generatedId = true, columnName = "_id")
    int id;

iterator.closeQuietly()注:クラッシュするため、呼び出すことはできません。もしそうなら、メモリリークがないことを願っています。

于 2013-01-22T17:32:10.303 に答える