ShadowSQLiteCursor.java revision b0b6ef0508aac9638763141f2f23c79482b1ead2
1b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesipackage com.xtremelabs.robolectric.shadows; 2b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi 3e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultzimport android.database.sqlite.SQLiteCursor; 4e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultzimport com.xtremelabs.robolectric.internal.Implementation; 5e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultzimport com.xtremelabs.robolectric.internal.Implements; 6b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawalaimport org.h2.jdbc.JdbcClob; 7e2623f9312670f0df22c6e6c5f7969bd01d18130Joe Moore & Tyler Schultz 8bdb2b1d336367115dee931221ea77fe1833607daChris Van Vrankenimport java.sql.Connection; 93f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultzimport java.sql.ResultSet; 103f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultzimport java.sql.ResultSetMetaData; 113f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultzimport java.sql.SQLException; 12bdb2b1d336367115dee931221ea77fe1833607daChris Van Vrankenimport java.sql.Statement; 13b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vrankenimport java.util.HashMap; 14b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vrankenimport java.util.Map; 15b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken 16132d4264fdf1ae13da2115b1a4240ea98a936d88Michael Portuesi/** 17132d4264fdf1ae13da2115b1a4240ea98a936d88Michael Portuesi * Simulates an Android Cursor object, by wrapping a JDBC ResultSet. 18132d4264fdf1ae13da2115b1a4240ea98a936d88Michael Portuesi */ 19b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi@Implements(SQLiteCursor.class) 20b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesipublic class ShadowSQLiteCursor extends ShadowAbstractCursor { 21b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi 223f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz private ResultSet resultSet; 23b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken 2423c888fc3422c493d25dab19a0842dc591243096Chris Van Vranken 25bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken /** 26bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken * Stores the column names so they are retrievable after the resultSet has closed 27bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken */ 28bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken private void cacheColumnNames(ResultSet rs) { 29bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken try { 30bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken ResultSetMetaData metaData = rs.getMetaData(); 31b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken int columnCount = metaData.getColumnCount(); 32b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken columnNameArray = new String[columnCount]; 333f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz for (int columnIndex = 1; columnIndex <= columnCount; columnIndex++) { 342e4dd19a1a59a2489c76d8ac359b4ab52027e509Chris Van Vranken String cName = metaData.getColumnName(columnIndex).toLowerCase(); 352e4dd19a1a59a2489c76d8ac359b4ab52027e509Chris Van Vranken this.columnNames.put(cName, columnIndex-1); 36b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken this.columnNameArray[columnIndex-1]=cName; 373f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 383f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } catch (SQLException e) { 39bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken throw new RuntimeException("SQL exception in cacheColumnNames", e); 403f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 413f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 42bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken 43b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken 443f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 45b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken 46b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken private Integer getColIndex(String columnName) { 473f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz if (columnName == null) { 483f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz return -1; 493f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 5055fc1ea619eb28eec3a75c5efaf0d75bed8c9f13Chris Van Vranken 5155fc1ea619eb28eec3a75c5efaf0d75bed8c9f13Chris Van Vranken Integer i = this.columnNames.get(columnName.toLowerCase()); 52b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken if (i==null) return -1; 53b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken return i; 54b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken } 55b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken 56b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken @Implementation 57b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken public int getColumnIndex(String columnName) { 58b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken return getColIndex(columnName); 593f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 603f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 613f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Implementation 623f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public int getColumnIndexOrThrow(String columnName) { 63b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken Integer columnIndex = getColIndex(columnName); 643f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz if (columnIndex == -1) { 653f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz throw new IllegalArgumentException("Column index does not exist"); 663f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 673f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz return columnIndex; 683f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 693f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 70b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi @Implementation 71b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi @Override 72b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi public final boolean moveToFirst() { 733f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz return super.moveToFirst(); 74b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi } 75b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi 76b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi @Implementation 77b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi @Override 78b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi public boolean moveToNext() { 793f7f8f983b5a02d94c2cd55c5202c38605f7169cChris Van Vranken return super.moveToNext(); 803f7f8f983b5a02d94c2cd55c5202c38605f7169cChris Van Vranken } 813f7f8f983b5a02d94c2cd55c5202c38605f7169cChris Van Vranken 823f7f8f983b5a02d94c2cd55c5202c38605f7169cChris Van Vranken @Implementation 833f7f8f983b5a02d94c2cd55c5202c38605f7169cChris Van Vranken @Override 84415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi public boolean moveToPrevious() { 85415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi return super.moveToPrevious(); 86415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi } 87415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi 88415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi @Implementation 89415cfefe7cc3be5f1748a98d2247779f935ea22fMichael Portuesi @Override 905c64020aebafacaa7677f81c044ca22cb1694539Michael Portuesi public boolean moveToPosition(int pos) { 915c64020aebafacaa7677f81c044ca22cb1694539Michael Portuesi return super.moveToPosition(pos); 925c64020aebafacaa7677f81c044ca22cb1694539Michael Portuesi } 93b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi 943f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Implementation 953f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public byte[] getBlob(int columnIndex) { 96b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken checkPosition(); 97b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken return (byte[]) this.currentRow.get(getColumnNames()[columnIndex]); 98b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi } 99b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi 1003f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Implementation 101b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi public String getString(int columnIndex) { 102b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala checkPosition(); 103b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala Object value = this.currentRow.get(getColumnNames()[columnIndex]); 104b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala if (value instanceof JdbcClob) { 105b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala try { 106b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala return ((JdbcClob) value).getSubString(1, (int)((JdbcClob) value).length()); 107b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala } catch (SQLException x) { 108b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala throw new RuntimeException(x); 109b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala } 110b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala } else { 111b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala return (String)value; 112b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala } 1133f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 114b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken 115b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken @Implementation 116b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken public short getShort(int columnIndex) { 117b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken checkPosition(); 1186a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken Object o =this.currentRow.get(getColumnNames()[columnIndex]); 1196a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken if (o==null) return 0; 1206a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken return new Short(o.toString()); 121b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken } 122b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken 1233f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Implementation 124b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi public int getInt(int columnIndex) { 125b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken checkPosition(); 1266a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken Object o =this.currentRow.get(getColumnNames()[columnIndex]); 1276a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken if (o==null) return 0; 1286a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken return new Integer(o.toString()); 1293f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 1303f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 1313f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Implementation 132b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi public long getLong(int columnIndex) { 133b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken checkPosition(); 1346a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken Object o =this.currentRow.get(getColumnNames()[columnIndex]); 1356a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken if (o==null) return 0; 1366a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken return new Long(o.toString()); 1373f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 1383f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 1393f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Implementation 1403f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public float getFloat(int columnIndex) { 141b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken checkPosition(); 1426a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken Object o =this.currentRow.get(getColumnNames()[columnIndex]); 1436a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken if (o==null) return 0; 1446a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken return new Float(o.toString()); 1456a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken 1463f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 1473f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 1483f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Implementation 1493f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public double getDouble(int columnIndex) { 150b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken checkPosition(); 1516a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken Object o =this.currentRow.get(getColumnNames()[columnIndex]); 1526a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken if (o==null) return 0; 1536a1483708e718f09c6e5136ff9c2831ebb1e2b22Chris Van Vranken return new Double(o.toString()); 154b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken } 155b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken 156b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken private void checkPosition() { 1571089c0f7ebc8a98939b49982656e3dc4dbe8291dChris Van Vranken if (-1 == currentRowNumber || getCount() == currentRowNumber) { 1581089c0f7ebc8a98939b49982656e3dc4dbe8291dChris Van Vranken throw new IndexOutOfBoundsException(currentRowNumber + " " + getCount()); 1593f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 1603f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 1613f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 1623f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Implementation 1633f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public void close() { 1643f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz if (resultSet == null) { 1653f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz return; 1663f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 1673f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 1683f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz try { 1693f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz resultSet.close(); 1703f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz resultSet = null; 171b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken rows = null; 172b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken currentRow = null; 1733f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } catch (SQLException e) { 1743f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz throw new RuntimeException("SQL exception in close", e); 1753f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 1763f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 1773f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 1783f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Implementation 1793f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public boolean isClosed() { 1803f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz return (resultSet == null); 1813f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 1823f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 1833f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz @Implementation 1843f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public boolean isNull(int columnIndex) { 185b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken Object o = this.currentRow.get(getColumnNames()[columnIndex]); 186b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken return o == null; 1873f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 1883f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz 1893f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz /** 1903f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz * Allows test cases access to the underlying JDBC ResultSet, for use in 191b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi * assertions. 192b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi * 1933f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz * @return the result set 1943f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz */ 1953f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz public ResultSet getResultSet() { 1963f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz return resultSet; 1973f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 198bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken 199bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken /** 200bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken * Allows test cases access to the underlying JDBC ResultSetMetaData, for use in 201bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken * assertions. Available even if cl 202bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken * 203bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken * @return the result set 204bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken */ 205bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken public ResultSet getResultSetMetaData() { 206bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken return resultSet; 207b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken } 208b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken 209b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken /** 210b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken * loads a row's values 211b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken * @param rs 212b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken * @return 213b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken * @throws SQLException 214b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken */ 215b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken private Map<String,Object> fillRowValues(ResultSet rs) throws SQLException { 216b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken Map<String,Object> row = new HashMap<String,Object>(); 217b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken for (String s : getColumnNames()) { 218b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken row.put(s, rs.getObject(s)); 219b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken } 220b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken return row; 221b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken } 222b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken private void fillRows(String sql, Connection connection) throws SQLException { 223a18b850f368f1d491b024561e2087569d3c636a8Chris Van Vranken //ResultSets in SQLite\Android are only TYPE_FORWARD_ONLY. Android caches results in the WindowedCursor to allow moveToPrevious() to function. 224a18b850f368f1d491b024561e2087569d3c636a8Chris Van Vranken //Robolectric will have to cache the results too. In the rows map. 225bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken Statement statement = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY); 226bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken ResultSet rs = statement.executeQuery(sql); 227bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken int count = 0; 228b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken if (rs.next()) { 229b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken do { 230b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken Map<String,Object> row = fillRowValues(rs); 231b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken rows.put(count, row); 232a18b850f368f1d491b024561e2087569d3c636a8Chris Van Vranken count++; 233bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken } while (rs.next()); 234bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken } else { 235a18b850f368f1d491b024561e2087569d3c636a8Chris Van Vranken rs.close(); 236bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken } 237bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken 238bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken rowCount = count; 239bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken 240bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken } 241bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken 2423c12685104bc2899a199fbb057ca5d58d171cdf1Chris Van Vranken public void setResultSet(ResultSet result, String sql) { 2433f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz this.resultSet = result; 2443f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz rowCount = 0; 2456b5fd00c7307500336dd8a8dbf002c3169c0d5f2Chris Van Vranken 246b970da24960c184335a2aba413e3f5bfbbed7825Chris Van Vranken //Cache all rows. Caching rows should be thought of as a simple replacement for ShadowCursorWindow 2473f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz if (resultSet != null) { 248bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken cacheColumnNames(resultSet); 249bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken try { 250b0b6ef0508aac9638763141f2f23c79482b1ead2Lenny Turetsky & Rick Kawala fillRows(sql, result.getStatement().getConnection()); 251bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken } catch (SQLException e) { 252bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken throw new RuntimeException("SQL exception in setResultSet", e); 253bdb2b1d336367115dee931221ea77fe1833607daChris Van Vranken } 2543f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 2553f9ddcc54cfbf81115466d6cab8a4287b2eae67fPhil Goodwin & Tyler Schultz } 256b574da97569d2d098d0aaebbb947bffa8514a4f7Michael Portuesi} 257