diff --git a/src/net/sqlcipher/AbstractCursor.java b/src/net/sqlcipher/AbstractCursor.java index 45cae57a..9a74561a 100644 --- a/src/net/sqlcipher/AbstractCursor.java +++ b/src/net/sqlcipher/AbstractCursor.java @@ -209,40 +209,7 @@ public final boolean moveToPosition(int position) { * @param window */ public void fillWindow(int position, android.database.CursorWindow window) { - if (position < 0 || position >= getCount()) { - return; - } - window.acquireReference(); - try { - int oldpos = mPos; - mPos = position - 1; - window.clear(); - window.setStartPosition(position); - int columnNum = getColumnCount(); - window.setNumColumns(columnNum); - while (moveToNext() && window.allocRow()) { - for (int i = 0; i < columnNum; i++) { - String field = getString(i); - if (field != null) { - if (!window.putString(field, mPos, i)) { - window.freeLastRow(); - break; - } - } else { - if (!window.putNull(mPos, i)) { - window.freeLastRow(); - break; - } - } - } - } - - mPos = oldpos; - } catch (IllegalStateException e){ - // simply ignore it - } finally { - window.releaseReference(); - } + DatabaseUtils.cursorFillWindow(this, position, window); } public final boolean move(int offset) { diff --git a/src/net/sqlcipher/CrossProcessCursorWrapper.java b/src/net/sqlcipher/CrossProcessCursorWrapper.java index aeebb176..76581b57 100644 --- a/src/net/sqlcipher/CrossProcessCursorWrapper.java +++ b/src/net/sqlcipher/CrossProcessCursorWrapper.java @@ -16,37 +16,7 @@ public CursorWindow getWindow() { @Override public void fillWindow(int position, CursorWindow window) { - if (position < 0 || position > getCount()) { - return; - } - window.acquireReference(); - try { - moveToPosition(position - 1); - window.clear(); - window.setStartPosition(position); - int columnNum = getColumnCount(); - window.setNumColumns(columnNum); - while (moveToNext() && window.allocRow()) { - for (int i = 0; i < columnNum; i++) { - String field = getString(i); - if (field != null) { - if (!window.putString(field, getPosition(), i)) { - window.freeLastRow(); - break; - } - } else { - if (!window.putNull(getPosition(), i)) { - window.freeLastRow(); - break; - } - } - } - } - } catch (IllegalStateException e) { - // simply ignore it - } finally { - window.releaseReference(); - } + DatabaseUtils.cursorFillWindow(this, position, window); } @Override diff --git a/src/net/sqlcipher/DatabaseUtils.java b/src/net/sqlcipher/DatabaseUtils.java index ceaf5e13..6ed8b15c 100644 --- a/src/net/sqlcipher/DatabaseUtils.java +++ b/src/net/sqlcipher/DatabaseUtils.java @@ -16,8 +16,6 @@ package net.sqlcipher; -import android.database.Cursor; - import net.sqlcipher.database.SQLiteAbortException; import net.sqlcipher.database.SQLiteConstraintException; import net.sqlcipher.database.SQLiteDatabase; @@ -1137,6 +1135,64 @@ public void close() { } } + public static void cursorFillWindow(final Cursor cursor, + int position, final android.database.CursorWindow window) { + if (position < 0 || position >= cursor.getCount()) { + return; + } + final int oldPos = cursor.getPosition(); + final int numColumns = cursor.getColumnCount(); + window.clear(); + window.setStartPosition(position); + window.setNumColumns(numColumns); + if (cursor.moveToPosition(position)) { + do { + if (!window.allocRow()) { + break; + } + for (int i = 0; i < numColumns; i++) { + final int type = cursor.getType(i); + final boolean success; + switch (type) { + case Cursor.FIELD_TYPE_NULL: + success = window.putNull(position, i); + break; + + case Cursor.FIELD_TYPE_INTEGER: + success = window.putLong(cursor.getLong(i), position, i); + break; + + case Cursor.FIELD_TYPE_FLOAT: + success = window.putDouble(cursor.getDouble(i), position, i); + break; + + case Cursor.FIELD_TYPE_BLOB: { + final byte[] value = cursor.getBlob(i); + success = value != null ? window.putBlob(value, position, i) + : window.putNull(position, i); + break; + } + + default: // assume value is convertible to String + case Cursor.FIELD_TYPE_STRING: { + final String value = cursor.getString(i); + success = value != null ? window.putString(value, position, i) + : window.putNull(position, i); + break; + } + } + if (!success) { + window.freeLastRow(); + break; + } + } + position += 1; + } while (cursor.moveToNext()); + } + cursor.moveToPosition(oldPos); + } + + /** * Creates a db and populates it with the sql statements in sqlStatements. *