11a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen/* 21a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen * Copyright (C) 2007 The Android Open Source Project 31a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen * 41a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen * Licensed under the Apache License, Version 2.0 (the "License"); 51a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen * you may not use this file except in compliance with the License. 61a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen * You may obtain a copy of the License at 71a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen * 81a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen * http://www.apache.org/licenses/LICENSE-2.0 91a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen * 101a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen * Unless required by applicable law or agreed to in writing, software 111a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen * distributed under the License is distributed on an "AS IS" BASIS, 121a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 131a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen * See the License for the specific language governing permissions and 141a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen * limitations under the License. 151a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen */ 161a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 171a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenpackage android.database; 181a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 191a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.content.ContentValues; 201a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.content.Context; 211a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.database.Cursor; 221a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.database.CursorIndexOutOfBoundsException; 231a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.database.DataSetObserver; 241a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.database.DatabaseUtils; 251a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.database.sqlite.SQLiteCursor; 261a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.database.sqlite.SQLiteCursorDriver; 271a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.database.sqlite.SQLiteDatabase; 281a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.database.sqlite.SQLiteQuery; 291a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.os.Looper; 301a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.test.AndroidTestCase; 311a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.test.PerformanceTestCase; 321a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.test.suitebuilder.annotation.LargeTest; 331a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.test.suitebuilder.annotation.MediumTest; 34f90177629a5b69ca3a80466c0ab55abfeb6d26b2Abodunrinwa Tokiimport android.test.suitebuilder.annotation.Suppress; 351a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport android.util.Log; 361a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 371a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport java.io.File; 386141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Noriimport java.util.ArrayList; 391a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport java.util.Arrays; 401a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenimport java.util.Random; 411a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 421a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyenpublic class DatabaseCursorTest extends AndroidTestCase implements PerformanceTestCase { 431a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 441a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen private static final String sString1 = "this is a test"; 451a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen private static final String sString2 = "and yet another test"; 461a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen private static final String sString3 = "this string is a little longer, but still a test"; 471a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 481a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen private static final int CURRENT_DATABASE_VERSION = 42; 491a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen private SQLiteDatabase mDatabase; 501a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen private File mDatabaseFile; 511a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 521a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen @Override 531a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen protected void setUp() throws Exception { 541a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen super.setUp(); 558a985d24ce9a38f40ed88fecbdcd0e75e3a68f44John Spurlock File dbDir = getContext().getDir("tests", Context.MODE_PRIVATE); 568a985d24ce9a38f40ed88fecbdcd0e75e3a68f44John Spurlock mDatabaseFile = new File(dbDir, "database_test.db"); 571a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 581a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen if (mDatabaseFile.exists()) { 591a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen mDatabaseFile.delete(); 601a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 611a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen mDatabase = SQLiteDatabase.openOrCreateDatabase(mDatabaseFile.getPath(), null); 621a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertNotNull(mDatabase); 631a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen mDatabase.setVersion(CURRENT_DATABASE_VERSION); 641a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 651a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 661a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen @Override 671a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen protected void tearDown() throws Exception { 681a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen mDatabase.close(); 691a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen mDatabaseFile.delete(); 701a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen super.tearDown(); 711a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 721a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 731a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen public boolean isPerformanceOnly() { 741a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen return false; 751a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 761a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 771a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen // These test can only be run once. 781a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen public int startPerformance(Intermediates intermediates) { 791a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen return 1; 801a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 811a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 821a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen private void populateDefaultTable() { 831a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, data TEXT);"); 841a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 851a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen mDatabase.execSQL("INSERT INTO test (data) VALUES ('" + sString1 + "');"); 861a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen mDatabase.execSQL("INSERT INTO test (data) VALUES ('" + sString2 + "');"); 871a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen mDatabase.execSQL("INSERT INTO test (data) VALUES ('" + sString3 + "');"); 881a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 891a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 901a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen @MediumTest 911a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen public void testBlob() throws Exception { 921a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen // create table 931a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen mDatabase.execSQL( 941a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen "CREATE TABLE test (_id INTEGER PRIMARY KEY, s TEXT, d REAL, l INTEGER, b BLOB);"); 951a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen // insert blob 961a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen Object[] args = new Object[4]; 971a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 981a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen byte[] blob = new byte[1000]; 991a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen byte value = 99; 1001a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen Arrays.fill(blob, value); 1011a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen args[3] = blob; 1021a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 1031a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen String s = new String("text"); 1041a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen args[0] = s; 1051a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen Double d = 99.9; 1061a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen args[1] = d; 1071a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen Long l = (long)1000; 1081a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen args[2] = l; 1091a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 1101a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen String sql = "INSERT INTO test (s, d, l, b) VALUES (?,?,?,?)"; 1111a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen mDatabase.execSQL(sql, args); 1121a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen // use cursor to access blob 1131a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen Cursor c = mDatabase.query("test", null, null, null, null, null, null); 1141a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.moveToNext(); 1151a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen ContentValues cv = new ContentValues(); 1161a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen DatabaseUtils.cursorRowToContentValues(c, cv); 1171a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 1181a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen int bCol = c.getColumnIndexOrThrow("b"); 1191a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen int sCol = c.getColumnIndexOrThrow("s"); 1201a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen int dCol = c.getColumnIndexOrThrow("d"); 1211a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen int lCol = c.getColumnIndexOrThrow("l"); 1221a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen byte[] cBlob = c.getBlob(bCol); 1231a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertTrue(Arrays.equals(blob, cBlob)); 1241a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(s, c.getString(sCol)); 1251a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals((double)d, c.getDouble(dCol)); 1267cd51efcbd2d083bf577696591ef1769034f7e2fJeff Hamilton assertEquals((long)l, c.getLong(lCol)); 1271a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 1281a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 1291a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen @MediumTest 1301a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen public void testRealColumns() throws Exception { 1311a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, data REAL);"); 1321a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen ContentValues values = new ContentValues(); 1331a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen values.put("data", 42.11); 1341a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen long id = mDatabase.insert("test", "data", values); 1351a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertTrue(id > 0); 1361a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen Cursor c = mDatabase.rawQuery("SELECT data FROM test", null); 1371a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertNotNull(c); 1381a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertTrue(c.moveToFirst()); 1391a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(42.11, c.getDouble(0)); 1401a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.close(); 1411a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 1421a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 1431a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen @MediumTest 1441a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen public void testCursor1() throws Exception { 1451a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen populateDefaultTable(); 1461a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 1471a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen Cursor c = mDatabase.query("test", null, null, null, null, null, null); 1481a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 1491a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen int dataColumn = c.getColumnIndexOrThrow("data"); 1501a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 1511a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen // The cursor should ignore text before the last period when looking for a column. (This 1521a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen // is a temporary hack in all implementations of getColumnIndex.) 1531a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen int dataColumn2 = c.getColumnIndexOrThrow("junk.data"); 1541a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(dataColumn, dataColumn2); 1551a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 1561a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertSame(3, c.getCount()); 1571a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 1581a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertTrue(c.isBeforeFirst()); 1591a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 1601a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen try { 1611a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.getInt(0); 1621a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen fail("CursorIndexOutOfBoundsException expected"); 1631a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } catch (CursorIndexOutOfBoundsException ex) { 1641a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen // expected 1651a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 1661a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 1671a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.moveToNext(); 1681a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(1, c.getInt(0)); 1691a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 1701a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen String s = c.getString(dataColumn); 1711a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(sString1, s); 1721a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 1731a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.moveToNext(); 1741a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen s = c.getString(dataColumn); 1751a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(sString2, s); 1761a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 1771a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.moveToNext(); 1781a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen s = c.getString(dataColumn); 1791a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(sString3, s); 1801a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 1811a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.moveToPosition(-1); 1821a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.moveToNext(); 1831a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen s = c.getString(dataColumn); 1841a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(sString1, s); 1851a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 1861a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.moveToPosition(2); 1871a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen s = c.getString(dataColumn); 1881a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(sString3, s); 1891a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 1901a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen int i; 1911a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 1921a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen for (c.moveToFirst(), i = 0; !c.isAfterLast(); c.moveToNext(), i++) { 1931a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.getInt(0); 1941a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 1951a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 1961a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(3, i); 1971a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 1981a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen try { 1991a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.getInt(0); 2001a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen fail("CursorIndexOutOfBoundsException expected"); 2011a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } catch (CursorIndexOutOfBoundsException ex) { 2021a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen // expected 2031a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 2041a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.close(); 2051a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 2061a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 2071a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen @MediumTest 2081a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen public void testCursor2() throws Exception { 2091a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen populateDefaultTable(); 2101a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 2111a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen Cursor c = mDatabase.query("test", null, "_id > 1000", null, null, null, null); 2121a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(0, c.getCount()); 2131a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertTrue(c.isBeforeFirst()); 2141a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 2151a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen try { 2161a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.getInt(0); 2171a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen fail("CursorIndexOutOfBoundsException expected"); 2181a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } catch (CursorIndexOutOfBoundsException ex) { 2191a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen // expected 2201a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 2211a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 2221a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen int i; 2231a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen for (c.moveToFirst(), i = 0; !c.isAfterLast(); c.moveToNext(), i++) { 2241a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.getInt(0); 2251a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 2261a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(0, i); 2271a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen try { 2281a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.getInt(0); 2291a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen fail("CursorIndexOutOfBoundsException expected"); 2301a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } catch (CursorIndexOutOfBoundsException ex) { 2311a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen // expected 2321a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 2331a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.close(); 2341a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 2351a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 2361a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen @MediumTest 2371a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen public void testLargeField() throws Exception { 2381a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, data TEXT);"); 2391a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 2401a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen StringBuilder sql = new StringBuilder(2100); 2411a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen sql.append("INSERT INTO test (data) VALUES ('"); 2421a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen Random random = new Random(System.currentTimeMillis()); 2431a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen StringBuilder randomString = new StringBuilder(1979); 2441a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen for (int i = 0; i < 1979; i++) { 2451a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen randomString.append((random.nextInt() & 0xf) % 10); 2461a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 2471a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen sql.append(randomString); 2481a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen sql.append("');"); 2491a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen mDatabase.execSQL(sql.toString()); 2501a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 2511a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen Cursor c = mDatabase.query("test", null, null, null, null, null, null); 2521a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertNotNull(c); 2531a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(1, c.getCount()); 2541a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 2551a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertTrue(c.moveToFirst()); 2561a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(0, c.getPosition()); 2571a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen String largeString = c.getString(c.getColumnIndexOrThrow("data")); 2581a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertNotNull(largeString); 2591a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(randomString.toString(), largeString); 2601a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.close(); 2611a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 2621a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 2631a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen class TestObserver extends DataSetObserver { 2641a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen int total; 2651a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen SQLiteCursor c; 2661a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen boolean quit = false; 2671a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen public TestObserver(int total_, SQLiteCursor cursor) { 2681a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c = cursor; 2691a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen total = total_; 2701a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 2711a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 2721a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen @Override 2731a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen public void onChanged() { 2741a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen int count = c.getCount(); 2751a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen if (total == count) { 2761a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen int i = 0; 2771a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen while (c.moveToNext()) { 2781a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(i, c.getInt(1)); 2791a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen i++; 2801a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 2811a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(count, i); 2821a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen quit = true; 2831a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen Looper.myLooper().quit(); 2841a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 2851a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 2861a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 2871a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen @Override 2881a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen public void onInvalidated() { 2891a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 2901a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 2911a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 2921a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen @LargeTest 2931a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen public void testManyRowsLong() throws Exception { 2941a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, data INT);"); 2951a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 2961a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen final int count = 36799; 2975793a17366997060b34d1877380980683bacb965Vasu Nori mDatabase.execSQL("BEGIN Transaction;"); 2981a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen for (int i = 0; i < count; i++) { 2991a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen mDatabase.execSQL("INSERT INTO test (data) VALUES (" + i + ");"); 3001a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 3015793a17366997060b34d1877380980683bacb965Vasu Nori mDatabase.execSQL("COMMIT;"); 3021a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 3031a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen Cursor c = mDatabase.query("test", new String[]{"data"}, null, null, null, null, null); 3041a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertNotNull(c); 3051a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 3061a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen int i = 0; 3071a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen while (c.moveToNext()) { 3081a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(i, c.getInt(0)); 3091a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen i++; 3101a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 3111a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(count, i); 3121a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(count, c.getCount()); 3131a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 3141a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen Log.d("testManyRows", "count " + Integer.toString(i)); 3151a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.close(); 3161a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 3171a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 3181a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen @LargeTest 3191a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen public void testManyRowsTxt() throws Exception { 3201a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, data TEXT);"); 3211a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen StringBuilder sql = new StringBuilder(2100); 3221a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen sql.append("INSERT INTO test (data) VALUES ('"); 3231a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen Random random = new Random(System.currentTimeMillis()); 3241a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen StringBuilder randomString = new StringBuilder(1979); 3251a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen for (int i = 0; i < 1979; i++) { 3261a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen randomString.append((random.nextInt() & 0xf) % 10); 3271a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 3281a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen sql.append(randomString); 3291a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen sql.append("');"); 3301a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 3311a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen // if cursor window size changed, adjust this value too 3321a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen final int count = 600; // more than two fillWindow needed 3335793a17366997060b34d1877380980683bacb965Vasu Nori mDatabase.execSQL("BEGIN Transaction;"); 3341a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen for (int i = 0; i < count; i++) { 3351a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen mDatabase.execSQL(sql.toString()); 3361a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 3375793a17366997060b34d1877380980683bacb965Vasu Nori mDatabase.execSQL("COMMIT;"); 3381a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 3391a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen Cursor c = mDatabase.query("test", new String[]{"data"}, null, null, null, null, null); 3401a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertNotNull(c); 3411a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 3421a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen int i = 0; 3431a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen while (c.moveToNext()) { 3441a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(randomString.toString(), c.getString(0)); 3451a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen i++; 3461a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 3471a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(count, i); 3481a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(count, c.getCount()); 3491a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.close(); 3501a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 3511a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 3521a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen @LargeTest 3531a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen public void testManyRowsTxtLong() throws Exception { 3541a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, txt TEXT, data INT);"); 3551a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 3561a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen Random random = new Random(System.currentTimeMillis()); 3571a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen StringBuilder randomString = new StringBuilder(1979); 3581a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen for (int i = 0; i < 1979; i++) { 3591a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen randomString.append((random.nextInt() & 0xf) % 10); 3601a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 3611a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 3621a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen // if cursor window size changed, adjust this value too 3631a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen final int count = 600; 3645793a17366997060b34d1877380980683bacb965Vasu Nori mDatabase.execSQL("BEGIN Transaction;"); 3651a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen for (int i = 0; i < count; i++) { 3661a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen StringBuilder sql = new StringBuilder(2100); 3671a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen sql.append("INSERT INTO test (txt, data) VALUES ('"); 3681a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen sql.append(randomString); 3691a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen sql.append("','"); 3701a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen sql.append(i); 3711a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen sql.append("');"); 3721a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen mDatabase.execSQL(sql.toString()); 3731a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 3745793a17366997060b34d1877380980683bacb965Vasu Nori mDatabase.execSQL("COMMIT;"); 3751a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 3761a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen Cursor c = mDatabase.query("test", new String[]{"txt", "data"}, null, null, null, null, null); 3771a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertNotNull(c); 3781a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 3791a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen int i = 0; 3801a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen while (c.moveToNext()) { 3811a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(randomString.toString(), c.getString(0)); 3821a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(i, c.getInt(1)); 3831a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen i++; 3841a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 3851a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(count, i); 3861a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(count, c.getCount()); 3871a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.close(); 3881a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 3891a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 3901a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen @MediumTest 3911a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen public void testRequery() throws Exception { 3921a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen populateDefaultTable(); 3931a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 3941a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen Cursor c = mDatabase.rawQuery("SELECT * FROM test", null); 3951a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertNotNull(c); 3961a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(3, c.getCount()); 3971a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.deactivate(); 3981a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.requery(); 3991a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(3, c.getCount()); 4001a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.close(); 4011a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 4021a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 4031a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen @MediumTest 4041a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen public void testRequeryWithSelection() throws Exception { 4051a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen populateDefaultTable(); 4061a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 4071a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen Cursor c = mDatabase.rawQuery("SELECT data FROM test WHERE data = '" + sString1 + "'", 4081a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen null); 4091a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertNotNull(c); 4101a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(1, c.getCount()); 4111a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertTrue(c.moveToFirst()); 4121a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(sString1, c.getString(0)); 4131a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.deactivate(); 4141a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.requery(); 4151a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(1, c.getCount()); 4161a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertTrue(c.moveToFirst()); 4171a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(sString1, c.getString(0)); 4181a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.close(); 4191a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 4201a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 4211a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen @MediumTest 4221a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen public void testRequeryWithSelectionArgs() throws Exception { 4231a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen populateDefaultTable(); 4241a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 4251a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen Cursor c = mDatabase.rawQuery("SELECT data FROM test WHERE data = ?", 4261a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen new String[]{sString1}); 4271a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertNotNull(c); 4281a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(1, c.getCount()); 4291a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertTrue(c.moveToFirst()); 4301a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(sString1, c.getString(0)); 4311a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.deactivate(); 4321a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.requery(); 4331a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(1, c.getCount()); 4341a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertTrue(c.moveToFirst()); 4351a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(sString1, c.getString(0)); 4361a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.close(); 4371a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 4381a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 4391a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen @MediumTest 4401a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen public void testRequeryWithAlteredSelectionArgs() throws Exception { 4411a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen /** 4421a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen * Test the ability of a subclass of SQLiteCursor to change its query arguments. 4431a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen */ 4441a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen populateDefaultTable(); 4451a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 4461a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen SQLiteDatabase.CursorFactory factory = new SQLiteDatabase.CursorFactory() { 4471a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen public Cursor newCursor( 4481a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen SQLiteDatabase db, SQLiteCursorDriver masterQuery, String editTable, 4491a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen SQLiteQuery query) { 4501a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen return new SQLiteCursor(db, masterQuery, editTable, query) { 4511a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen @Override 4521a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen public boolean requery() { 4531a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen setSelectionArguments(new String[]{"2"}); 4541a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen return super.requery(); 4551a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 4561a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen }; 4571a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 4581a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen }; 4591a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen Cursor c = mDatabase.rawQueryWithFactory( 4601a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen factory, "SELECT data FROM test WHERE _id <= ?", new String[]{"1"}, 4611a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen null); 4621a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertNotNull(c); 4631a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(1, c.getCount()); 4641a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertTrue(c.moveToFirst()); 4651a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(sString1, c.getString(0)); 4661a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 4671a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen // Our hacked requery() changes the query arguments in the cursor. 4681a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.requery(); 4691a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 4701a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(2, c.getCount()); 4711a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertTrue(c.moveToFirst()); 4721a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(sString1, c.getString(0)); 4731a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertTrue(c.moveToNext()); 4741a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen assertEquals(sString2, c.getString(0)); 4751a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen 4761a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen // Test that setting query args on a deactivated cursor also works. 4771a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.deactivate(); 4781a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen c.requery(); 4791a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen } 4806141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori /** 4816141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori * sometimes CursorWindow creation fails due to non-availability of memory create 4826141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori * another CursorWindow object. One of the scenarios of its occurrence is when 4836141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori * there are too many CursorWindow objects already opened by the process. 4846141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori * This test is for that scenario. 4856141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori */ 4866141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori @LargeTest 487f90177629a5b69ca3a80466c0ab55abfeb6d26b2Abodunrinwa Toki @Suppress // Failing. 4886141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori public void testCursorWindowFailureWhenTooManyCursorWindowsLeftOpen() { 4896141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori mDatabase.execSQL("CREATE TABLE test (_id INTEGER PRIMARY KEY, data TEXT);"); 4906141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori mDatabase.execSQL("INSERT INTO test values(1, 'test');"); 4916141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori int N = 1024; 4926141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori ArrayList<Cursor> cursorList = new ArrayList<Cursor>(); 4936141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori // open many cursors until a failure occurs 4946141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori for (int i = 0; i < N; i++) { 4956141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori try { 4966141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori Cursor cursor = mDatabase.rawQuery("select * from test", null); 4976141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori cursor.getCount(); 4986141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori cursorList.add(cursor); 4996141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori } catch (CursorWindowAllocationException e) { 5006141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori // got the exception we wanted 5016141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori break; 5026141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori } catch (Exception e) { 5036141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori fail("unexpected exception: " + e.getMessage()); 5046141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori e.printStackTrace(); 5056141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori break; 5066141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori } 5076141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori } 5086141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori for (Cursor c : cursorList) { 5096141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori c.close(); 5106141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori } 5116141e13f6e84846ae531358a8bcbf6d2102b1bd4Vasu Nori } 5121a44d5dcabc18cd5ef111f732ccff91683a1a093Neal Nguyen} 513