package droidkit.sqlite; import android.annotation.SuppressLint; import android.database.Cursor; import android.provider.BaseColumns; import android.support.annotation.NonNull; import java.io.Closeable; import java.util.AbstractList; import java.util.concurrent.atomic.AtomicReference; /** * @author Daniel Serdyukov */ @SuppressLint("NewApi") public class SQLiteResult<T> extends AbstractList<T> implements Closeable, AutoCloseable { private final SQLiteTable<T> mTable; private final AtomicReference<Cursor> mCursorRef; private final int mRowIdColumnIndex; SQLiteResult(@NonNull SQLiteTable<T> table, @NonNull Cursor cursor) { mTable = table; mCursorRef = new AtomicReference<>(cursor); mRowIdColumnIndex = cursor.getColumnIndexOrThrow(BaseColumns._ID); SQLiteGuard.guard(this); } @Override public T get(int location) { final Cursor cursor = mCursorRef.get(); if (!cursor.moveToPosition(location)) { throw new ArrayIndexOutOfBoundsException(location); } final long rowId = cursor.getLong(mRowIdColumnIndex); T instance = mTable.getRow(rowId); if (instance == null) { instance = mTable.instantiate(cursor); } return instance; } @Override public int size() { final Cursor cursor = mCursorRef.get(); if (cursor != null && !cursor.isClosed()) { return cursor.getCount(); } return 0; } @Override public void close() { } @NonNull AtomicReference<Cursor> getCursorReference() { return mCursorRef; } }