SQLite Android Bindings
Hex Artifact Content
Not logged in

Artifact 7d77b82214bda4bf7bcca32130d9dab7401fce1b:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 32 30 30 39 20 54 68 65 20 41 6e 64  (C) 2009 The And
0020: 72 6f 69 64 20 4f 70 65 6e 20 53 6f 75 72 63 65  roid Open Source
0030: 20 50 72 6f 6a 65 63 74 0a 20 2a 0a 20 2a 20 4c   Project. *. * L
0040: 69 63 65 6e 73 65 64 20 75 6e 64 65 72 20 74 68  icensed under th
0050: 65 20 41 70 61 63 68 65 20 4c 69 63 65 6e 73 65  e Apache License
0060: 2c 20 56 65 72 73 69 6f 6e 20 32 2e 30 20 28 74  , Version 2.0 (t
0070: 68 65 20 22 4c 69 63 65 6e 73 65 22 29 3b 0a 20  he "License");. 
0080: 2a 20 79 6f 75 20 6d 61 79 20 6e 6f 74 20 75 73  * you may not us
0090: 65 20 74 68 69 73 20 66 69 6c 65 20 65 78 63 65  e this file exce
00a0: 70 74 20 69 6e 20 63 6f 6d 70 6c 69 61 6e 63 65  pt in compliance
00b0: 20 77 69 74 68 20 74 68 65 20 4c 69 63 65 6e 73   with the Licens
00c0: 65 2e 0a 20 2a 20 59 6f 75 20 6d 61 79 20 6f 62  e.. * You may ob
00d0: 74 61 69 6e 20 61 20 63 6f 70 79 20 6f 66 20 74  tain a copy of t
00e0: 68 65 20 4c 69 63 65 6e 73 65 20 61 74 0a 20 2a  he License at. *
00f0: 0a 20 2a 20 20 20 20 20 20 68 74 74 70 3a 2f 2f  . *      http://
0100: 77 77 77 2e 61 70 61 63 68 65 2e 6f 72 67 2f 6c  www.apache.org/l
0110: 69 63 65 6e 73 65 73 2f 4c 49 43 45 4e 53 45 2d  icenses/LICENSE-
0120: 32 2e 30 0a 20 2a 0a 20 2a 20 55 6e 6c 65 73 73  2.0. *. * Unless
0130: 20 72 65 71 75 69 72 65 64 20 62 79 20 61 70 70   required by app
0140: 6c 69 63 61 62 6c 65 20 6c 61 77 20 6f 72 20 61  licable law or a
0150: 67 72 65 65 64 20 74 6f 20 69 6e 20 77 72 69 74  greed to in writ
0160: 69 6e 67 2c 20 73 6f 66 74 77 61 72 65 0a 20 2a  ing, software. *
0170: 20 64 69 73 74 72 69 62 75 74 65 64 20 75 6e 64   distributed und
0180: 65 72 20 74 68 65 20 4c 69 63 65 6e 73 65 20 69  er the License i
0190: 73 20 64 69 73 74 72 69 62 75 74 65 64 20 6f 6e  s distributed on
01a0: 20 61 6e 20 22 41 53 20 49 53 22 20 42 41 53 49   an "AS IS" BASI
01b0: 53 2c 0a 20 2a 20 57 49 54 48 4f 55 54 20 57 41  S,. * WITHOUT WA
01c0: 52 52 41 4e 54 49 45 53 20 4f 52 20 43 4f 4e 44  RRANTIES OR COND
01d0: 49 54 49 4f 4e 53 20 4f 46 20 41 4e 59 20 4b 49  ITIONS OF ANY KI
01e0: 4e 44 2c 20 65 69 74 68 65 72 20 65 78 70 72 65  ND, either expre
01f0: 73 73 20 6f 72 20 69 6d 70 6c 69 65 64 2e 0a 20  ss or implied.. 
0200: 2a 20 53 65 65 20 74 68 65 20 4c 69 63 65 6e 73  * See the Licens
0210: 65 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  e for the specif
0220: 69 63 20 6c 61 6e 67 75 61 67 65 20 67 6f 76 65  ic language gove
0230: 72 6e 69 6e 67 20 70 65 72 6d 69 73 73 69 6f 6e  rning permission
0240: 73 20 61 6e 64 0a 20 2a 20 6c 69 6d 69 74 61 74  s and. * limitat
0250: 69 6f 6e 73 20 75 6e 64 65 72 20 74 68 65 20 4c  ions under the L
0260: 69 63 65 6e 73 65 2e 0a 20 2a 2f 0a 0a 70 61 63  icense.. */..pac
0270: 6b 61 67 65 20 6f 72 67 2e 73 71 6c 69 74 65 2e  kage org.sqlite.
0280: 64 61 74 61 62 61 73 65 3b 0a 0a 69 6d 70 6f 72  database;..impor
0290: 74 20 6a 61 76 61 2e 69 6f 2e 46 69 6c 65 3b 0a  t java.io.File;.
02a0: 69 6d 70 6f 72 74 20 6a 61 76 61 2e 69 6f 2e 49  import java.io.I
02b0: 4f 45 78 63 65 70 74 69 6f 6e 3b 0a 69 6d 70 6f  OException;.impo
02c0: 72 74 20 6a 61 76 61 2e 75 74 69 6c 2e 41 72 72  rt java.util.Arr
02d0: 61 79 4c 69 73 74 3b 0a 69 6d 70 6f 72 74 20 6a  ayList;.import j
02e0: 61 76 61 2e 75 74 69 6c 2e 4c 6f 63 61 6c 65 3b  ava.util.Locale;
02f0: 0a 69 6d 70 6f 72 74 20 6a 61 76 61 2e 75 74 69  .import java.uti
0300: 6c 2e 63 6f 6e 63 75 72 72 65 6e 74 2e 53 65 6d  l.concurrent.Sem
0310: 61 70 68 6f 72 65 3b 0a 0a 69 6d 70 6f 72 74 20  aphore;..import 
0320: 61 6e 64 72 6f 69 64 2e 63 6f 6e 74 65 6e 74 2e  android.content.
0330: 43 6f 6e 74 65 6e 74 56 61 6c 75 65 73 3b 0a 69  ContentValues;.i
0340: 6d 70 6f 72 74 20 61 6e 64 72 6f 69 64 2e 63 6f  mport android.co
0350: 6e 74 65 6e 74 2e 43 6f 6e 74 65 78 74 3b 0a 69  ntent.Context;.i
0360: 6d 70 6f 72 74 20 61 6e 64 72 6f 69 64 2e 64 61  mport android.da
0370: 74 61 62 61 73 65 2e 43 75 72 73 6f 72 3b 0a 69  tabase.Cursor;.i
0380: 6d 70 6f 72 74 20 6f 72 67 2e 73 71 6c 69 74 65  mport org.sqlite
0390: 2e 64 61 74 61 62 61 73 65 2e 44 61 74 61 62 61  .database.Databa
03a0: 73 65 55 74 69 6c 73 3b 0a 69 6d 70 6f 72 74 20  seUtils;.import 
03b0: 6f 72 67 2e 73 71 6c 69 74 65 2e 64 61 74 61 62  org.sqlite.datab
03c0: 61 73 65 2e 53 51 4c 45 78 63 65 70 74 69 6f 6e  ase.SQLException
03d0: 3b 0a 69 6d 70 6f 72 74 20 6f 72 67 2e 73 71 6c  ;.import org.sql
03e0: 69 74 65 2e 64 61 74 61 62 61 73 65 2e 73 71 6c  ite.database.sql
03f0: 69 74 65 2e 53 51 4c 69 74 65 43 75 72 73 6f 72  ite.SQLiteCursor
0400: 3b 0a 69 6d 70 6f 72 74 20 6f 72 67 2e 73 71 6c  ;.import org.sql
0410: 69 74 65 2e 64 61 74 61 62 61 73 65 2e 73 71 6c  ite.database.sql
0420: 69 74 65 2e 53 51 4c 69 74 65 43 75 72 73 6f 72  ite.SQLiteCursor
0430: 44 72 69 76 65 72 3b 0a 69 6d 70 6f 72 74 20 6f  Driver;.import o
0440: 72 67 2e 73 71 6c 69 74 65 2e 64 61 74 61 62 61  rg.sqlite.databa
0450: 73 65 2e 73 71 6c 69 74 65 2e 53 51 4c 69 74 65  se.sqlite.SQLite
0460: 44 61 74 61 62 61 73 65 3b 0a 69 6d 70 6f 72 74  Database;.import
0470: 20 6f 72 67 2e 73 71 6c 69 74 65 2e 64 61 74 61   org.sqlite.data
0480: 62 61 73 65 2e 73 71 6c 69 74 65 2e 53 51 4c 69  base.sqlite.SQLi
0490: 74 65 44 61 74 61 62 61 73 65 2e 43 75 72 73 6f  teDatabase.Curso
04a0: 72 46 61 63 74 6f 72 79 3b 0a 69 6d 70 6f 72 74  rFactory;.import
04b0: 20 6f 72 67 2e 73 71 6c 69 74 65 2e 64 61 74 61   org.sqlite.data
04c0: 62 61 73 65 2e 73 71 6c 69 74 65 2e 53 51 4c 69  base.sqlite.SQLi
04d0: 74 65 45 78 63 65 70 74 69 6f 6e 3b 0a 69 6d 70  teException;.imp
04e0: 6f 72 74 20 6f 72 67 2e 73 71 6c 69 74 65 2e 64  ort org.sqlite.d
04f0: 61 74 61 62 61 73 65 2e 73 71 6c 69 74 65 2e 53  atabase.sqlite.S
0500: 51 4c 69 74 65 51 75 65 72 79 3b 0a 69 6d 70 6f  QLiteQuery;.impo
0510: 72 74 20 6f 72 67 2e 73 71 6c 69 74 65 2e 64 61  rt org.sqlite.da
0520: 74 61 62 61 73 65 2e 73 71 6c 69 74 65 2e 53 51  tabase.sqlite.SQ
0530: 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 3b 0a 69  LiteStatement;.i
0540: 6d 70 6f 72 74 20 6f 72 67 2e 73 71 6c 69 74 65  mport org.sqlite
0550: 2e 64 61 74 61 62 61 73 65 2e 73 71 6c 69 74 65  .database.sqlite
0560: 2e 53 51 4c 69 74 65 54 72 61 6e 73 61 63 74 69  .SQLiteTransacti
0570: 6f 6e 4c 69 73 74 65 6e 65 72 3b 0a 69 6d 70 6f  onListener;.impo
0580: 72 74 20 61 6e 64 72 6f 69 64 2e 74 65 73 74 2e  rt android.test.
0590: 41 6e 64 72 6f 69 64 54 65 73 74 43 61 73 65 3b  AndroidTestCase;
05a0: 0a 69 6d 70 6f 72 74 20 61 6e 64 72 6f 69 64 2e  .import android.
05b0: 74 65 73 74 2e 4d 6f 72 65 41 73 73 65 72 74 73  test.MoreAsserts
05c0: 3b 0a 69 6d 70 6f 72 74 20 61 6e 64 72 6f 69 64  ;.import android
05d0: 2e 74 65 73 74 2e 73 75 69 74 65 62 75 69 6c 64  .test.suitebuild
05e0: 65 72 2e 61 6e 6e 6f 74 61 74 69 6f 6e 2e 4c 61  er.annotation.La
05f0: 72 67 65 54 65 73 74 3b 0a 69 6d 70 6f 72 74 20  rgeTest;.import 
0600: 61 6e 64 72 6f 69 64 2e 74 65 73 74 2e 73 75 69  android.test.sui
0610: 74 65 62 75 69 6c 64 65 72 2e 61 6e 6e 6f 74 61  tebuilder.annota
0620: 74 69 6f 6e 2e 53 6d 61 6c 6c 54 65 73 74 3b 0a  tion.SmallTest;.
0630: 0a 70 75 62 6c 69 63 20 63 6c 61 73 73 20 53 51  .public class SQ
0640: 4c 69 74 65 44 61 74 61 62 61 73 65 54 65 73 74  LiteDatabaseTest
0650: 20 65 78 74 65 6e 64 73 20 41 6e 64 72 6f 69 64   extends Android
0660: 54 65 73 74 43 61 73 65 20 7b 0a 20 20 20 20 70  TestCase {.    p
0670: 72 69 76 61 74 65 20 53 51 4c 69 74 65 44 61 74  rivate SQLiteDat
0680: 61 62 61 73 65 20 6d 44 61 74 61 62 61 73 65 3b  abase mDatabase;
0690: 0a 20 20 20 20 70 72 69 76 61 74 65 20 46 69 6c  .    private Fil
06a0: 65 20 6d 44 61 74 61 62 61 73 65 46 69 6c 65 3b  e mDatabaseFile;
06b0: 0a 20 20 20 20 70 72 69 76 61 74 65 20 53 74 72  .    private Str
06c0: 69 6e 67 20 6d 44 61 74 61 62 61 73 65 46 69 6c  ing mDatabaseFil
06d0: 65 50 61 74 68 3b 0a 20 20 20 20 70 72 69 76 61  ePath;.    priva
06e0: 74 65 20 53 74 72 69 6e 67 20 6d 44 61 74 61 62  te String mDatab
06f0: 61 73 65 44 69 72 3b 0a 0a 20 20 20 20 70 72 69  aseDir;..    pri
0700: 76 61 74 65 20 62 6f 6f 6c 65 61 6e 20 6d 54 72  vate boolean mTr
0710: 61 6e 73 61 63 74 69 6f 6e 4c 69 73 74 65 6e 65  ansactionListene
0720: 72 4f 6e 42 65 67 69 6e 43 61 6c 6c 65 64 3b 0a  rOnBeginCalled;.
0730: 20 20 20 20 70 72 69 76 61 74 65 20 62 6f 6f 6c      private bool
0740: 65 61 6e 20 6d 54 72 61 6e 73 61 63 74 69 6f 6e  ean mTransaction
0750: 4c 69 73 74 65 6e 65 72 4f 6e 43 6f 6d 6d 69 74  ListenerOnCommit
0760: 43 61 6c 6c 65 64 3b 0a 20 20 20 20 70 72 69 76  Called;.    priv
0770: 61 74 65 20 62 6f 6f 6c 65 61 6e 20 6d 54 72 61  ate boolean mTra
0780: 6e 73 61 63 74 69 6f 6e 4c 69 73 74 65 6e 65 72  nsactionListener
0790: 4f 6e 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 65 64  OnRollbackCalled
07a0: 3b 0a 0a 20 20 20 20 70 72 69 76 61 74 65 20 73  ;..    private s
07b0: 74 61 74 69 63 20 66 69 6e 61 6c 20 53 74 72 69  tatic final Stri
07c0: 6e 67 20 44 41 54 41 42 41 53 45 5f 46 49 4c 45  ng DATABASE_FILE
07d0: 5f 4e 41 4d 45 20 3d 20 22 64 61 74 61 62 61 73  _NAME = "databas
07e0: 65 5f 74 65 73 74 2e 64 62 22 3b 0a 20 20 20 20  e_test.db";.    
07f0: 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 66  private static f
0800: 69 6e 61 6c 20 53 74 72 69 6e 67 20 54 41 42 4c  inal String TABL
0810: 45 5f 4e 41 4d 45 20 3d 20 22 74 65 73 74 22 3b  E_NAME = "test";
0820: 0a 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61  .    private sta
0830: 74 69 63 20 66 69 6e 61 6c 20 69 6e 74 20 43 4f  tic final int CO
0840: 4c 55 4d 4e 5f 49 44 5f 49 4e 44 45 58 20 3d 20  LUMN_ID_INDEX = 
0850: 30 3b 0a 20 20 20 20 70 72 69 76 61 74 65 20 73  0;.    private s
0860: 74 61 74 69 63 20 66 69 6e 61 6c 20 69 6e 74 20  tatic final int 
0870: 43 4f 4c 55 4d 4e 5f 4e 41 4d 45 5f 49 4e 44 45  COLUMN_NAME_INDE
0880: 58 20 3d 20 31 3b 0a 20 20 20 20 70 72 69 76 61  X = 1;.    priva
0890: 74 65 20 73 74 61 74 69 63 20 66 69 6e 61 6c 20  te static final 
08a0: 69 6e 74 20 43 4f 4c 55 4d 4e 5f 41 47 45 5f 49  int COLUMN_AGE_I
08b0: 4e 44 45 58 20 3d 20 32 3b 0a 20 20 20 20 70 72  NDEX = 2;.    pr
08c0: 69 76 61 74 65 20 73 74 61 74 69 63 20 66 69 6e  ivate static fin
08d0: 61 6c 20 69 6e 74 20 43 4f 4c 55 4d 4e 5f 41 44  al int COLUMN_AD
08e0: 44 52 5f 49 4e 44 45 58 20 3d 20 33 3b 0a 20 20  DR_INDEX = 3;.  
08f0: 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69 63    private static
0900: 20 66 69 6e 61 6c 20 53 74 72 69 6e 67 5b 5d 20   final String[] 
0910: 54 45 53 54 5f 50 52 4f 4a 45 43 54 49 4f 4e 20  TEST_PROJECTION 
0920: 3d 20 6e 65 77 20 53 74 72 69 6e 67 5b 5d 20 7b  = new String[] {
0930: 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 5f 69  .            "_i
0940: 64 22 2c 20 20 20 20 20 20 2f 2f 20 30 0a 20 20  d",      // 0.  
0950: 20 20 20 20 20 20 20 20 20 20 22 6e 61 6d 65 22            "name"
0960: 2c 20 20 20 20 20 2f 2f 20 31 0a 20 20 20 20 20  ,     // 1.     
0970: 20 20 20 20 20 20 20 22 61 67 65 22 2c 20 20 20         "age",   
0980: 20 20 20 2f 2f 20 32 0a 20 20 20 20 20 20 20 20     // 2.        
0990: 20 20 20 20 22 61 64 64 72 65 73 73 22 20 20 20      "address"   
09a0: 2f 2f 20 33 0a 20 20 20 20 7d 3b 0a 0a 20 20 20  // 3.    };..   
09b0: 20 40 4f 76 65 72 72 69 64 65 0a 20 20 20 20 70   @Override.    p
09c0: 72 6f 74 65 63 74 65 64 20 76 6f 69 64 20 73 65  rotected void se
09d0: 74 55 70 28 29 20 74 68 72 6f 77 73 20 45 78 63  tUp() throws Exc
09e0: 65 70 74 69 6f 6e 20 7b 0a 20 20 20 20 20 20 20  eption {.       
09f0: 20 73 75 70 65 72 2e 73 65 74 55 70 28 29 3b 0a   super.setUp();.
0a00: 0a 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e  .        System.
0a10: 6c 6f 61 64 4c 69 62 72 61 72 79 28 22 73 71 6c  loadLibrary("sql
0a20: 69 74 65 58 22 29 3b 0a 20 20 20 20 20 20 20 20  iteX");.        
0a30: 67 65 74 43 6f 6e 74 65 78 74 28 29 2e 64 65 6c  getContext().del
0a40: 65 74 65 44 61 74 61 62 61 73 65 28 44 41 54 41  eteDatabase(DATA
0a50: 42 41 53 45 5f 46 49 4c 45 5f 4e 41 4d 45 29 3b  BASE_FILE_NAME);
0a60: 0a 20 20 20 20 20 20 20 20 6d 44 61 74 61 62 61  .        mDataba
0a70: 73 65 46 69 6c 65 50 61 74 68 20 3d 20 67 65 74  seFilePath = get
0a80: 43 6f 6e 74 65 78 74 28 29 2e 67 65 74 44 61 74  Context().getDat
0a90: 61 62 61 73 65 50 61 74 68 28 44 41 54 41 42 41  abasePath(DATABA
0aa0: 53 45 5f 46 49 4c 45 5f 4e 41 4d 45 29 2e 67 65  SE_FILE_NAME).ge
0ab0: 74 50 61 74 68 28 29 3b 0a 20 20 20 20 20 20 20  tPath();.       
0ac0: 20 6d 44 61 74 61 62 61 73 65 46 69 6c 65 20 3d   mDatabaseFile =
0ad0: 20 67 65 74 43 6f 6e 74 65 78 74 28 29 2e 67 65   getContext().ge
0ae0: 74 44 61 74 61 62 61 73 65 50 61 74 68 28 44 41  tDatabasePath(DA
0af0: 54 41 42 41 53 45 5f 46 49 4c 45 5f 4e 41 4d 45  TABASE_FILE_NAME
0b00: 29 3b 0a 20 20 20 20 20 20 20 20 6d 44 61 74 61  );.        mData
0b10: 62 61 73 65 44 69 72 20 3d 20 6d 44 61 74 61 62  baseDir = mDatab
0b20: 61 73 65 46 69 6c 65 2e 67 65 74 50 61 72 65 6e  aseFile.getParen
0b30: 74 28 29 3b 0a 20 20 20 20 20 20 20 20 6d 44 61  t();.        mDa
0b40: 74 61 62 61 73 65 46 69 6c 65 2e 67 65 74 50 61  tabaseFile.getPa
0b50: 72 65 6e 74 46 69 6c 65 28 29 2e 6d 6b 64 69 72  rentFile().mkdir
0b60: 73 28 29 3b 20 2f 2f 20 64 69 72 65 63 74 6f 72  s(); // director
0b70: 79 20 6d 61 79 20 6e 6f 74 20 65 78 69 73 74 0a  y may not exist.
0b80: 20 20 20 20 20 20 20 20 6d 44 61 74 61 62 61 73          mDatabas
0b90: 65 20 3d 20 53 51 4c 69 74 65 44 61 74 61 62 61  e = SQLiteDataba
0ba0: 73 65 2e 6f 70 65 6e 4f 72 43 72 65 61 74 65 44  se.openOrCreateD
0bb0: 61 74 61 62 61 73 65 28 6d 44 61 74 61 62 61 73  atabase(mDatabas
0bc0: 65 46 69 6c 65 2c 20 6e 75 6c 6c 29 3b 0a 20 20  eFile, null);.  
0bd0: 20 20 20 20 20 20 61 73 73 65 72 74 4e 6f 74 4e        assertNotN
0be0: 75 6c 6c 28 6d 44 61 74 61 62 61 73 65 29 3b 0a  ull(mDatabase);.
0bf0: 0a 20 20 20 20 20 20 20 20 6d 54 72 61 6e 73 61  .        mTransa
0c00: 63 74 69 6f 6e 4c 69 73 74 65 6e 65 72 4f 6e 42  ctionListenerOnB
0c10: 65 67 69 6e 43 61 6c 6c 65 64 20 3d 20 66 61 6c  eginCalled = fal
0c20: 73 65 3b 0a 20 20 20 20 20 20 20 20 6d 54 72 61  se;.        mTra
0c30: 6e 73 61 63 74 69 6f 6e 4c 69 73 74 65 6e 65 72  nsactionListener
0c40: 4f 6e 43 6f 6d 6d 69 74 43 61 6c 6c 65 64 20 3d  OnCommitCalled =
0c50: 20 66 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20   false;.        
0c60: 6d 54 72 61 6e 73 61 63 74 69 6f 6e 4c 69 73 74  mTransactionList
0c70: 65 6e 65 72 4f 6e 52 6f 6c 6c 62 61 63 6b 43 61  enerOnRollbackCa
0c80: 6c 6c 65 64 20 3d 20 66 61 6c 73 65 3b 0a 20 20  lled = false;.  
0c90: 20 20 7d 0a 0a 20 20 20 20 40 4f 76 65 72 72 69    }..    @Overri
0ca0: 64 65 0a 20 20 20 20 70 72 6f 74 65 63 74 65 64  de.    protected
0cb0: 20 76 6f 69 64 20 74 65 61 72 44 6f 77 6e 28 29   void tearDown()
0cc0: 20 74 68 72 6f 77 73 20 45 78 63 65 70 74 69 6f   throws Exceptio
0cd0: 6e 20 7b 0a 20 20 20 20 20 20 20 20 6d 44 61 74  n {.        mDat
0ce0: 61 62 61 73 65 2e 63 6c 6f 73 65 28 29 3b 0a 20  abase.close();. 
0cf0: 20 20 20 20 20 20 20 6d 44 61 74 61 62 61 73 65         mDatabase
0d00: 46 69 6c 65 2e 64 65 6c 65 74 65 28 29 3b 0a 20  File.delete();. 
0d10: 20 20 20 20 20 20 20 73 75 70 65 72 2e 74 65 61         super.tea
0d20: 72 44 6f 77 6e 28 29 3b 0a 20 20 20 20 7d 0a 0a  rDown();.    }..
0d30: 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20      public void 
0d40: 74 65 73 74 4f 70 65 6e 44 61 74 61 62 61 73 65  testOpenDatabase
0d50: 28 29 20 7b 0a 20 20 20 20 20 20 20 20 43 75 72  () {.        Cur
0d60: 73 6f 72 46 61 63 74 6f 72 79 20 66 61 63 74 6f  sorFactory facto
0d70: 72 79 20 3d 20 6e 65 77 20 43 75 72 73 6f 72 46  ry = new CursorF
0d80: 61 63 74 6f 72 79 28 29 20 7b 0a 20 20 20 20 20  actory() {.     
0d90: 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 43 75         public Cu
0da0: 72 73 6f 72 20 6e 65 77 43 75 72 73 6f 72 28 53  rsor newCursor(S
0db0: 51 4c 69 74 65 44 61 74 61 62 61 73 65 20 64 62  QLiteDatabase db
0dc0: 2c 20 53 51 4c 69 74 65 43 75 72 73 6f 72 44 72  , SQLiteCursorDr
0dd0: 69 76 65 72 20 6d 61 73 74 65 72 51 75 65 72 79  iver masterQuery
0de0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0df0: 20 20 20 20 20 20 53 74 72 69 6e 67 20 65 64 69        String edi
0e00: 74 54 61 62 6c 65 2c 20 53 51 4c 69 74 65 51 75  tTable, SQLiteQu
0e10: 65 72 79 20 71 75 65 72 79 29 20 7b 0a 20 20 20  ery query) {.   
0e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
0e30: 75 72 6e 20 6e 65 77 20 4d 6f 63 6b 53 51 4c 69  urn new MockSQLi
0e40: 74 65 43 75 72 73 6f 72 28 64 62 2c 20 6d 61 73  teCursor(db, mas
0e50: 74 65 72 51 75 65 72 79 2c 20 65 64 69 74 54 61  terQuery, editTa
0e60: 62 6c 65 2c 20 71 75 65 72 79 29 3b 0a 20 20 20  ble, query);.   
0e70: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
0e80: 20 20 20 7d 3b 0a 0a 20 20 20 20 20 20 20 20 53     };..        S
0e90: 51 4c 69 74 65 44 61 74 61 62 61 73 65 20 64 62  QLiteDatabase db
0ea0: 20 3d 20 53 51 4c 69 74 65 44 61 74 61 62 61 73   = SQLiteDatabas
0eb0: 65 2e 6f 70 65 6e 44 61 74 61 62 61 73 65 28 6d  e.openDatabase(m
0ec0: 44 61 74 61 62 61 73 65 46 69 6c 65 50 61 74 68  DatabaseFilePath
0ed0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
0ee0: 20 20 66 61 63 74 6f 72 79 2c 20 53 51 4c 69 74    factory, SQLit
0ef0: 65 44 61 74 61 62 61 73 65 2e 43 52 45 41 54 45  eDatabase.CREATE
0f00: 5f 49 46 5f 4e 45 43 45 53 53 41 52 59 29 3b 0a  _IF_NECESSARY);.
0f10: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 4e 6f          assertNo
0f20: 74 4e 75 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20  tNull(db);.     
0f30: 20 20 20 64 62 2e 63 6c 6f 73 65 28 29 3b 0a 0a     db.close();..
0f40: 20 20 20 20 20 20 20 20 46 69 6c 65 20 64 62 46          File dbF
0f50: 69 6c 65 20 3d 20 6e 65 77 20 46 69 6c 65 28 6d  ile = new File(m
0f60: 44 61 74 61 62 61 73 65 44 69 72 2c 20 22 64 61  DatabaseDir, "da
0f70: 74 61 62 61 73 65 5f 74 65 73 74 31 32 33 34 35  tabase_test12345
0f80: 36 37 38 2e 64 62 22 29 3b 0a 20 20 20 20 20 20  678.db");.      
0f90: 20 20 64 62 46 69 6c 65 2e 64 65 6c 65 74 65 28    dbFile.delete(
0fa0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
0fb0: 74 46 61 6c 73 65 28 64 62 46 69 6c 65 2e 65 78  tFalse(dbFile.ex
0fc0: 69 73 74 73 28 29 29 3b 0a 20 20 20 20 20 20 20  ists());.       
0fd0: 20 64 62 20 3d 20 53 51 4c 69 74 65 44 61 74 61   db = SQLiteData
0fe0: 62 61 73 65 2e 6f 70 65 6e 4f 72 43 72 65 61 74  base.openOrCreat
0ff0: 65 44 61 74 61 62 61 73 65 28 64 62 46 69 6c 65  eDatabase(dbFile
1000: 2e 67 65 74 50 61 74 68 28 29 2c 20 66 61 63 74  .getPath(), fact
1010: 6f 72 79 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ory);.        as
1020: 73 65 72 74 4e 6f 74 4e 75 6c 6c 28 64 62 29 3b  sertNotNull(db);
1030: 0a 20 20 20 20 20 20 20 20 64 62 2e 63 6c 6f 73  .        db.clos
1040: 65 28 29 3b 0a 20 20 20 20 20 20 20 20 64 62 46  e();.        dbF
1050: 69 6c 65 2e 64 65 6c 65 74 65 28 29 3b 0a 0a 20  ile.delete();.. 
1060: 20 20 20 20 20 20 20 64 62 46 69 6c 65 20 3d 20         dbFile = 
1070: 6e 65 77 20 46 69 6c 65 28 6d 44 61 74 61 62 61  new File(mDataba
1080: 73 65 44 69 72 2c 20 44 41 54 41 42 41 53 45 5f  seDir, DATABASE_
1090: 46 49 4c 45 5f 4e 41 4d 45 29 3b 0a 20 20 20 20  FILE_NAME);.    
10a0: 20 20 20 20 64 62 20 3d 20 53 51 4c 69 74 65 44      db = SQLiteD
10b0: 61 74 61 62 61 73 65 2e 6f 70 65 6e 4f 72 43 72  atabase.openOrCr
10c0: 65 61 74 65 44 61 74 61 62 61 73 65 28 64 62 46  eateDatabase(dbF
10d0: 69 6c 65 2c 20 66 61 63 74 6f 72 79 29 3b 0a 20  ile, factory);. 
10e0: 20 20 20 20 20 20 20 61 73 73 65 72 74 4e 6f 74         assertNot
10f0: 4e 75 6c 6c 28 64 62 29 3b 0a 20 20 20 20 20 20  Null(db);.      
1100: 20 20 64 62 2e 63 6c 6f 73 65 28 29 3b 0a 20 20    db.close();.  
1110: 20 20 20 20 20 20 64 62 46 69 6c 65 2e 64 65 6c        dbFile.del
1120: 65 74 65 28 29 3b 0a 0a 20 20 20 20 20 20 20 20  ete();..        
1130: 64 62 20 3d 20 53 51 4c 69 74 65 44 61 74 61 62  db = SQLiteDatab
1140: 61 73 65 2e 63 72 65 61 74 65 28 66 61 63 74 6f  ase.create(facto
1150: 72 79 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ry);.        ass
1160: 65 72 74 4e 6f 74 4e 75 6c 6c 28 64 62 29 3b 0a  ertNotNull(db);.
1170: 20 20 20 20 20 20 20 20 64 62 2e 63 6c 6f 73 65          db.close
1180: 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  ();.    }..    p
1190: 75 62 6c 69 63 20 76 6f 69 64 20 74 65 73 74 44  ublic void testD
11a0: 65 6c 65 74 65 44 61 74 61 62 61 73 65 28 29 20  eleteDatabase() 
11b0: 74 68 72 6f 77 73 20 49 4f 45 78 63 65 70 74 69  throws IOExcepti
11c0: 6f 6e 20 7b 0a 20 20 20 20 20 20 20 20 46 69 6c  on {.        Fil
11d0: 65 20 64 62 46 69 6c 65 20 3d 20 6e 65 77 20 46  e dbFile = new F
11e0: 69 6c 65 28 6d 44 61 74 61 62 61 73 65 44 69 72  ile(mDatabaseDir
11f0: 2c 20 22 64 61 74 61 62 61 73 65 5f 74 65 73 74  , "database_test
1200: 31 32 33 34 35 36 37 38 2e 64 62 22 29 3b 0a 20  12345678.db");. 
1210: 20 20 20 20 20 20 20 46 69 6c 65 20 6a 6f 75 72         File jour
1220: 6e 61 6c 46 69 6c 65 20 3d 20 6e 65 77 20 46 69  nalFile = new Fi
1230: 6c 65 28 64 62 46 69 6c 65 2e 67 65 74 50 61 74  le(dbFile.getPat
1240: 68 28 29 20 2b 20 22 2d 6a 6f 75 72 6e 61 6c 22  h() + "-journal"
1250: 29 3b 0a 20 20 20 20 20 20 20 20 46 69 6c 65 20  );.        File 
1260: 73 68 6d 46 69 6c 65 20 3d 20 6e 65 77 20 46 69  shmFile = new Fi
1270: 6c 65 28 64 62 46 69 6c 65 2e 67 65 74 50 61 74  le(dbFile.getPat
1280: 68 28 29 20 2b 20 22 2d 73 68 6d 22 29 3b 0a 20  h() + "-shm");. 
1290: 20 20 20 20 20 20 20 46 69 6c 65 20 77 61 6c 46         File walF
12a0: 69 6c 65 20 3d 20 6e 65 77 20 46 69 6c 65 28 64  ile = new File(d
12b0: 62 46 69 6c 65 2e 67 65 74 50 61 74 68 28 29 20  bFile.getPath() 
12c0: 2b 20 22 2d 77 61 6c 22 29 3b 0a 20 20 20 20 20  + "-wal");.     
12d0: 20 20 20 46 69 6c 65 20 6d 6a 46 69 6c 65 31 20     File mjFile1 
12e0: 3d 20 6e 65 77 20 46 69 6c 65 28 64 62 46 69 6c  = new File(dbFil
12f0: 65 2e 67 65 74 50 61 74 68 28 29 20 2b 20 22 2d  e.getPath() + "-
1300: 6d 6a 30 30 30 30 30 30 30 30 22 29 3b 0a 20 20  mj00000000");.  
1310: 20 20 20 20 20 20 46 69 6c 65 20 6d 6a 46 69 6c        File mjFil
1320: 65 32 20 3d 20 6e 65 77 20 46 69 6c 65 28 64 62  e2 = new File(db
1330: 46 69 6c 65 2e 67 65 74 50 61 74 68 28 29 20 2b  File.getPath() +
1340: 20 22 2d 6d 6a 30 30 30 30 30 30 30 31 22 29 3b   "-mj00000001");
1350: 0a 20 20 20 20 20 20 20 20 46 69 6c 65 20 69 6e  .        File in
1360: 6e 6f 63 65 6e 74 46 69 6c 65 20 3d 20 6e 65 77  nocentFile = new
1370: 20 46 69 6c 65 28 64 62 46 69 6c 65 2e 67 65 74   File(dbFile.get
1380: 50 61 74 68 28 29 20 2b 20 22 2d 69 6e 6e 6f 63  Path() + "-innoc
1390: 65 6e 74 22 29 3b 0a 0a 20 20 20 20 20 20 20 20  ent");..        
13a0: 64 62 46 69 6c 65 2e 63 72 65 61 74 65 4e 65 77  dbFile.createNew
13b0: 46 69 6c 65 28 29 3b 0a 20 20 20 20 20 20 20 20  File();.        
13c0: 6a 6f 75 72 6e 61 6c 46 69 6c 65 2e 63 72 65 61  journalFile.crea
13d0: 74 65 4e 65 77 46 69 6c 65 28 29 3b 0a 20 20 20  teNewFile();.   
13e0: 20 20 20 20 20 73 68 6d 46 69 6c 65 2e 63 72 65       shmFile.cre
13f0: 61 74 65 4e 65 77 46 69 6c 65 28 29 3b 0a 20 20  ateNewFile();.  
1400: 20 20 20 20 20 20 77 61 6c 46 69 6c 65 2e 63 72        walFile.cr
1410: 65 61 74 65 4e 65 77 46 69 6c 65 28 29 3b 0a 20  eateNewFile();. 
1420: 20 20 20 20 20 20 20 6d 6a 46 69 6c 65 31 2e 63         mjFile1.c
1430: 72 65 61 74 65 4e 65 77 46 69 6c 65 28 29 3b 0a  reateNewFile();.
1440: 20 20 20 20 20 20 20 20 6d 6a 46 69 6c 65 32 2e          mjFile2.
1450: 63 72 65 61 74 65 4e 65 77 46 69 6c 65 28 29 3b  createNewFile();
1460: 0a 20 20 20 20 20 20 20 20 69 6e 6e 6f 63 65 6e  .        innocen
1470: 74 46 69 6c 65 2e 63 72 65 61 74 65 4e 65 77 46  tFile.createNewF
1480: 69 6c 65 28 29 3b 0a 0a 20 20 20 20 20 20 20 20  ile();..        
1490: 62 6f 6f 6c 65 61 6e 20 64 65 6c 65 74 65 64 20  boolean deleted 
14a0: 3d 20 53 51 4c 69 74 65 44 61 74 61 62 61 73 65  = SQLiteDatabase
14b0: 2e 64 65 6c 65 74 65 44 61 74 61 62 61 73 65 28  .deleteDatabase(
14c0: 64 62 46 69 6c 65 29 3b 0a 20 20 20 20 20 20 20  dbFile);.       
14d0: 20 61 73 73 65 72 74 54 72 75 65 28 64 65 6c 65   assertTrue(dele
14e0: 74 65 64 29 3b 0a 0a 20 20 20 20 20 20 20 20 61  ted);..        a
14f0: 73 73 65 72 74 46 61 6c 73 65 28 64 62 46 69 6c  ssertFalse(dbFil
1500: 65 2e 65 78 69 73 74 73 28 29 29 3b 0a 20 20 20  e.exists());.   
1510: 20 20 20 20 20 61 73 73 65 72 74 46 61 6c 73 65       assertFalse
1520: 28 6a 6f 75 72 6e 61 6c 46 69 6c 65 2e 65 78 69  (journalFile.exi
1530: 73 74 73 28 29 29 3b 0a 20 20 20 20 20 20 20 20  sts());.        
1540: 61 73 73 65 72 74 46 61 6c 73 65 28 73 68 6d 46  assertFalse(shmF
1550: 69 6c 65 2e 65 78 69 73 74 73 28 29 29 3b 0a 20  ile.exists());. 
1560: 20 20 20 20 20 20 20 61 73 73 65 72 74 46 61 6c         assertFal
1570: 73 65 28 77 61 6c 46 69 6c 65 2e 65 78 69 73 74  se(walFile.exist
1580: 73 28 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73  s());.        as
1590: 73 65 72 74 46 61 6c 73 65 28 6d 6a 46 69 6c 65  sertFalse(mjFile
15a0: 31 2e 65 78 69 73 74 73 28 29 29 3b 0a 20 20 20  1.exists());.   
15b0: 20 20 20 20 20 61 73 73 65 72 74 46 61 6c 73 65       assertFalse
15c0: 28 6d 6a 46 69 6c 65 32 2e 65 78 69 73 74 73 28  (mjFile2.exists(
15d0: 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ));.        asse
15e0: 72 74 54 72 75 65 28 69 6e 6e 6f 63 65 6e 74 46  rtTrue(innocentF
15f0: 69 6c 65 2e 65 78 69 73 74 73 28 29 29 3b 0a 0a  ile.exists());..
1600: 20 20 20 20 20 20 20 20 69 6e 6e 6f 63 65 6e 74          innocent
1610: 46 69 6c 65 2e 64 65 6c 65 74 65 28 29 3b 0a 0a  File.delete();..
1620: 20 20 20 20 20 20 20 20 62 6f 6f 6c 65 61 6e 20          boolean 
1630: 64 65 6c 65 74 65 64 41 67 61 69 6e 20 3d 20 53  deletedAgain = S
1640: 51 4c 69 74 65 44 61 74 61 62 61 73 65 2e 64 65  QLiteDatabase.de
1650: 6c 65 74 65 44 61 74 61 62 61 73 65 28 64 62 46  leteDatabase(dbF
1660: 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ile);.        as
1670: 73 65 72 74 46 61 6c 73 65 28 64 65 6c 65 74 65  sertFalse(delete
1680: 64 41 67 61 69 6e 29 3b 0a 20 20 20 20 7d 0a 0a  dAgain);.    }..
1690: 20 20 20 20 70 72 69 76 61 74 65 20 63 6c 61 73      private clas
16a0: 73 20 4d 6f 63 6b 53 51 4c 69 74 65 43 75 72 73  s MockSQLiteCurs
16b0: 6f 72 20 65 78 74 65 6e 64 73 20 53 51 4c 69 74  or extends SQLit
16c0: 65 43 75 72 73 6f 72 20 7b 0a 20 20 20 20 20 20  eCursor {.      
16d0: 20 20 70 75 62 6c 69 63 20 4d 6f 63 6b 53 51 4c    public MockSQL
16e0: 69 74 65 43 75 72 73 6f 72 28 53 51 4c 69 74 65  iteCursor(SQLite
16f0: 44 61 74 61 62 61 73 65 20 64 62 2c 20 53 51 4c  Database db, SQL
1700: 69 74 65 43 75 72 73 6f 72 44 72 69 76 65 72 20  iteCursorDriver 
1710: 64 72 69 76 65 72 2c 0a 20 20 20 20 20 20 20 20  driver,.        
1720: 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 20 65          String e
1730: 64 69 74 54 61 62 6c 65 2c 20 53 51 4c 69 74 65  ditTable, SQLite
1740: 51 75 65 72 79 20 71 75 65 72 79 29 20 7b 0a 20  Query query) {. 
1750: 20 20 20 20 20 20 20 20 20 20 20 73 75 70 65 72             super
1760: 28 64 62 2c 20 64 72 69 76 65 72 2c 20 65 64 69  (db, driver, edi
1770: 74 54 61 62 6c 65 2c 20 71 75 65 72 79 29 3b 0a  tTable, query);.
1780: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
1790: 0a 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64  .    public void
17a0: 20 74 65 73 74 54 72 61 6e 73 61 63 74 69 6f 6e   testTransaction
17b0: 28 29 20 7b 0a 20 20 20 20 20 20 20 20 6d 44 61  () {.        mDa
17c0: 74 61 62 61 73 65 2e 65 78 65 63 53 51 4c 28 22  tabase.execSQL("
17d0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 65 73  CREATE TABLE tes
17e0: 74 20 28 6e 75 6d 20 49 4e 54 45 47 45 52 29 3b  t (num INTEGER);
17f0: 22 29 3b 0a 20 20 20 20 20 20 20 20 6d 44 61 74  ");.        mDat
1800: 61 62 61 73 65 2e 65 78 65 63 53 51 4c 28 22 49  abase.execSQL("I
1810: 4e 53 45 52 54 20 49 4e 54 4f 20 74 65 73 74 20  NSERT INTO test 
1820: 28 6e 75 6d 29 20 56 41 4c 55 45 53 20 28 30 29  (num) VALUES (0)
1830: 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20  ");..        // 
1840: 74 65 73 74 20 65 78 65 63 53 51 4c 20 77 69 74  test execSQL wit
1850: 68 6f 75 74 20 61 6e 79 20 65 78 70 6c 69 63 69  hout any explici
1860: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 2e 0a  t transactions..
1870: 20 20 20 20 20 20 20 20 73 65 74 4e 75 6d 28 31          setNum(1
1880: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1890: 74 4e 75 6d 28 31 29 3b 0a 0a 20 20 20 20 20 20  tNum(1);..      
18a0: 20 20 2f 2f 20 54 65 73 74 20 61 20 73 69 6e 67    // Test a sing
18b0: 6c 65 2d 6c 65 76 65 6c 20 74 72 61 6e 73 61 63  le-level transac
18c0: 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 73 65  tion..        se
18d0: 74 4e 75 6d 28 30 29 3b 0a 20 20 20 20 20 20 20  tNum(0);.       
18e0: 20 61 73 73 65 72 74 46 61 6c 73 65 28 6d 44 61   assertFalse(mDa
18f0: 74 61 62 61 73 65 2e 69 6e 54 72 61 6e 73 61 63  tabase.inTransac
1900: 74 69 6f 6e 28 29 29 3b 0a 20 20 20 20 20 20 20  tion());.       
1910: 20 6d 44 61 74 61 62 61 73 65 2e 62 65 67 69 6e   mDatabase.begin
1920: 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20  Transaction();. 
1930: 20 20 20 20 20 20 20 61 73 73 65 72 74 54 72 75         assertTru
1940: 65 28 6d 44 61 74 61 62 61 73 65 2e 69 6e 54 72  e(mDatabase.inTr
1950: 61 6e 73 61 63 74 69 6f 6e 28 29 29 3b 0a 20 20  ansaction());.  
1960: 20 20 20 20 20 20 73 65 74 4e 75 6d 28 31 29 3b        setNum(1);
1970: 0a 20 20 20 20 20 20 20 20 6d 44 61 74 61 62 61  .        mDataba
1980: 73 65 2e 73 65 74 54 72 61 6e 73 61 63 74 69 6f  se.setTransactio
1990: 6e 53 75 63 63 65 73 73 66 75 6c 28 29 3b 0a 20  nSuccessful();. 
19a0: 20 20 20 20 20 20 20 6d 44 61 74 61 62 61 73 65         mDatabase
19b0: 2e 65 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  .endTransaction(
19c0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
19d0: 74 46 61 6c 73 65 28 6d 44 61 74 61 62 61 73 65  tFalse(mDatabase
19e0: 2e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  .inTransaction()
19f0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1a00: 74 4e 75 6d 28 31 29 3b 0a 20 20 20 20 20 20 20  tNum(1);.       
1a10: 20 61 73 73 65 72 74 46 61 6c 73 65 28 6d 44 61   assertFalse(mDa
1a20: 74 61 62 61 73 65 2e 69 73 44 62 4c 6f 63 6b 65  tabase.isDbLocke
1a30: 64 42 79 43 75 72 72 65 6e 74 54 68 72 65 61 64  dByCurrentThread
1a40: 28 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ());.        ass
1a50: 65 72 74 46 61 6c 73 65 28 6d 44 61 74 61 62 61  ertFalse(mDataba
1a60: 73 65 2e 69 73 44 62 4c 6f 63 6b 65 64 42 79 4f  se.isDbLockedByO
1a70: 74 68 65 72 54 68 72 65 61 64 73 28 29 29 3b 0a  therThreads());.
1a80: 0a 20 20 20 20 20 20 20 20 2f 2f 20 54 65 73 74  .        // Test
1a90: 20 61 20 72 6f 6c 6c 65 64 2d 62 61 63 6b 20 74   a rolled-back t
1aa0: 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20 20  ransaction..    
1ab0: 20 20 20 20 73 65 74 4e 75 6d 28 30 29 3b 0a 20      setNum(0);. 
1ac0: 20 20 20 20 20 20 20 61 73 73 65 72 74 46 61 6c         assertFal
1ad0: 73 65 28 6d 44 61 74 61 62 61 73 65 2e 69 6e 54  se(mDatabase.inT
1ae0: 72 61 6e 73 61 63 74 69 6f 6e 28 29 29 3b 0a 20  ransaction());. 
1af0: 20 20 20 20 20 20 20 6d 44 61 74 61 62 61 73 65         mDatabase
1b00: 2e 62 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f  .beginTransactio
1b10: 6e 28 29 3b 0a 20 20 20 20 20 20 20 20 73 65 74  n();.        set
1b20: 4e 75 6d 28 31 29 3b 0a 20 20 20 20 20 20 20 20  Num(1);.        
1b30: 61 73 73 65 72 74 54 72 75 65 28 6d 44 61 74 61  assertTrue(mData
1b40: 62 61 73 65 2e 69 6e 54 72 61 6e 73 61 63 74 69  base.inTransacti
1b50: 6f 6e 28 29 29 3b 0a 20 20 20 20 20 20 20 20 6d  on());.        m
1b60: 44 61 74 61 62 61 73 65 2e 65 6e 64 54 72 61 6e  Database.endTran
1b70: 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20 20 20 20  saction();.     
1b80: 20 20 20 61 73 73 65 72 74 46 61 6c 73 65 28 6d     assertFalse(m
1b90: 44 61 74 61 62 61 73 65 2e 69 6e 54 72 61 6e 73  Database.inTrans
1ba0: 61 63 74 69 6f 6e 28 29 29 3b 0a 20 20 20 20 20  action());.     
1bb0: 20 20 20 61 73 73 65 72 74 4e 75 6d 28 30 29 3b     assertNum(0);
1bc0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 46  .        assertF
1bd0: 61 6c 73 65 28 6d 44 61 74 61 62 61 73 65 2e 69  alse(mDatabase.i
1be0: 73 44 62 4c 6f 63 6b 65 64 42 79 43 75 72 72 65  sDbLockedByCurre
1bf0: 6e 74 54 68 72 65 61 64 28 29 29 3b 0a 20 20 20  ntThread());.   
1c00: 20 20 20 20 20 61 73 73 65 72 74 46 61 6c 73 65       assertFalse
1c10: 28 6d 44 61 74 61 62 61 73 65 2e 69 73 44 62 4c  (mDatabase.isDbL
1c20: 6f 63 6b 65 64 42 79 4f 74 68 65 72 54 68 72 65  ockedByOtherThre
1c30: 61 64 73 28 29 29 3b 0a 0a 20 20 20 20 20 20 20  ads());..       
1c40: 20 2f 2f 20 69 74 20 73 68 6f 75 6c 64 20 74 68   // it should th
1c50: 72 6f 77 20 49 6c 6c 65 67 61 6c 53 74 61 74 65  row IllegalState
1c60: 45 78 63 65 70 74 69 6f 6e 20 69 66 20 77 65 20  Exception if we 
1c70: 65 6e 64 20 61 20 6e 6f 6e 2d 65 78 69 73 74 65  end a non-existe
1c80: 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  nt transaction..
1c90: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 54 68          assertTh
1ca0: 72 6f 77 73 49 6c 6c 65 67 61 6c 53 74 61 74 65  rowsIllegalState
1cb0: 28 6e 65 77 20 52 75 6e 6e 61 62 6c 65 28 29 20  (new Runnable() 
1cc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  {.            pu
1cd0: 62 6c 69 63 20 76 6f 69 64 20 72 75 6e 28 29 20  blic void run() 
1ce0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
1cf0: 20 20 6d 44 61 74 61 62 61 73 65 2e 65 6e 64 54    mDatabase.endT
1d00: 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20  ransaction();.  
1d10: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1d20: 20 20 20 20 7d 29 3b 0a 0a 20 20 20 20 20 20 20      });..       
1d30: 20 2f 2f 20 69 74 20 73 68 6f 75 6c 64 20 74 68   // it should th
1d40: 72 6f 77 20 49 6c 6c 65 67 61 6c 53 74 61 74 65  row IllegalState
1d50: 45 78 63 65 70 74 69 6f 6e 20 69 66 20 61 20 73  Exception if a s
1d60: 65 74 20 61 20 6e 6f 6e 2d 65 78 69 73 74 65 6e  et a non-existen
1d70: 74 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 73  t transaction as
1d80: 20 63 6c 65 61 6e 2e 0a 20 20 20 20 20 20 20 20   clean..        
1d90: 61 73 73 65 72 74 54 68 72 6f 77 73 49 6c 6c 65  assertThrowsIlle
1da0: 67 61 6c 53 74 61 74 65 28 6e 65 77 20 52 75 6e  galState(new Run
1db0: 6e 61 62 6c 65 28 29 20 7b 0a 20 20 20 20 20 20  nable() {.      
1dc0: 20 20 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69        public voi
1dd0: 64 20 72 75 6e 28 29 20 7b 0a 20 20 20 20 20 20  d run() {.      
1de0: 20 20 20 20 20 20 20 20 20 20 6d 44 61 74 61 62            mDatab
1df0: 61 73 65 2e 73 65 74 54 72 61 6e 73 61 63 74 69  ase.setTransacti
1e00: 6f 6e 53 75 63 63 65 73 73 66 75 6c 28 29 3b 0a  onSuccessful();.
1e10: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
1e20: 20 20 20 20 20 20 7d 29 3b 0a 0a 20 20 20 20 20        });..     
1e30: 20 20 20 6d 44 61 74 61 62 61 73 65 2e 62 65 67     mDatabase.beg
1e40: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b  inTransaction();
1e50: 0a 20 20 20 20 20 20 20 20 6d 44 61 74 61 62 61  .        mDataba
1e60: 73 65 2e 73 65 74 54 72 61 6e 73 61 63 74 69 6f  se.setTransactio
1e70: 6e 53 75 63 63 65 73 73 66 75 6c 28 29 3b 0a 20  nSuccessful();. 
1e80: 20 20 20 20 20 20 20 2f 2f 20 69 74 20 73 68 6f         // it sho
1e90: 75 6c 64 20 74 68 72 6f 77 20 49 6c 6c 65 67 61  uld throw Illega
1ea0: 6c 53 74 61 74 65 45 78 63 65 70 74 69 6f 6e 20  lStateException 
1eb0: 69 66 20 77 65 20 6d 61 72 6b 20 61 20 74 72 61  if we mark a tra
1ec0: 6e 73 61 63 74 69 6f 6e 20 61 73 20 63 6c 65 61  nsaction as clea
1ed0: 6e 20 74 77 69 63 65 2e 0a 20 20 20 20 20 20 20  n twice..       
1ee0: 20 61 73 73 65 72 74 54 68 72 6f 77 73 49 6c 6c   assertThrowsIll
1ef0: 65 67 61 6c 53 74 61 74 65 28 6e 65 77 20 52 75  egalState(new Ru
1f00: 6e 6e 61 62 6c 65 28 29 20 7b 0a 20 20 20 20 20  nnable() {.     
1f10: 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 76 6f         public vo
1f20: 69 64 20 72 75 6e 28 29 20 7b 0a 20 20 20 20 20  id run() {.     
1f30: 20 20 20 20 20 20 20 20 20 20 20 6d 44 61 74 61             mData
1f40: 62 61 73 65 2e 73 65 74 54 72 61 6e 73 61 63 74  base.setTransact
1f50: 69 6f 6e 53 75 63 63 65 73 73 66 75 6c 28 29 3b  ionSuccessful();
1f60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
1f70: 20 20 20 20 20 20 20 7d 29 3b 0a 20 20 20 20 20         });.     
1f80: 20 20 20 2f 2f 20 69 74 20 73 68 6f 75 6c 64 20     // it should 
1f90: 74 68 72 6f 77 20 49 6c 6c 65 67 61 6c 53 74 61  throw IllegalSta
1fa0: 74 65 45 78 63 65 70 74 69 6f 6e 20 69 66 20 77  teException if w
1fb0: 65 20 62 65 67 69 6e 20 61 20 74 72 61 6e 73 61  e begin a transa
1fc0: 63 74 69 6f 6e 20 61 66 74 65 72 20 6d 61 72 6b  ction after mark
1fd0: 69 6e 67 20 74 68 65 0a 20 20 20 20 20 20 20 20  ing the.        
1fe0: 2f 2f 20 70 61 72 65 6e 74 20 61 73 20 63 6c 65  // parent as cle
1ff0: 61 6e 2e 0a 20 20 20 20 20 20 20 20 61 73 73 65  an..        asse
2000: 72 74 54 68 72 6f 77 73 49 6c 6c 65 67 61 6c 53  rtThrowsIllegalS
2010: 74 61 74 65 28 6e 65 77 20 52 75 6e 6e 61 62 6c  tate(new Runnabl
2020: 65 28 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  e() {.          
2030: 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20 72 75    public void ru
2040: 6e 28 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  n() {.          
2050: 20 20 20 20 20 20 6d 44 61 74 61 62 61 73 65 2e        mDatabase.
2060: 62 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  beginTransaction
2070: 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ();.            
2080: 7d 0a 20 20 20 20 20 20 20 20 7d 29 3b 0a 20 20  }.        });.  
2090: 20 20 20 20 20 20 6d 44 61 74 61 62 61 73 65 2e        mDatabase.
20a0: 65 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  endTransaction()
20b0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
20c0: 46 61 6c 73 65 28 6d 44 61 74 61 62 61 73 65 2e  False(mDatabase.
20d0: 69 73 44 62 4c 6f 63 6b 65 64 42 79 43 75 72 72  isDbLockedByCurr
20e0: 65 6e 74 54 68 72 65 61 64 28 29 29 3b 0a 20 20  entThread());.  
20f0: 20 20 20 20 20 20 61 73 73 65 72 74 46 61 6c 73        assertFals
2100: 65 28 6d 44 61 74 61 62 61 73 65 2e 69 73 44 62  e(mDatabase.isDb
2110: 4c 6f 63 6b 65 64 42 79 4f 74 68 65 72 54 68 72  LockedByOtherThr
2120: 65 61 64 73 28 29 29 3b 0a 0a 20 20 20 20 20 20  eads());..      
2130: 20 20 61 73 73 65 72 74 46 61 6c 73 65 28 6d 44    assertFalse(mD
2140: 61 74 61 62 61 73 65 2e 69 6e 54 72 61 6e 73 61  atabase.inTransa
2150: 63 74 69 6f 6e 28 29 29 3b 0a 20 20 20 20 20 20  ction());.      
2160: 20 20 2f 2f 20 54 65 73 74 20 61 20 74 77 6f 2d    // Test a two-
2170: 6c 65 76 65 6c 20 74 72 61 6e 73 61 63 74 69 6f  level transactio
2180: 6e 2e 0a 20 20 20 20 20 20 20 20 73 65 74 4e 75  n..        setNu
2190: 6d 28 30 29 3b 0a 20 20 20 20 20 20 20 20 6d 44  m(0);.        mD
21a0: 61 74 61 62 61 73 65 2e 62 65 67 69 6e 54 72 61  atabase.beginTra
21b0: 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20 20 20  nsaction();.    
21c0: 20 20 20 20 61 73 73 65 72 74 54 72 75 65 28 6d      assertTrue(m
21d0: 44 61 74 61 62 61 73 65 2e 69 6e 54 72 61 6e 73  Database.inTrans
21e0: 61 63 74 69 6f 6e 28 29 29 3b 0a 20 20 20 20 20  action());.     
21f0: 20 20 20 6d 44 61 74 61 62 61 73 65 2e 62 65 67     mDatabase.beg
2200: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b  inTransaction();
2210: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 54  .        assertT
2220: 72 75 65 28 6d 44 61 74 61 62 61 73 65 2e 69 6e  rue(mDatabase.in
2230: 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 29 3b 0a  Transaction());.
2240: 20 20 20 20 20 20 20 20 73 65 74 4e 75 6d 28 31          setNum(1
2250: 29 3b 0a 20 20 20 20 20 20 20 20 6d 44 61 74 61  );.        mData
2260: 62 61 73 65 2e 73 65 74 54 72 61 6e 73 61 63 74  base.setTransact
2270: 69 6f 6e 53 75 63 63 65 73 73 66 75 6c 28 29 3b  ionSuccessful();
2280: 0a 20 20 20 20 20 20 20 20 6d 44 61 74 61 62 61  .        mDataba
2290: 73 65 2e 65 6e 64 54 72 61 6e 73 61 63 74 69 6f  se.endTransactio
22a0: 6e 28 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  n();.        ass
22b0: 65 72 74 54 72 75 65 28 6d 44 61 74 61 62 61 73  ertTrue(mDatabas
22c0: 65 2e 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28  e.inTransaction(
22d0: 29 29 3b 0a 20 20 20 20 20 20 20 20 6d 44 61 74  ));.        mDat
22e0: 61 62 61 73 65 2e 73 65 74 54 72 61 6e 73 61 63  abase.setTransac
22f0: 74 69 6f 6e 53 75 63 63 65 73 73 66 75 6c 28 29  tionSuccessful()
2300: 3b 0a 20 20 20 20 20 20 20 20 6d 44 61 74 61 62  ;.        mDatab
2310: 61 73 65 2e 65 6e 64 54 72 61 6e 73 61 63 74 69  ase.endTransacti
2320: 6f 6e 28 29 3b 0a 20 20 20 20 20 20 20 20 61 73  on();.        as
2330: 73 65 72 74 46 61 6c 73 65 28 6d 44 61 74 61 62  sertFalse(mDatab
2340: 61 73 65 2e 69 6e 54 72 61 6e 73 61 63 74 69 6f  ase.inTransactio
2350: 6e 28 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73  n());.        as
2360: 73 65 72 74 4e 75 6d 28 31 29 3b 0a 20 20 20 20  sertNum(1);.    
2370: 20 20 20 20 61 73 73 65 72 74 46 61 6c 73 65 28      assertFalse(
2380: 6d 44 61 74 61 62 61 73 65 2e 69 73 44 62 4c 6f  mDatabase.isDbLo
2390: 63 6b 65 64 42 79 43 75 72 72 65 6e 74 54 68 72  ckedByCurrentThr
23a0: 65 61 64 28 29 29 3b 0a 20 20 20 20 20 20 20 20  ead());.        
23b0: 61 73 73 65 72 74 46 61 6c 73 65 28 6d 44 61 74  assertFalse(mDat
23c0: 61 62 61 73 65 2e 69 73 44 62 4c 6f 63 6b 65 64  abase.isDbLocked
23d0: 42 79 4f 74 68 65 72 54 68 72 65 61 64 73 28 29  ByOtherThreads()
23e0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 54  );..        // T
23f0: 65 73 74 20 72 6f 6c 6c 69 6e 67 20 62 61 63 6b  est rolling back
2400: 20 61 6e 20 69 6e 6e 65 72 20 74 72 61 6e 73 61   an inner transa
2410: 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 73  ction..        s
2420: 65 74 4e 75 6d 28 30 29 3b 0a 20 20 20 20 20 20  etNum(0);.      
2430: 20 20 6d 44 61 74 61 62 61 73 65 2e 62 65 67 69    mDatabase.begi
2440: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a  nTransaction();.
2450: 20 20 20 20 20 20 20 20 6d 44 61 74 61 62 61 73          mDatabas
2460: 65 2e 62 65 67 69 6e 54 72 61 6e 73 61 63 74 69  e.beginTransacti
2470: 6f 6e 28 29 3b 0a 20 20 20 20 20 20 20 20 73 65  on();.        se
2480: 74 4e 75 6d 28 31 29 3b 0a 20 20 20 20 20 20 20  tNum(1);.       
2490: 20 6d 44 61 74 61 62 61 73 65 2e 65 6e 64 54 72   mDatabase.endTr
24a0: 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20 20  ansaction();.   
24b0: 20 20 20 20 20 6d 44 61 74 61 62 61 73 65 2e 73       mDatabase.s
24c0: 65 74 54 72 61 6e 73 61 63 74 69 6f 6e 53 75 63  etTransactionSuc
24d0: 63 65 73 73 66 75 6c 28 29 3b 0a 20 20 20 20 20  cessful();.     
24e0: 20 20 20 6d 44 61 74 61 62 61 73 65 2e 65 6e 64     mDatabase.end
24f0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20  Transaction();. 
2500: 20 20 20 20 20 20 20 61 73 73 65 72 74 4e 75 6d         assertNum
2510: 28 30 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  (0);.        ass
2520: 65 72 74 46 61 6c 73 65 28 6d 44 61 74 61 62 61  ertFalse(mDataba
2530: 73 65 2e 69 73 44 62 4c 6f 63 6b 65 64 42 79 43  se.isDbLockedByC
2540: 75 72 72 65 6e 74 54 68 72 65 61 64 28 29 29 3b  urrentThread());
2550: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 46  .        assertF
2560: 61 6c 73 65 28 6d 44 61 74 61 62 61 73 65 2e 69  alse(mDatabase.i
2570: 73 44 62 4c 6f 63 6b 65 64 42 79 4f 74 68 65 72  sDbLockedByOther
2580: 54 68 72 65 61 64 73 28 29 29 3b 0a 0a 20 20 20  Threads());..   
2590: 20 20 20 20 20 2f 2f 20 54 65 73 74 20 72 6f 6c       // Test rol
25a0: 6c 69 6e 67 20 62 61 63 6b 20 61 6e 20 6f 75 74  ling back an out
25b0: 65 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  er transaction..
25c0: 20 20 20 20 20 20 20 20 73 65 74 4e 75 6d 28 30          setNum(0
25d0: 29 3b 0a 20 20 20 20 20 20 20 20 6d 44 61 74 61  );.        mData
25e0: 62 61 73 65 2e 62 65 67 69 6e 54 72 61 6e 73 61  base.beginTransa
25f0: 63 74 69 6f 6e 28 29 3b 0a 20 20 20 20 20 20 20  ction();.       
2600: 20 6d 44 61 74 61 62 61 73 65 2e 62 65 67 69 6e   mDatabase.begin
2610: 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20  Transaction();. 
2620: 20 20 20 20 20 20 20 73 65 74 4e 75 6d 28 31 29         setNum(1)
2630: 3b 0a 20 20 20 20 20 20 20 20 6d 44 61 74 61 62  ;.        mDatab
2640: 61 73 65 2e 73 65 74 54 72 61 6e 73 61 63 74 69  ase.setTransacti
2650: 6f 6e 53 75 63 63 65 73 73 66 75 6c 28 29 3b 0a  onSuccessful();.
2660: 20 20 20 20 20 20 20 20 6d 44 61 74 61 62 61 73          mDatabas
2670: 65 2e 65 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  e.endTransaction
2680: 28 29 3b 0a 20 20 20 20 20 20 20 20 6d 44 61 74  ();.        mDat
2690: 61 62 61 73 65 2e 65 6e 64 54 72 61 6e 73 61 63  abase.endTransac
26a0: 74 69 6f 6e 28 29 3b 0a 20 20 20 20 20 20 20 20  tion();.        
26b0: 61 73 73 65 72 74 4e 75 6d 28 30 29 3b 0a 20 20  assertNum(0);.  
26c0: 20 20 20 20 20 20 61 73 73 65 72 74 46 61 6c 73        assertFals
26d0: 65 28 6d 44 61 74 61 62 61 73 65 2e 69 73 44 62  e(mDatabase.isDb
26e0: 4c 6f 63 6b 65 64 42 79 43 75 72 72 65 6e 74 54  LockedByCurrentT
26f0: 68 72 65 61 64 28 29 29 3b 0a 20 20 20 20 20 20  hread());.      
2700: 20 20 61 73 73 65 72 74 46 61 6c 73 65 28 6d 44    assertFalse(mD
2710: 61 74 61 62 61 73 65 2e 69 73 44 62 4c 6f 63 6b  atabase.isDbLock
2720: 65 64 42 79 4f 74 68 65 72 54 68 72 65 61 64 73  edByOtherThreads
2730: 28 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ());.    }..    
2740: 70 72 69 76 61 74 65 20 76 6f 69 64 20 73 65 74  private void set
2750: 4e 75 6d 28 69 6e 74 20 6e 75 6d 29 20 7b 0a 20  Num(int num) {. 
2760: 20 20 20 20 20 20 20 6d 44 61 74 61 62 61 73 65         mDatabase
2770: 2e 65 78 65 63 53 51 4c 28 22 55 50 44 41 54 45  .execSQL("UPDATE
2780: 20 74 65 73 74 20 53 45 54 20 6e 75 6d 20 3d 20   test SET num = 
2790: 22 20 2b 20 6e 75 6d 29 3b 0a 20 20 20 20 7d 0a  " + num);.    }.
27a0: 0a 20 20 20 20 70 72 69 76 61 74 65 20 76 6f 69  .    private voi
27b0: 64 20 61 73 73 65 72 74 4e 75 6d 28 69 6e 74 20  d assertNum(int 
27c0: 6e 75 6d 29 20 7b 0a 20 20 20 20 20 20 20 20 61  num) {.        a
27d0: 73 73 65 72 74 45 71 75 61 6c 73 28 6e 75 6d 2c  ssertEquals(num,
27e0: 20 44 61 74 61 62 61 73 65 55 74 69 6c 73 2e 6c   DatabaseUtils.l
27f0: 6f 6e 67 46 6f 72 51 75 65 72 79 28 6d 44 61 74  ongForQuery(mDat
2800: 61 62 61 73 65 2c 0a 20 20 20 20 20 20 20 20 20  abase,.         
2810: 20 20 20 20 20 20 20 22 53 45 4c 45 43 54 20 6e         "SELECT n
2820: 75 6d 20 46 52 4f 4d 20 74 65 73 74 22 2c 20 6e  um FROM test", n
2830: 75 6c 6c 29 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ull));.    }..  
2840: 20 20 70 72 69 76 61 74 65 20 76 6f 69 64 20 61    private void a
2850: 73 73 65 72 74 54 68 72 6f 77 73 49 6c 6c 65 67  ssertThrowsIlleg
2860: 61 6c 53 74 61 74 65 28 52 75 6e 6e 61 62 6c 65  alState(Runnable
2870: 20 72 29 20 7b 0a 20 20 20 20 20 20 20 20 74 72   r) {.        tr
2880: 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y {.            
2890: 72 2e 72 75 6e 28 29 3b 0a 20 20 20 20 20 20 20  r.run();.       
28a0: 20 20 20 20 20 66 61 69 6c 28 22 64 69 64 20 6e       fail("did n
28b0: 6f 74 20 74 68 72 6f 77 20 65 78 70 65 63 74 65  ot throw expecte
28c0: 64 20 49 6c 6c 65 67 61 6c 53 74 61 74 65 45 78  d IllegalStateEx
28d0: 63 65 70 74 69 6f 6e 22 29 3b 0a 20 20 20 20 20  ception");.     
28e0: 20 20 20 7d 20 63 61 74 63 68 20 28 49 6c 6c 65     } catch (Ille
28f0: 67 61 6c 53 74 61 74 65 45 78 63 65 70 74 69 6f  galStateExceptio
2900: 6e 20 65 29 20 7b 0a 20 20 20 20 20 20 20 20 7d  n e) {.        }
2910: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 75 62 6c  .    }..    publ
2920: 69 63 20 76 6f 69 64 20 74 65 73 74 41 63 63 65  ic void testAcce
2930: 73 73 4d 61 78 69 6d 75 6d 53 69 7a 65 28 29 20  ssMaximumSize() 
2940: 7b 0a 20 20 20 20 20 20 20 20 6c 6f 6e 67 20 63  {.        long c
2950: 75 72 4d 61 78 69 6d 75 6d 53 69 7a 65 20 3d 20  urMaximumSize = 
2960: 6d 44 61 74 61 62 61 73 65 2e 67 65 74 4d 61 78  mDatabase.getMax
2970: 69 6d 75 6d 53 69 7a 65 28 29 3b 0a 0a 20 20 20  imumSize();..   
2980: 20 20 20 20 20 2f 2f 20 74 68 65 20 6e 65 77 20       // the new 
2990: 6d 61 78 69 6d 75 6d 20 73 69 7a 65 20 69 73 20  maximum size is 
29a0: 6c 65 73 73 20 74 68 61 6e 20 74 68 65 20 63 75  less than the cu
29b0: 72 72 65 6e 74 20 73 69 7a 65 2e 0a 20 20 20 20  rrent size..    
29c0: 20 20 20 20 6d 44 61 74 61 62 61 73 65 2e 73 65      mDatabase.se
29d0: 74 4d 61 78 69 6d 75 6d 53 69 7a 65 28 63 75 72  tMaximumSize(cur
29e0: 4d 61 78 69 6d 75 6d 53 69 7a 65 20 2d 20 31 29  MaximumSize - 1)
29f0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
2a00: 45 71 75 61 6c 73 28 63 75 72 4d 61 78 69 6d 75  Equals(curMaximu
2a10: 6d 53 69 7a 65 2c 20 6d 44 61 74 61 62 61 73 65  mSize, mDatabase
2a20: 2e 67 65 74 4d 61 78 69 6d 75 6d 53 69 7a 65 28  .getMaximumSize(
2a30: 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20  ));..        // 
2a40: 74 68 65 20 6e 65 77 20 6d 61 78 69 6d 75 6d 20  the new maximum 
2a50: 73 69 7a 65 20 69 73 20 6d 6f 72 65 20 74 68 61  size is more tha
2a60: 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20 73 69  n the current si
2a70: 7a 65 2e 0a 20 20 20 20 20 20 20 20 6d 44 61 74  ze..        mDat
2a80: 61 62 61 73 65 2e 73 65 74 4d 61 78 69 6d 75 6d  abase.setMaximum
2a90: 53 69 7a 65 28 63 75 72 4d 61 78 69 6d 75 6d 53  Size(curMaximumS
2aa0: 69 7a 65 20 2b 20 31 29 3b 0a 20 20 20 20 20 20  ize + 1);.      
2ab0: 20 20 61 73 73 65 72 74 45 71 75 61 6c 73 28 63    assertEquals(c
2ac0: 75 72 4d 61 78 69 6d 75 6d 53 69 7a 65 20 2b 20  urMaximumSize + 
2ad0: 6d 44 61 74 61 62 61 73 65 2e 67 65 74 50 61 67  mDatabase.getPag
2ae0: 65 53 69 7a 65 28 29 2c 20 6d 44 61 74 61 62 61  eSize(), mDataba
2af0: 73 65 2e 67 65 74 4d 61 78 69 6d 75 6d 53 69 7a  se.getMaximumSiz
2b00: 65 28 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73  e());.        as
2b10: 73 65 72 74 54 72 75 65 28 6d 44 61 74 61 62 61  sertTrue(mDataba
2b20: 73 65 2e 67 65 74 4d 61 78 69 6d 75 6d 53 69 7a  se.getMaximumSiz
2b30: 65 28 29 20 3e 20 63 75 72 4d 61 78 69 6d 75 6d  e() > curMaximum
2b40: 53 69 7a 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  Size);.    }..  
2b50: 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20 74 65    public void te
2b60: 73 74 41 63 63 65 73 73 50 61 67 65 53 69 7a 65  stAccessPageSize
2b70: 28 29 20 7b 0a 20 20 20 20 20 20 20 20 46 69 6c  () {.        Fil
2b80: 65 20 64 61 74 61 62 61 73 65 46 69 6c 65 20 3d  e databaseFile =
2b90: 20 6e 65 77 20 46 69 6c 65 28 6d 44 61 74 61 62   new File(mDatab
2ba0: 61 73 65 44 69 72 2c 20 22 64 61 74 61 62 61 73  aseDir, "databas
2bb0: 65 2e 64 62 22 29 3b 0a 20 20 20 20 20 20 20 20  e.db");.        
2bc0: 69 66 20 28 64 61 74 61 62 61 73 65 46 69 6c 65  if (databaseFile
2bd0: 2e 65 78 69 73 74 73 28 29 29 20 7b 0a 20 20 20  .exists()) {.   
2be0: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
2bf0: 65 46 69 6c 65 2e 64 65 6c 65 74 65 28 29 3b 0a  eFile.delete();.
2c00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2c10: 20 20 53 51 4c 69 74 65 44 61 74 61 62 61 73 65    SQLiteDatabase
2c20: 20 64 61 74 61 62 61 73 65 20 3d 20 6e 75 6c 6c   database = null
2c30: 3b 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a  ;.        try {.
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61              data
2c50: 62 61 73 65 20 3d 20 53 51 4c 69 74 65 44 61 74  base = SQLiteDat
2c60: 61 62 61 73 65 2e 6f 70 65 6e 4f 72 43 72 65 61  abase.openOrCrea
2c70: 74 65 44 61 74 61 62 61 73 65 28 64 61 74 61 62  teDatabase(datab
2c80: 61 73 65 46 69 6c 65 2e 67 65 74 50 61 74 68 28  aseFile.getPath(
2c90: 29 2c 20 6e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20  ), null);..     
2ca0: 20 20 20 20 20 20 20 6c 6f 6e 67 20 69 6e 69 74         long init
2cb0: 69 61 6c 56 61 6c 75 65 20 3d 20 64 61 74 61 62  ialValue = datab
2cc0: 61 73 65 2e 67 65 74 50 61 67 65 53 69 7a 65 28  ase.getPageSize(
2cd0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  );.            /
2ce0: 2f 20 63 68 65 63 6b 20 74 68 61 74 20 74 68 69  / check that thi
2cf0: 73 20 64 6f 65 73 20 6e 6f 74 20 74 68 72 6f 77  s does not throw
2d00: 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 0a 20 20   an exception.  
2d10: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 65 74            // set
2d20: 74 69 6e 67 20 61 20 64 69 66 66 65 72 65 6e 74  ting a different
2d30: 20 70 61 67 65 20 73 69 7a 65 20 6d 61 79 20 6e   page size may n
2d40: 6f 74 20 62 65 20 73 75 70 70 6f 72 74 65 64 20  ot be supported 
2d50: 61 66 74 65 72 20 74 68 65 20 44 42 20 68 61 73  after the DB has
2d60: 20 62 65 65 6e 20 63 72 65 61 74 65 64 0a 20 20   been created.  
2d70: 20 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61            databa
2d80: 73 65 2e 73 65 74 50 61 67 65 53 69 7a 65 28 69  se.setPageSize(i
2d90: 6e 69 74 69 61 6c 56 61 6c 75 65 29 3b 0a 20 20  nitialValue);.  
2da0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
2db0: 45 71 75 61 6c 73 28 69 6e 69 74 69 61 6c 56 61  Equals(initialVa
2dc0: 6c 75 65 2c 20 64 61 74 61 62 61 73 65 2e 67 65  lue, database.ge
2dd0: 74 50 61 67 65 53 69 7a 65 28 29 29 3b 0a 0a 20  tPageSize());.. 
2de0: 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79         } finally
2df0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   {.            i
2e00: 66 20 28 64 61 74 61 62 61 73 65 20 21 3d 20 6e  f (database != n
2e10: 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ull) {.         
2e20: 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65 2e         database.
2e30: 63 6c 6f 73 65 28 29 3b 0a 20 20 20 20 20 20 20  close();.       
2e40: 20 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73           databas
2e50: 65 46 69 6c 65 2e 64 65 6c 65 74 65 28 29 3b 0a  eFile.delete();.
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2e70: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
2e80: 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20 74     public void t
2e90: 65 73 74 43 6f 6d 70 69 6c 65 53 74 61 74 65 6d  estCompileStatem
2ea0: 65 6e 74 28 29 20 7b 0a 20 20 20 20 20 20 20 20  ent() {.        
2eb0: 6d 44 61 74 61 62 61 73 65 2e 65 78 65 63 53 51  mDatabase.execSQ
2ec0: 4c 28 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  L("CREATE TABLE 
2ed0: 74 65 73 74 20 28 5f 69 64 20 49 4e 54 45 47 45  test (_id INTEGE
2ee0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 22  R PRIMARY KEY, "
2ef0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2f00: 20 2b 20 22 6e 61 6d 65 20 54 45 58 54 2c 20 61   + "name TEXT, a
2f10: 67 65 20 49 4e 54 45 47 45 52 2c 20 61 64 64 72  ge INTEGER, addr
2f20: 65 73 73 20 54 45 58 54 29 3b 22 29 3b 0a 0a 20  ess TEXT);");.. 
2f30: 20 20 20 20 20 20 20 53 74 72 69 6e 67 20 6e 61         String na
2f40: 6d 65 20 3d 20 22 4d 69 6b 65 22 3b 0a 20 20 20  me = "Mike";.   
2f50: 20 20 20 20 20 69 6e 74 20 61 67 65 20 3d 20 32       int age = 2
2f60: 31 3b 0a 20 20 20 20 20 20 20 20 53 74 72 69 6e  1;.        Strin
2f70: 67 20 61 64 64 72 65 73 73 20 3d 20 22 4c 41 22  g address = "LA"
2f80: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 61 74  ;..        // at
2f90: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 2c 20   the beginning, 
2fa0: 74 68 65 72 65 20 69 73 20 6e 6f 20 72 65 63 6f  there is no reco
2fb0: 72 64 20 69 6e 20 74 68 65 20 64 61 74 61 62 61  rd in the databa
2fc0: 73 65 2e 0a 20 20 20 20 20 20 20 20 43 75 72 73  se..        Curs
2fd0: 6f 72 20 63 75 72 73 6f 72 20 3d 20 6d 44 61 74  or cursor = mDat
2fe0: 61 62 61 73 65 2e 71 75 65 72 79 28 22 74 65 73  abase.query("tes
2ff0: 74 22 2c 20 54 45 53 54 5f 50 52 4f 4a 45 43 54  t", TEST_PROJECT
3000: 49 4f 4e 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c  ION, null, null,
3010: 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e 75 6c   null, null, nul
3020: 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  l);.        asse
3030: 72 74 4e 6f 74 4e 75 6c 6c 28 63 75 72 73 6f 72  rtNotNull(cursor
3040: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
3050: 74 45 71 75 61 6c 73 28 30 2c 20 63 75 72 73 6f  tEquals(0, curso
3060: 72 2e 67 65 74 43 6f 75 6e 74 28 29 29 3b 0a 0a  r.getCount());..
3070: 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 20 73          String s
3080: 71 6c 20 3d 20 22 49 4e 53 45 52 54 20 49 4e 54  ql = "INSERT INT
3090: 4f 20 74 65 73 74 20 28 6e 61 6d 65 2c 20 61 67  O test (name, ag
30a0: 65 2c 20 61 64 64 72 65 73 73 29 20 56 41 4c 55  e, address) VALU
30b0: 45 53 20 28 3f 2c 20 3f 2c 20 3f 29 3b 22 3b 0a  ES (?, ?, ?);";.
30c0: 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 53 74          SQLiteSt
30d0: 61 74 65 6d 65 6e 74 20 69 6e 73 65 72 74 53 74  atement insertSt
30e0: 61 74 65 6d 65 6e 74 20 3d 20 6d 44 61 74 61 62  atement = mDatab
30f0: 61 73 65 2e 63 6f 6d 70 69 6c 65 53 74 61 74 65  ase.compileState
3100: 6d 65 6e 74 28 73 71 6c 29 3b 0a 20 20 20 20 20  ment(sql);.     
3110: 20 20 20 44 61 74 61 62 61 73 65 55 74 69 6c 73     DatabaseUtils
3120: 2e 62 69 6e 64 4f 62 6a 65 63 74 54 6f 50 72 6f  .bindObjectToPro
3130: 67 72 61 6d 28 69 6e 73 65 72 74 53 74 61 74 65  gram(insertState
3140: 6d 65 6e 74 2c 20 31 2c 20 6e 61 6d 65 29 3b 0a  ment, 1, name);.
3150: 20 20 20 20 20 20 20 20 44 61 74 61 62 61 73 65          Database
3160: 55 74 69 6c 73 2e 62 69 6e 64 4f 62 6a 65 63 74  Utils.bindObject
3170: 54 6f 50 72 6f 67 72 61 6d 28 69 6e 73 65 72 74  ToProgram(insert
3180: 53 74 61 74 65 6d 65 6e 74 2c 20 32 2c 20 61 67  Statement, 2, ag
3190: 65 29 3b 0a 20 20 20 20 20 20 20 20 44 61 74 61  e);.        Data
31a0: 62 61 73 65 55 74 69 6c 73 2e 62 69 6e 64 4f 62  baseUtils.bindOb
31b0: 6a 65 63 74 54 6f 50 72 6f 67 72 61 6d 28 69 6e  jectToProgram(in
31c0: 73 65 72 74 53 74 61 74 65 6d 65 6e 74 2c 20 33  sertStatement, 3
31d0: 2c 20 61 64 64 72 65 73 73 29 3b 0a 20 20 20 20  , address);.    
31e0: 20 20 20 20 69 6e 73 65 72 74 53 74 61 74 65 6d      insertStatem
31f0: 65 6e 74 2e 65 78 65 63 75 74 65 28 29 3b 0a 20  ent.execute();. 
3200: 20 20 20 20 20 20 20 69 6e 73 65 72 74 53 74 61         insertSta
3210: 74 65 6d 65 6e 74 2e 63 6c 6f 73 65 28 29 3b 0a  tement.close();.
3220: 20 20 20 20 20 20 20 20 63 75 72 73 6f 72 2e 63          cursor.c
3230: 6c 6f 73 65 28 29 3b 0a 0a 20 20 20 20 20 20 20  lose();..       
3240: 20 63 75 72 73 6f 72 20 3d 20 6d 44 61 74 61 62   cursor = mDatab
3250: 61 73 65 2e 71 75 65 72 79 28 22 74 65 73 74 22  ase.query("test"
3260: 2c 20 54 45 53 54 5f 50 52 4f 4a 45 43 54 49 4f  , TEST_PROJECTIO
3270: 4e 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e  N, null, null, n
3280: 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 29  ull, null, null)
3290: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
32a0: 4e 6f 74 4e 75 6c 6c 28 63 75 72 73 6f 72 29 3b  NotNull(cursor);
32b0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 45  .        assertE
32c0: 71 75 61 6c 73 28 31 2c 20 63 75 72 73 6f 72 2e  quals(1, cursor.
32d0: 67 65 74 43 6f 75 6e 74 28 29 29 3b 0a 20 20 20  getCount());.   
32e0: 20 20 20 20 20 63 75 72 73 6f 72 2e 6d 6f 76 65       cursor.move
32f0: 54 6f 4e 65 78 74 28 29 3b 0a 20 20 20 20 20 20  ToNext();.      
3300: 20 20 61 73 73 65 72 74 45 71 75 61 6c 73 28 6e    assertEquals(n
3310: 61 6d 65 2c 20 63 75 72 73 6f 72 2e 67 65 74 53  ame, cursor.getS
3320: 74 72 69 6e 67 28 43 4f 4c 55 4d 4e 5f 4e 41 4d  tring(COLUMN_NAM
3330: 45 5f 49 4e 44 45 58 29 29 3b 0a 20 20 20 20 20  E_INDEX));.     
3340: 20 20 20 61 73 73 65 72 74 45 71 75 61 6c 73 28     assertEquals(
3350: 61 67 65 2c 20 63 75 72 73 6f 72 2e 67 65 74 49  age, cursor.getI
3360: 6e 74 28 43 4f 4c 55 4d 4e 5f 41 47 45 5f 49 4e  nt(COLUMN_AGE_IN
3370: 44 45 58 29 29 3b 0a 20 20 20 20 20 20 20 20 61  DEX));.        a
3380: 73 73 65 72 74 45 71 75 61 6c 73 28 61 64 64 72  ssertEquals(addr
3390: 65 73 73 2c 20 63 75 72 73 6f 72 2e 67 65 74 53  ess, cursor.getS
33a0: 74 72 69 6e 67 28 43 4f 4c 55 4d 4e 5f 41 44 44  tring(COLUMN_ADD
33b0: 52 5f 49 4e 44 45 58 29 29 3b 0a 20 20 20 20 20  R_INDEX));.     
33c0: 20 20 20 63 75 72 73 6f 72 2e 63 6c 6f 73 65 28     cursor.close(
33d0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 53 51 4c 69  );..        SQLi
33e0: 74 65 53 74 61 74 65 6d 65 6e 74 20 64 65 6c 65  teStatement dele
33f0: 74 65 53 74 61 74 65 6d 65 6e 74 20 3d 20 6d 44  teStatement = mD
3400: 61 74 61 62 61 73 65 2e 63 6f 6d 70 69 6c 65 53  atabase.compileS
3410: 74 61 74 65 6d 65 6e 74 28 22 44 45 4c 45 54 45  tatement("DELETE
3420: 20 46 52 4f 4d 20 74 65 73 74 22 29 3b 0a 20 20   FROM test");.  
3430: 20 20 20 20 20 20 64 65 6c 65 74 65 53 74 61 74        deleteStat
3440: 65 6d 65 6e 74 2e 65 78 65 63 75 74 65 28 29 3b  ement.execute();
3450: 0a 0a 20 20 20 20 20 20 20 20 63 75 72 73 6f 72  ..        cursor
3460: 20 3d 20 6d 44 61 74 61 62 61 73 65 2e 71 75 65   = mDatabase.que
3470: 72 79 28 22 74 65 73 74 22 2c 20 6e 75 6c 6c 2c  ry("test", null,
3480: 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e 75 6c   null, null, nul
3490: 6c 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a  l, null, null);.
34a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 45 71          assertEq
34b0: 75 61 6c 73 28 30 2c 20 63 75 72 73 6f 72 2e 67  uals(0, cursor.g
34c0: 65 74 43 6f 75 6e 74 28 29 29 3b 0a 20 20 20 20  etCount());.    
34d0: 20 20 20 20 63 75 72 73 6f 72 2e 64 65 61 63 74      cursor.deact
34e0: 69 76 61 74 65 28 29 3b 0a 20 20 20 20 20 20 20  ivate();.       
34f0: 20 64 65 6c 65 74 65 53 74 61 74 65 6d 65 6e 74   deleteStatement
3500: 2e 63 6c 6f 73 65 28 29 3b 0a 20 20 20 20 20 20  .close();.      
3510: 20 20 63 75 72 73 6f 72 2e 63 6c 6f 73 65 28 29    cursor.close()
3520: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 75 62  ;.    }..    pub
3530: 6c 69 63 20 76 6f 69 64 20 74 65 73 74 44 65 6c  lic void testDel
3540: 65 74 65 28 29 20 7b 0a 20 20 20 20 20 20 20 20  ete() {.        
3550: 6d 44 61 74 61 62 61 73 65 2e 65 78 65 63 53 51  mDatabase.execSQ
3560: 4c 28 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  L("CREATE TABLE 
3570: 74 65 73 74 20 28 5f 69 64 20 49 4e 54 45 47 45  test (_id INTEGE
3580: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 22  R PRIMARY KEY, "
3590: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
35a0: 20 2b 20 22 6e 61 6d 65 20 54 45 58 54 2c 20 61   + "name TEXT, a
35b0: 67 65 20 49 4e 54 45 47 45 52 2c 20 61 64 64 72  ge INTEGER, addr
35c0: 65 73 73 20 54 45 58 54 29 3b 22 29 3b 0a 20 20  ess TEXT);");.  
35d0: 20 20 20 20 20 20 6d 44 61 74 61 62 61 73 65 2e        mDatabase.
35e0: 65 78 65 63 53 51 4c 28 22 49 4e 53 45 52 54 20  execSQL("INSERT 
35f0: 49 4e 54 4f 20 74 65 73 74 20 28 6e 61 6d 65 2c  INTO test (name,
3600: 20 61 67 65 2c 20 61 64 64 72 65 73 73 29 20 56   age, address) V
3610: 41 4c 55 45 53 20 28 27 4d 69 6b 65 27 2c 20 32  ALUES ('Mike', 2
3620: 30 2c 20 27 4c 41 27 29 3b 22 29 3b 0a 20 20 20  0, 'LA');");.   
3630: 20 20 20 20 20 6d 44 61 74 61 62 61 73 65 2e 65       mDatabase.e
3640: 78 65 63 53 51 4c 28 22 49 4e 53 45 52 54 20 49  xecSQL("INSERT I
3650: 4e 54 4f 20 74 65 73 74 20 28 6e 61 6d 65 2c 20  NTO test (name, 
3660: 61 67 65 2c 20 61 64 64 72 65 73 73 29 20 56 41  age, address) VA
3670: 4c 55 45 53 20 28 27 4a 61 63 6b 27 2c 20 33 30  LUES ('Jack', 30
3680: 2c 20 27 4c 6f 6e 64 6f 6e 27 29 3b 22 29 3b 0a  , 'London');");.
3690: 20 20 20 20 20 20 20 20 6d 44 61 74 61 62 61 73          mDatabas
36a0: 65 2e 65 78 65 63 53 51 4c 28 22 49 4e 53 45 52  e.execSQL("INSER
36b0: 54 20 49 4e 54 4f 20 74 65 73 74 20 28 6e 61 6d  T INTO test (nam
36c0: 65 2c 20 61 67 65 2c 20 61 64 64 72 65 73 73 29  e, age, address)
36d0: 20 56 41 4c 55 45 53 20 28 27 4a 69 6d 27 2c 20   VALUES ('Jim', 
36e0: 33 35 2c 20 27 43 68 69 63 61 67 6f 27 29 3b 22  35, 'Chicago');"
36f0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 64  );..        // d
3700: 65 6c 65 74 65 20 6f 6e 65 20 72 65 63 6f 72 64  elete one record
3710: 2e 0a 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f  ..        int co
3720: 75 6e 74 20 3d 20 6d 44 61 74 61 62 61 73 65 2e  unt = mDatabase.
3730: 64 65 6c 65 74 65 28 54 41 42 4c 45 5f 4e 41 4d  delete(TABLE_NAM
3740: 45 2c 20 22 6e 61 6d 65 20 3d 20 27 4d 69 6b 65  E, "name = 'Mike
3750: 27 22 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20  '", null);.     
3760: 20 20 20 61 73 73 65 72 74 45 71 75 61 6c 73 28     assertEquals(
3770: 31 2c 20 63 6f 75 6e 74 29 3b 0a 0a 20 20 20 20  1, count);..    
3780: 20 20 20 20 43 75 72 73 6f 72 20 63 75 72 73 6f      Cursor curso
3790: 72 20 3d 20 6d 44 61 74 61 62 61 73 65 2e 71 75  r = mDatabase.qu
37a0: 65 72 79 28 54 41 42 4c 45 5f 4e 41 4d 45 2c 20  ery(TABLE_NAME, 
37b0: 54 45 53 54 5f 50 52 4f 4a 45 43 54 49 4f 4e 2c  TEST_PROJECTION,
37c0: 20 6e 75 6c 6c 2c 0a 20 20 20 20 20 20 20 20 20   null,.         
37d0: 20 20 20 20 20 20 20 6e 75 6c 6c 2c 20 6e 75 6c         null, nul
37e0: 6c 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a  l, null, null);.
37f0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 4e 6f          assertNo
3800: 74 4e 75 6c 6c 28 63 75 72 73 6f 72 29 3b 0a 20  tNull(cursor);. 
3810: 20 20 20 20 20 20 20 2f 2f 20 74 68 65 72 65 20         // there 
3820: 61 72 65 20 32 20 72 65 63 6f 72 64 73 20 68 65  are 2 records he
3830: 72 65 2e 0a 20 20 20 20 20 20 20 20 61 73 73 65  re..        asse
3840: 72 74 45 71 75 61 6c 73 28 32 2c 20 63 75 72 73  rtEquals(2, curs
3850: 6f 72 2e 67 65 74 43 6f 75 6e 74 28 29 29 3b 0a  or.getCount());.
3860: 20 20 20 20 20 20 20 20 63 75 72 73 6f 72 2e 6d          cursor.m
3870: 6f 76 65 54 6f 46 69 72 73 74 28 29 3b 0a 20 20  oveToFirst();.  
3880: 20 20 20 20 20 20 61 73 73 65 72 74 45 71 75 61        assertEqua
3890: 6c 73 28 22 4a 61 63 6b 22 2c 20 63 75 72 73 6f  ls("Jack", curso
38a0: 72 2e 67 65 74 53 74 72 69 6e 67 28 43 4f 4c 55  r.getString(COLU
38b0: 4d 4e 5f 4e 41 4d 45 5f 49 4e 44 45 58 29 29 3b  MN_NAME_INDEX));
38c0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 45  .        assertE
38d0: 71 75 61 6c 73 28 33 30 2c 20 63 75 72 73 6f 72  quals(30, cursor
38e0: 2e 67 65 74 49 6e 74 28 43 4f 4c 55 4d 4e 5f 41  .getInt(COLUMN_A
38f0: 47 45 5f 49 4e 44 45 58 29 29 3b 0a 20 20 20 20  GE_INDEX));.    
3900: 20 20 20 20 61 73 73 65 72 74 45 71 75 61 6c 73      assertEquals
3910: 28 22 4c 6f 6e 64 6f 6e 22 2c 20 63 75 72 73 6f  ("London", curso
3920: 72 2e 67 65 74 53 74 72 69 6e 67 28 43 4f 4c 55  r.getString(COLU
3930: 4d 4e 5f 41 44 44 52 5f 49 4e 44 45 58 29 29 3b  MN_ADDR_INDEX));
3940: 0a 20 20 20 20 20 20 20 20 63 75 72 73 6f 72 2e  .        cursor.
3950: 6d 6f 76 65 54 6f 4e 65 78 74 28 29 3b 0a 20 20  moveToNext();.  
3960: 20 20 20 20 20 20 61 73 73 65 72 74 45 71 75 61        assertEqua
3970: 6c 73 28 22 4a 69 6d 22 2c 20 63 75 72 73 6f 72  ls("Jim", cursor
3980: 2e 67 65 74 53 74 72 69 6e 67 28 43 4f 4c 55 4d  .getString(COLUM
3990: 4e 5f 4e 41 4d 45 5f 49 4e 44 45 58 29 29 3b 0a  N_NAME_INDEX));.
39a0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 45 71          assertEq
39b0: 75 61 6c 73 28 33 35 2c 20 63 75 72 73 6f 72 2e  uals(35, cursor.
39c0: 67 65 74 49 6e 74 28 43 4f 4c 55 4d 4e 5f 41 47  getInt(COLUMN_AG
39d0: 45 5f 49 4e 44 45 58 29 29 3b 0a 20 20 20 20 20  E_INDEX));.     
39e0: 20 20 20 61 73 73 65 72 74 45 71 75 61 6c 73 28     assertEquals(
39f0: 22 43 68 69 63 61 67 6f 22 2c 20 63 75 72 73 6f  "Chicago", curso
3a00: 72 2e 67 65 74 53 74 72 69 6e 67 28 43 4f 4c 55  r.getString(COLU
3a10: 4d 4e 5f 41 44 44 52 5f 49 4e 44 45 58 29 29 3b  MN_ADDR_INDEX));
3a20: 0a 20 20 20 20 20 20 20 20 63 75 72 73 6f 72 2e  .        cursor.
3a30: 63 6c 6f 73 65 28 29 3b 0a 0a 20 20 20 20 20 20  close();..      
3a40: 20 20 2f 2f 20 64 65 6c 65 74 65 20 61 6e 6f 74    // delete anot
3a50: 68 65 72 20 72 65 63 6f 72 64 2e 0a 20 20 20 20  her record..    
3a60: 20 20 20 20 63 6f 75 6e 74 20 3d 20 6d 44 61 74      count = mDat
3a70: 61 62 61 73 65 2e 64 65 6c 65 74 65 28 54 41 42  abase.delete(TAB
3a80: 4c 45 5f 4e 41 4d 45 2c 20 22 6e 61 6d 65 20 3d  LE_NAME, "name =
3a90: 20 3f 22 2c 20 6e 65 77 20 53 74 72 69 6e 67 5b   ?", new String[
3aa0: 5d 20 7b 20 22 4a 61 63 6b 22 20 7d 29 3b 0a 20  ] { "Jack" });. 
3ab0: 20 20 20 20 20 20 20 61 73 73 65 72 74 45 71 75         assertEqu
3ac0: 61 6c 73 28 31 2c 20 63 6f 75 6e 74 29 3b 0a 0a  als(1, count);..
3ad0: 20 20 20 20 20 20 20 20 63 75 72 73 6f 72 20 3d          cursor =
3ae0: 20 6d 44 61 74 61 62 61 73 65 2e 71 75 65 72 79   mDatabase.query
3af0: 28 54 41 42 4c 45 5f 4e 41 4d 45 2c 20 54 45 53  (TABLE_NAME, TES
3b00: 54 5f 50 52 4f 4a 45 43 54 49 4f 4e 2c 20 6e 75  T_PROJECTION, nu
3b10: 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c 0a  ll, null, null,.
3b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b30: 6e 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20  null, null);.   
3b40: 20 20 20 20 20 61 73 73 65 72 74 4e 6f 74 4e 75       assertNotNu
3b50: 6c 6c 28 63 75 72 73 6f 72 29 3b 0a 20 20 20 20  ll(cursor);.    
3b60: 20 20 20 20 2f 2f 20 74 68 65 72 65 20 61 72 65      // there are
3b70: 20 31 20 72 65 63 6f 72 64 73 20 68 65 72 65 2e   1 records here.
3b80: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 45  .        assertE
3b90: 71 75 61 6c 73 28 31 2c 20 63 75 72 73 6f 72 2e  quals(1, cursor.
3ba0: 67 65 74 43 6f 75 6e 74 28 29 29 3b 0a 20 20 20  getCount());.   
3bb0: 20 20 20 20 20 63 75 72 73 6f 72 2e 6d 6f 76 65       cursor.move
3bc0: 54 6f 46 69 72 73 74 28 29 3b 0a 20 20 20 20 20  ToFirst();.     
3bd0: 20 20 20 61 73 73 65 72 74 45 71 75 61 6c 73 28     assertEquals(
3be0: 22 4a 69 6d 22 2c 20 63 75 72 73 6f 72 2e 67 65  "Jim", cursor.ge
3bf0: 74 53 74 72 69 6e 67 28 43 4f 4c 55 4d 4e 5f 4e  tString(COLUMN_N
3c00: 41 4d 45 5f 49 4e 44 45 58 29 29 3b 0a 20 20 20  AME_INDEX));.   
3c10: 20 20 20 20 20 61 73 73 65 72 74 45 71 75 61 6c       assertEqual
3c20: 73 28 33 35 2c 20 63 75 72 73 6f 72 2e 67 65 74  s(35, cursor.get
3c30: 49 6e 74 28 43 4f 4c 55 4d 4e 5f 41 47 45 5f 49  Int(COLUMN_AGE_I
3c40: 4e 44 45 58 29 29 3b 0a 20 20 20 20 20 20 20 20  NDEX));.        
3c50: 61 73 73 65 72 74 45 71 75 61 6c 73 28 22 43 68  assertEquals("Ch
3c60: 69 63 61 67 6f 22 2c 20 63 75 72 73 6f 72 2e 67  icago", cursor.g
3c70: 65 74 53 74 72 69 6e 67 28 43 4f 4c 55 4d 4e 5f  etString(COLUMN_
3c80: 41 44 44 52 5f 49 4e 44 45 58 29 29 3b 0a 20 20  ADDR_INDEX));.  
3c90: 20 20 20 20 20 20 63 75 72 73 6f 72 2e 63 6c 6f        cursor.clo
3ca0: 73 65 28 29 3b 0a 0a 20 20 20 20 20 20 20 20 6d  se();..        m
3cb0: 44 61 74 61 62 61 73 65 2e 65 78 65 63 53 51 4c  Database.execSQL
3cc0: 28 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 65  ("INSERT INTO te
3cd0: 73 74 20 28 6e 61 6d 65 2c 20 61 67 65 2c 20 61  st (name, age, a
3ce0: 64 64 72 65 73 73 29 20 56 41 4c 55 45 53 20 28  ddress) VALUES (
3cf0: 27 4d 69 6b 65 27 2c 20 32 30 2c 20 27 4c 41 27  'Mike', 20, 'LA'
3d00: 29 3b 22 29 3b 0a 20 20 20 20 20 20 20 20 6d 44  );");.        mD
3d10: 61 74 61 62 61 73 65 2e 65 78 65 63 53 51 4c 28  atabase.execSQL(
3d20: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 65 73  "INSERT INTO tes
3d30: 74 20 28 6e 61 6d 65 2c 20 61 67 65 2c 20 61 64  t (name, age, ad
3d40: 64 72 65 73 73 29 20 56 41 4c 55 45 53 20 28 27  dress) VALUES ('
3d50: 4a 61 63 6b 27 2c 20 33 30 2c 20 27 4c 6f 6e 64  Jack', 30, 'Lond
3d60: 6f 6e 27 29 3b 22 29 3b 0a 0a 20 20 20 20 20 20  on');");..      
3d70: 20 20 2f 2f 20 64 65 6c 65 74 65 20 61 6c 6c 20    // delete all 
3d80: 72 65 63 6f 72 64 73 2e 0a 20 20 20 20 20 20 20  records..       
3d90: 20 63 6f 75 6e 74 20 3d 20 6d 44 61 74 61 62 61   count = mDataba
3da0: 73 65 2e 64 65 6c 65 74 65 28 54 41 42 4c 45 5f  se.delete(TABLE_
3db0: 4e 41 4d 45 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c  NAME, null, null
3dc0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
3dd0: 74 45 71 75 61 6c 73 28 33 2c 20 63 6f 75 6e 74  tEquals(3, count
3de0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 63 75 72 73  );..        curs
3df0: 6f 72 20 3d 20 6d 44 61 74 61 62 61 73 65 2e 71  or = mDatabase.q
3e00: 75 65 72 79 28 54 41 42 4c 45 5f 4e 41 4d 45 2c  uery(TABLE_NAME,
3e10: 20 54 45 53 54 5f 50 52 4f 4a 45 43 54 49 4f 4e   TEST_PROJECTION
3e20: 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e 75  , null, null, nu
3e30: 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 29 3b  ll, null, null);
3e40: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 4e  .        assertN
3e50: 6f 74 4e 75 6c 6c 28 63 75 72 73 6f 72 29 3b 0a  otNull(cursor);.
3e60: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 45 71          assertEq
3e70: 75 61 6c 73 28 30 2c 20 63 75 72 73 6f 72 2e 67  uals(0, cursor.g
3e80: 65 74 43 6f 75 6e 74 28 29 29 3b 0a 20 20 20 20  etCount());.    
3e90: 20 20 20 20 63 75 72 73 6f 72 2e 63 6c 6f 73 65      cursor.close
3ea0: 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  ();.    }..    p
3eb0: 75 62 6c 69 63 20 76 6f 69 64 20 74 65 73 74 45  ublic void testE
3ec0: 78 65 63 53 51 4c 28 29 20 7b 0a 20 20 20 20 20  xecSQL() {.     
3ed0: 20 20 20 6d 44 61 74 61 62 61 73 65 2e 65 78 65     mDatabase.exe
3ee0: 63 53 51 4c 28 22 43 52 45 41 54 45 20 54 41 42  cSQL("CREATE TAB
3ef0: 4c 45 20 74 65 73 74 20 28 5f 69 64 20 49 4e 54  LE test (_id INT
3f00: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
3f10: 2c 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  , ".            
3f20: 20 20 20 20 2b 20 22 6e 61 6d 65 20 54 45 58 54      + "name TEXT
3f30: 2c 20 61 67 65 20 49 4e 54 45 47 45 52 2c 20 61  , age INTEGER, a
3f40: 64 64 72 65 73 73 20 54 45 58 54 29 3b 22 29 3b  ddress TEXT);");
3f50: 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 61 64 64  ..        // add
3f60: 20 61 20 6e 65 77 20 72 65 63 6f 72 64 2e 0a 20   a new record.. 
3f70: 20 20 20 20 20 20 20 6d 44 61 74 61 62 61 73 65         mDatabase
3f80: 2e 65 78 65 63 53 51 4c 28 22 49 4e 53 45 52 54  .execSQL("INSERT
3f90: 20 49 4e 54 4f 20 74 65 73 74 20 28 6e 61 6d 65   INTO test (name
3fa0: 2c 20 61 67 65 2c 20 61 64 64 72 65 73 73 29 20  , age, address) 
3fb0: 56 41 4c 55 45 53 20 28 27 4d 69 6b 65 27 2c 20  VALUES ('Mike', 
3fc0: 32 30 2c 20 27 4c 41 27 29 3b 22 29 3b 0a 0a 20  20, 'LA');");.. 
3fd0: 20 20 20 20 20 20 20 43 75 72 73 6f 72 20 63 75         Cursor cu
3fe0: 72 73 6f 72 20 3d 20 6d 44 61 74 61 62 61 73 65  rsor = mDatabase
3ff0: 2e 71 75 65 72 79 28 54 41 42 4c 45 5f 4e 41 4d  .query(TABLE_NAM
4000: 45 2c 20 54 45 53 54 5f 50 52 4f 4a 45 43 54 49  E, TEST_PROJECTI
4010: 4f 4e 2c 20 6e 75 6c 6c 2c 0a 20 20 20 20 20 20  ON, null,.      
4020: 20 20 20 20 20 20 20 20 20 20 6e 75 6c 6c 2c 20            null, 
4030: 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c  null, null, null
4040: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
4050: 74 4e 6f 74 4e 75 6c 6c 28 63 75 72 73 6f 72 29  tNotNull(cursor)
4060: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
4070: 45 71 75 61 6c 73 28 31 2c 20 63 75 72 73 6f 72  Equals(1, cursor
4080: 2e 67 65 74 43 6f 75 6e 74 28 29 29 3b 0a 20 20  .getCount());.  
4090: 20 20 20 20 20 20 63 75 72 73 6f 72 2e 6d 6f 76        cursor.mov
40a0: 65 54 6f 46 69 72 73 74 28 29 3b 0a 20 20 20 20  eToFirst();.    
40b0: 20 20 20 20 61 73 73 65 72 74 45 71 75 61 6c 73      assertEquals
40c0: 28 22 4d 69 6b 65 22 2c 20 63 75 72 73 6f 72 2e  ("Mike", cursor.
40d0: 67 65 74 53 74 72 69 6e 67 28 43 4f 4c 55 4d 4e  getString(COLUMN
40e0: 5f 4e 41 4d 45 5f 49 4e 44 45 58 29 29 3b 0a 20  _NAME_INDEX));. 
40f0: 20 20 20 20 20 20 20 61 73 73 65 72 74 45 71 75         assertEqu
4100: 61 6c 73 28 32 30 2c 20 63 75 72 73 6f 72 2e 67  als(20, cursor.g
4110: 65 74 49 6e 74 28 43 4f 4c 55 4d 4e 5f 41 47 45  etInt(COLUMN_AGE
4120: 5f 49 4e 44 45 58 29 29 3b 0a 20 20 20 20 20 20  _INDEX));.      
4130: 20 20 61 73 73 65 72 74 45 71 75 61 6c 73 28 22    assertEquals("
4140: 4c 41 22 2c 20 63 75 72 73 6f 72 2e 67 65 74 53  LA", cursor.getS
4150: 74 72 69 6e 67 28 43 4f 4c 55 4d 4e 5f 41 44 44  tring(COLUMN_ADD
4160: 52 5f 49 4e 44 45 58 29 29 3b 0a 20 20 20 20 20  R_INDEX));.     
4170: 20 20 20 63 75 72 73 6f 72 2e 63 6c 6f 73 65 28     cursor.close(
4180: 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 61  );..        // a
4190: 64 64 20 6f 74 68 65 72 20 6e 65 77 20 72 65 63  dd other new rec
41a0: 6f 72 64 2e 0a 20 20 20 20 20 20 20 20 6d 44 61  ord..        mDa
41b0: 74 61 62 61 73 65 2e 65 78 65 63 53 51 4c 28 22  tabase.execSQL("
41c0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 65 73 74  INSERT INTO test
41d0: 20 28 6e 61 6d 65 2c 20 61 67 65 2c 20 61 64 64   (name, age, add
41e0: 72 65 73 73 29 20 56 41 4c 55 45 53 20 28 27 4a  ress) VALUES ('J
41f0: 61 63 6b 27 2c 20 33 30 2c 20 27 4c 6f 6e 64 6f  ack', 30, 'Londo
4200: 6e 27 29 3b 22 29 3b 0a 0a 20 20 20 20 20 20 20  n');");..       
4210: 20 63 75 72 73 6f 72 20 3d 20 6d 44 61 74 61 62   cursor = mDatab
4220: 61 73 65 2e 71 75 65 72 79 28 54 41 42 4c 45 5f  ase.query(TABLE_
4230: 4e 41 4d 45 2c 20 54 45 53 54 5f 50 52 4f 4a 45  NAME, TEST_PROJE
4240: 43 54 49 4f 4e 2c 20 6e 75 6c 6c 2c 20 6e 75 6c  CTION, null, nul
4250: 6c 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e  l, null, null, n
4260: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ull);.        as
4270: 73 65 72 74 4e 6f 74 4e 75 6c 6c 28 63 75 72 73  sertNotNull(curs
4280: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  or);.        ass
4290: 65 72 74 45 71 75 61 6c 73 28 32 2c 20 63 75 72  ertEquals(2, cur
42a0: 73 6f 72 2e 67 65 74 43 6f 75 6e 74 28 29 29 3b  sor.getCount());
42b0: 0a 20 20 20 20 20 20 20 20 63 75 72 73 6f 72 2e  .        cursor.
42c0: 6d 6f 76 65 54 6f 46 69 72 73 74 28 29 3b 0a 20  moveToFirst();. 
42d0: 20 20 20 20 20 20 20 61 73 73 65 72 74 45 71 75         assertEqu
42e0: 61 6c 73 28 22 4d 69 6b 65 22 2c 20 63 75 72 73  als("Mike", curs
42f0: 6f 72 2e 67 65 74 53 74 72 69 6e 67 28 43 4f 4c  or.getString(COL
4300: 55 4d 4e 5f 4e 41 4d 45 5f 49 4e 44 45 58 29 29  UMN_NAME_INDEX))
4310: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
4320: 45 71 75 61 6c 73 28 32 30 2c 20 63 75 72 73 6f  Equals(20, curso
4330: 72 2e 67 65 74 49 6e 74 28 43 4f 4c 55 4d 4e 5f  r.getInt(COLUMN_
4340: 41 47 45 5f 49 4e 44 45 58 29 29 3b 0a 20 20 20  AGE_INDEX));.   
4350: 20 20 20 20 20 61 73 73 65 72 74 45 71 75 61 6c       assertEqual
4360: 73 28 22 4c 41 22 2c 20 63 75 72 73 6f 72 2e 67  s("LA", cursor.g
4370: 65 74 53 74 72 69 6e 67 28 43 4f 4c 55 4d 4e 5f  etString(COLUMN_
4380: 41 44 44 52 5f 49 4e 44 45 58 29 29 3b 0a 20 20  ADDR_INDEX));.  
4390: 20 20 20 20 20 20 63 75 72 73 6f 72 2e 6d 6f 76        cursor.mov
43a0: 65 54 6f 4e 65 78 74 28 29 3b 0a 20 20 20 20 20  eToNext();.     
43b0: 20 20 20 61 73 73 65 72 74 45 71 75 61 6c 73 28     assertEquals(
43c0: 22 4a 61 63 6b 22 2c 20 63 75 72 73 6f 72 2e 67  "Jack", cursor.g
43d0: 65 74 53 74 72 69 6e 67 28 43 4f 4c 55 4d 4e 5f  etString(COLUMN_
43e0: 4e 41 4d 45 5f 49 4e 44 45 58 29 29 3b 0a 20 20  NAME_INDEX));.  
43f0: 20 20 20 20 20 20 61 73 73 65 72 74 45 71 75 61        assertEqua
4400: 6c 73 28 33 30 2c 20 63 75 72 73 6f 72 2e 67 65  ls(30, cursor.ge
4410: 74 49 6e 74 28 43 4f 4c 55 4d 4e 5f 41 47 45 5f  tInt(COLUMN_AGE_
4420: 49 4e 44 45 58 29 29 3b 0a 20 20 20 20 20 20 20  INDEX));.       
4430: 20 61 73 73 65 72 74 45 71 75 61 6c 73 28 22 4c   assertEquals("L
4440: 6f 6e 64 6f 6e 22 2c 20 63 75 72 73 6f 72 2e 67  ondon", cursor.g
4450: 65 74 53 74 72 69 6e 67 28 43 4f 4c 55 4d 4e 5f  etString(COLUMN_
4460: 41 44 44 52 5f 49 4e 44 45 58 29 29 3b 0a 20 20  ADDR_INDEX));.  
4470: 20 20 20 20 20 20 63 75 72 73 6f 72 2e 63 6c 6f        cursor.clo
4480: 73 65 28 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  se();..        /
4490: 2f 20 64 65 6c 65 74 65 20 61 20 72 65 63 6f 72  / delete a recor
44a0: 64 2e 0a 20 20 20 20 20 20 20 20 6d 44 61 74 61  d..        mData
44b0: 62 61 73 65 2e 65 78 65 63 53 51 4c 28 22 44 45  base.execSQL("DE
44c0: 4c 45 54 45 20 46 52 4f 4d 20 74 65 73 74 20 57  LETE FROM test W
44d0: 48 45 52 45 20 6e 61 6d 65 20 3d 20 3f 3b 22 2c  HERE name = ?;",
44e0: 20 6e 65 77 20 53 74 72 69 6e 67 5b 5d 20 7b 20   new String[] { 
44f0: 22 4a 61 63 6b 22 20 7d 29 3b 0a 0a 20 20 20 20  "Jack" });..    
4500: 20 20 20 20 63 75 72 73 6f 72 20 3d 20 6d 44 61      cursor = mDa
4510: 74 61 62 61 73 65 2e 71 75 65 72 79 28 54 41 42  tabase.query(TAB
4520: 4c 45 5f 4e 41 4d 45 2c 20 54 45 53 54 5f 50 52  LE_NAME, TEST_PR
4530: 4f 4a 45 43 54 49 4f 4e 2c 20 6e 75 6c 6c 2c 20  OJECTION, null, 
4540: 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c  null, null, null
4550: 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  , null);.       
4560: 20 61 73 73 65 72 74 4e 6f 74 4e 75 6c 6c 28 63   assertNotNull(c
4570: 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20  ursor);.        
4580: 61 73 73 65 72 74 45 71 75 61 6c 73 28 31 2c 20  assertEquals(1, 
4590: 63 75 72 73 6f 72 2e 67 65 74 43 6f 75 6e 74 28  cursor.getCount(
45a0: 29 29 3b 0a 20 20 20 20 20 20 20 20 63 75 72 73  ));.        curs
45b0: 6f 72 2e 6d 6f 76 65 54 6f 46 69 72 73 74 28 29  or.moveToFirst()
45c0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
45d0: 45 71 75 61 6c 73 28 22 4d 69 6b 65 22 2c 20 63  Equals("Mike", c
45e0: 75 72 73 6f 72 2e 67 65 74 53 74 72 69 6e 67 28  ursor.getString(
45f0: 43 4f 4c 55 4d 4e 5f 4e 41 4d 45 5f 49 4e 44 45  COLUMN_NAME_INDE
4600: 58 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  X));.        ass
4610: 65 72 74 45 71 75 61 6c 73 28 32 30 2c 20 63 75  ertEquals(20, cu
4620: 72 73 6f 72 2e 67 65 74 49 6e 74 28 43 4f 4c 55  rsor.getInt(COLU
4630: 4d 4e 5f 41 47 45 5f 49 4e 44 45 58 29 29 3b 0a  MN_AGE_INDEX));.
4640: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 45 71          assertEq
4650: 75 61 6c 73 28 22 4c 41 22 2c 20 63 75 72 73 6f  uals("LA", curso
4660: 72 2e 67 65 74 53 74 72 69 6e 67 28 43 4f 4c 55  r.getString(COLU
4670: 4d 4e 5f 41 44 44 52 5f 49 4e 44 45 58 29 29 3b  MN_ADDR_INDEX));
4680: 0a 20 20 20 20 20 20 20 20 63 75 72 73 6f 72 2e  .        cursor.
4690: 63 6c 6f 73 65 28 29 3b 0a 0a 20 20 20 20 20 20  close();..      
46a0: 20 20 2f 2f 20 64 65 6c 65 74 65 20 61 20 6e 6f    // delete a no
46b0: 6e 2d 65 78 69 73 74 20 72 65 63 6f 72 64 2e 0a  n-exist record..
46c0: 20 20 20 20 20 20 20 20 6d 44 61 74 61 62 61 73          mDatabas
46d0: 65 2e 65 78 65 63 53 51 4c 28 22 44 45 4c 45 54  e.execSQL("DELET
46e0: 45 20 46 52 4f 4d 20 74 65 73 74 20 57 48 45 52  E FROM test WHER
46f0: 45 20 6e 61 6d 65 20 3d 20 3f 3b 22 2c 20 6e 65  E name = ?;", ne
4700: 77 20 53 74 72 69 6e 67 5b 5d 20 7b 20 22 57 72  w String[] { "Wr
4710: 6f 6e 67 20 4e 61 6d 65 22 20 7d 29 3b 0a 0a 20  ong Name" });.. 
4720: 20 20 20 20 20 20 20 63 75 72 73 6f 72 20 3d 20         cursor = 
4730: 6d 44 61 74 61 62 61 73 65 2e 71 75 65 72 79 28  mDatabase.query(
4740: 54 41 42 4c 45 5f 4e 41 4d 45 2c 20 54 45 53 54  TABLE_NAME, TEST
4750: 5f 50 52 4f 4a 45 43 54 49 4f 4e 2c 20 6e 75 6c  _PROJECTION, nul
4760: 6c 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e  l, null, null, n
4770: 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20  ull, null);.    
4780: 20 20 20 20 61 73 73 65 72 74 4e 6f 74 4e 75 6c      assertNotNul
4790: 6c 28 63 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  l(cursor);.     
47a0: 20 20 20 61 73 73 65 72 74 45 71 75 61 6c 73 28     assertEquals(
47b0: 31 2c 20 63 75 72 73 6f 72 2e 67 65 74 43 6f 75  1, cursor.getCou
47c0: 6e 74 28 29 29 3b 0a 20 20 20 20 20 20 20 20 63  nt());.        c
47d0: 75 72 73 6f 72 2e 6d 6f 76 65 54 6f 46 69 72 73  ursor.moveToFirs
47e0: 74 28 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  t();.        ass
47f0: 65 72 74 45 71 75 61 6c 73 28 22 4d 69 6b 65 22  ertEquals("Mike"
4800: 2c 20 63 75 72 73 6f 72 2e 67 65 74 53 74 72 69  , cursor.getStri
4810: 6e 67 28 43 4f 4c 55 4d 4e 5f 4e 41 4d 45 5f 49  ng(COLUMN_NAME_I
4820: 4e 44 45 58 29 29 3b 0a 20 20 20 20 20 20 20 20  NDEX));.        
4830: 61 73 73 65 72 74 45 71 75 61 6c 73 28 32 30 2c  assertEquals(20,
4840: 20 63 75 72 73 6f 72 2e 67 65 74 49 6e 74 28 43   cursor.getInt(C
4850: 4f 4c 55 4d 4e 5f 41 47 45 5f 49 4e 44 45 58 29  OLUMN_AGE_INDEX)
4860: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
4870: 74 45 71 75 61 6c 73 28 22 4c 41 22 2c 20 63 75  tEquals("LA", cu
4880: 72 73 6f 72 2e 67 65 74 53 74 72 69 6e 67 28 43  rsor.getString(C
4890: 4f 4c 55 4d 4e 5f 41 44 44 52 5f 49 4e 44 45 58  OLUMN_ADDR_INDEX
48a0: 29 29 3b 0a 20 20 20 20 20 20 20 20 63 75 72 73  ));.        curs
48b0: 6f 72 2e 63 6c 6f 73 65 28 29 3b 0a 0a 20 20 20  or.close();..   
48c0: 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20       try {.     
48d0: 20 20 20 20 20 20 20 2f 2f 20 65 78 65 63 53 51         // execSQ
48e0: 4c 20 63 61 6e 20 6e 6f 74 20 75 73 65 20 66 6f  L can not use fo
48f0: 72 20 71 75 65 72 79 2e 0a 20 20 20 20 20 20 20  r query..       
4900: 20 20 20 20 20 6d 44 61 74 61 62 61 73 65 2e 65       mDatabase.e
4910: 78 65 63 53 51 4c 28 22 53 45 4c 45 43 54 20 2a  xecSQL("SELECT *
4920: 20 46 52 4f 4d 20 74 65 73 74 3b 22 29 3b 0a 20   FROM test;");. 
4930: 20 20 20 20 20 20 20 20 20 20 20 66 61 69 6c 28             fail(
4940: 22 73 68 6f 75 6c 64 20 74 68 72 6f 77 20 53 51  "should throw SQ
4950: 4c 45 78 63 65 70 74 69 6f 6e 2e 22 29 3b 0a 20  LException.");. 
4960: 20 20 20 20 20 20 20 7d 20 63 61 74 63 68 20 28         } catch (
4970: 53 51 4c 45 78 63 65 70 74 69 6f 6e 20 65 29 20  SQLException e) 
4980: 7b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  {.        }..   
4990: 20 20 20 20 20 2f 2f 20 6d 61 6b 65 20 73 75 72       // make sur
49a0: 65 20 65 78 65 63 53 51 4c 20 63 61 6e 27 74 20  e execSQL can't 
49b0: 62 65 20 75 73 65 64 20 74 6f 20 65 78 65 63 75  be used to execu
49c0: 74 65 20 6d 6f 72 65 20 74 68 61 6e 20 31 20 73  te more than 1 s
49d0: 71 6c 20 73 74 61 74 65 6d 65 6e 74 20 61 74 20  ql statement at 
49e0: 61 20 74 69 6d 65 0a 20 20 20 20 20 20 20 20 6d  a time.        m
49f0: 44 61 74 61 62 61 73 65 2e 65 78 65 63 53 51 4c  Database.execSQL
4a00: 28 22 55 50 44 41 54 45 20 74 65 73 74 20 53 45  ("UPDATE test SE
4a10: 54 20 61 67 65 20 3d 20 34 30 20 57 48 45 52 45  T age = 40 WHERE
4a20: 20 6e 61 6d 65 20 3d 20 27 4d 69 6b 65 27 3b 22   name = 'Mike';"
4a30: 20 2b 20 0a 20 20 20 20 20 20 20 20 20 20 20 20   + .            
4a40: 20 20 20 20 22 55 50 44 41 54 45 20 74 65 73 74      "UPDATE test
4a50: 20 53 45 54 20 61 67 65 20 3d 20 35 30 20 57 48   SET age = 50 WH
4a60: 45 52 45 20 6e 61 6d 65 20 3d 20 27 4d 69 6b 65  ERE name = 'Mike
4a70: 27 3b 22 29 3b 0a 20 20 20 20 20 20 20 20 2f 2f  ';");.        //
4a80: 20 61 67 65 20 73 68 6f 75 6c 64 20 62 65 20 75   age should be u
4a90: 70 64 61 74 65 64 20 74 6f 20 34 30 20 6e 6f 74  pdated to 40 not
4aa0: 20 74 6f 20 35 30 0a 20 20 20 20 20 20 20 20 63   to 50.        c
4ab0: 75 72 73 6f 72 20 3d 20 6d 44 61 74 61 62 61 73  ursor = mDatabas
4ac0: 65 2e 71 75 65 72 79 28 54 41 42 4c 45 5f 4e 41  e.query(TABLE_NA
4ad0: 4d 45 2c 20 54 45 53 54 5f 50 52 4f 4a 45 43 54  ME, TEST_PROJECT
4ae0: 49 4f 4e 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c  ION, null, null,
4af0: 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e 75 6c   null, null, nul
4b00: 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  l);.        asse
4b10: 72 74 4e 6f 74 4e 75 6c 6c 28 63 75 72 73 6f 72  rtNotNull(cursor
4b20: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
4b30: 74 45 71 75 61 6c 73 28 31 2c 20 63 75 72 73 6f  tEquals(1, curso
4b40: 72 2e 67 65 74 43 6f 75 6e 74 28 29 29 3b 0a 20  r.getCount());. 
4b50: 20 20 20 20 20 20 20 63 75 72 73 6f 72 2e 6d 6f         cursor.mo
4b60: 76 65 54 6f 46 69 72 73 74 28 29 3b 0a 20 20 20  veToFirst();.   
4b70: 20 20 20 20 20 61 73 73 65 72 74 45 71 75 61 6c       assertEqual
4b80: 73 28 22 4d 69 6b 65 22 2c 20 63 75 72 73 6f 72  s("Mike", cursor
4b90: 2e 67 65 74 53 74 72 69 6e 67 28 43 4f 4c 55 4d  .getString(COLUM
4ba0: 4e 5f 4e 41 4d 45 5f 49 4e 44 45 58 29 29 3b 0a  N_NAME_INDEX));.
4bb0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 45 71          assertEq
4bc0: 75 61 6c 73 28 34 30 2c 20 63 75 72 73 6f 72 2e  uals(40, cursor.
4bd0: 67 65 74 49 6e 74 28 43 4f 4c 55 4d 4e 5f 41 47  getInt(COLUMN_AG
4be0: 45 5f 49 4e 44 45 58 29 29 3b 0a 20 20 20 20 20  E_INDEX));.     
4bf0: 20 20 20 61 73 73 65 72 74 45 71 75 61 6c 73 28     assertEquals(
4c00: 22 4c 41 22 2c 20 63 75 72 73 6f 72 2e 67 65 74  "LA", cursor.get
4c10: 53 74 72 69 6e 67 28 43 4f 4c 55 4d 4e 5f 41 44  String(COLUMN_AD
4c20: 44 52 5f 49 4e 44 45 58 29 29 3b 0a 20 20 20 20  DR_INDEX));.    
4c30: 20 20 20 20 63 75 72 73 6f 72 2e 63 6c 6f 73 65      cursor.close
4c40: 28 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20  ();..        // 
4c50: 6d 61 6b 65 20 73 75 72 65 20 73 71 6c 20 69 6e  make sure sql in
4c60: 6a 65 63 74 69 6f 6e 20 69 73 20 4e 4f 54 20 61  jection is NOT a
4c70: 6c 6c 6f 77 65 64 20 6f 72 20 68 61 73 20 6e 6f  llowed or has no
4c80: 20 65 66 66 65 63 74 20 77 68 65 6e 20 75 73 69   effect when usi
4c90: 6e 67 20 71 75 65 72 79 28 29 0a 20 20 20 20 20  ng query().     
4ca0: 20 20 20 53 74 72 69 6e 67 20 68 61 72 6d 66 75     String harmfu
4cb0: 6c 51 75 65 72 79 20 3d 20 22 6e 61 6d 65 20 3d  lQuery = "name =
4cc0: 20 27 4d 69 6b 65 27 3b 55 50 44 41 54 45 20 74   'Mike';UPDATE t
4cd0: 65 73 74 20 53 45 54 20 61 67 65 20 3d 20 35 30  est SET age = 50
4ce0: 20 57 48 45 52 45 20 6e 61 6d 65 20 3d 20 27 4d   WHERE name = 'M
4cf0: 69 6b 65 27 22 3b 0a 20 20 20 20 20 20 20 20 63  ike'";.        c
4d00: 75 72 73 6f 72 20 3d 20 6d 44 61 74 61 62 61 73  ursor = mDatabas
4d10: 65 2e 71 75 65 72 79 28 54 41 42 4c 45 5f 4e 41  e.query(TABLE_NA
4d20: 4d 45 2c 20 54 45 53 54 5f 50 52 4f 4a 45 43 54  ME, TEST_PROJECT
4d30: 49 4f 4e 2c 20 68 61 72 6d 66 75 6c 51 75 65 72  ION, harmfulQuer
4d40: 79 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e  y, null, null, n
4d50: 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20  ull, null);.    
4d60: 20 20 20 20 61 73 73 65 72 74 4e 6f 74 4e 75 6c      assertNotNul
4d70: 6c 28 63 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  l(cursor);.     
4d80: 20 20 20 61 73 73 65 72 74 45 71 75 61 6c 73 28     assertEquals(
4d90: 31 2c 20 63 75 72 73 6f 72 2e 67 65 74 43 6f 75  1, cursor.getCou
4da0: 6e 74 28 29 29 3b 0a 20 20 20 20 20 20 20 20 63  nt());.        c
4db0: 75 72 73 6f 72 2e 6d 6f 76 65 54 6f 46 69 72 73  ursor.moveToFirs
4dc0: 74 28 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  t();.        ass
4dd0: 65 72 74 45 71 75 61 6c 73 28 22 4d 69 6b 65 22  ertEquals("Mike"
4de0: 2c 20 63 75 72 73 6f 72 2e 67 65 74 53 74 72 69  , cursor.getStri
4df0: 6e 67 28 43 4f 4c 55 4d 4e 5f 4e 41 4d 45 5f 49  ng(COLUMN_NAME_I
4e00: 4e 44 45 58 29 29 3b 0a 20 20 20 20 20 20 20 20  NDEX));.        
4e10: 2f 2f 20 72 6f 77 27 73 20 61 67 65 20 63 6f 6c  // row's age col
4e20: 75 6d 6e 20 53 48 4f 55 4c 44 20 4e 4f 54 20 62  umn SHOULD NOT b
4e30: 65 20 35 30 0a 20 20 20 20 20 20 20 20 61 73 73  e 50.        ass
4e40: 65 72 74 45 71 75 61 6c 73 28 34 30 2c 20 63 75  ertEquals(40, cu
4e50: 72 73 6f 72 2e 67 65 74 49 6e 74 28 43 4f 4c 55  rsor.getInt(COLU
4e60: 4d 4e 5f 41 47 45 5f 49 4e 44 45 58 29 29 3b 0a  MN_AGE_INDEX));.
4e70: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 45 71          assertEq
4e80: 75 61 6c 73 28 22 4c 41 22 2c 20 63 75 72 73 6f  uals("LA", curso
4e90: 72 2e 67 65 74 53 74 72 69 6e 67 28 43 4f 4c 55  r.getString(COLU
4ea0: 4d 4e 5f 41 44 44 52 5f 49 4e 44 45 58 29 29 3b  MN_ADDR_INDEX));
4eb0: 0a 20 20 20 20 20 20 20 20 63 75 72 73 6f 72 2e  .        cursor.
4ec0: 63 6c 6f 73 65 28 29 3b 3b 0a 20 20 20 20 7d 0a  close();;.    }.
4ed0: 0a 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64  .    public void
4ee0: 20 74 65 73 74 46 69 6e 64 45 64 69 74 54 61 62   testFindEditTab
4ef0: 6c 65 28 29 20 7b 0a 20 20 20 20 20 20 20 20 53  le() {.        S
4f00: 74 72 69 6e 67 20 74 61 62 6c 65 73 20 3d 20 22  tring tables = "
4f10: 74 61 62 6c 65 31 20 74 61 62 6c 65 32 20 74 61  table1 table2 ta
4f20: 62 6c 65 33 22 3b 0a 20 20 20 20 20 20 20 20 61  ble3";.        a
4f30: 73 73 65 72 74 45 71 75 61 6c 73 28 22 74 61 62  ssertEquals("tab
4f40: 6c 65 31 22 2c 20 53 51 4c 69 74 65 44 61 74 61  le1", SQLiteData
4f50: 62 61 73 65 2e 66 69 6e 64 45 64 69 74 54 61 62  base.findEditTab
4f60: 6c 65 28 74 61 62 6c 65 73 29 29 3b 0a 0a 20 20  le(tables));..  
4f70: 20 20 20 20 20 20 74 61 62 6c 65 73 20 3d 20 22        tables = "
4f80: 74 61 62 6c 65 31 2c 74 61 62 6c 65 32 2c 74 61  table1,table2,ta
4f90: 62 6c 65 33 22 3b 0a 20 20 20 20 20 20 20 20 61  ble3";.        a
4fa0: 73 73 65 72 74 45 71 75 61 6c 73 28 22 74 61 62  ssertEquals("tab
4fb0: 6c 65 31 22 2c 20 53 51 4c 69 74 65 44 61 74 61  le1", SQLiteData
4fc0: 62 61 73 65 2e 66 69 6e 64 45 64 69 74 54 61 62  base.findEditTab
4fd0: 6c 65 28 74 61 62 6c 65 73 29 29 3b 0a 0a 20 20  le(tables));..  
4fe0: 20 20 20 20 20 20 74 61 62 6c 65 73 20 3d 20 22        tables = "
4ff0: 74 61 62 6c 65 31 22 3b 0a 20 20 20 20 20 20 20  table1";.       
5000: 20 61 73 73 65 72 74 45 71 75 61 6c 73 28 22 74   assertEquals("t
5010: 61 62 6c 65 31 22 2c 20 53 51 4c 69 74 65 44 61  able1", SQLiteDa
5020: 74 61 62 61 73 65 2e 66 69 6e 64 45 64 69 74 54  tabase.findEditT
5030: 61 62 6c 65 28 74 61 62 6c 65 73 29 29 3b 0a 0a  able(tables));..
5040: 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20          try {.  
5050: 20 20 20 20 20 20 20 20 20 20 53 51 4c 69 74 65            SQLite
5060: 44 61 74 61 62 61 73 65 2e 66 69 6e 64 45 64 69  Database.findEdi
5070: 74 54 61 62 6c 65 28 22 22 29 3b 0a 20 20 20 20  tTable("");.    
5080: 20 20 20 20 20 20 20 20 66 61 69 6c 28 22 73 68          fail("sh
5090: 6f 75 6c 64 20 74 68 72 6f 77 20 49 6c 6c 65 67  ould throw Illeg
50a0: 61 6c 53 74 61 74 65 45 78 63 65 70 74 69 6f 6e  alStateException
50b0: 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 63  .");.        } c
50c0: 61 74 63 68 20 28 49 6c 6c 65 67 61 6c 53 74 61  atch (IllegalSta
50d0: 74 65 45 78 63 65 70 74 69 6f 6e 20 65 29 20 7b  teException e) {
50e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
50f0: 0a 0a 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69  ..    public voi
5100: 64 20 74 65 73 74 47 65 74 50 61 74 68 28 29 20  d testGetPath() 
5110: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
5120: 45 71 75 61 6c 73 28 6d 44 61 74 61 62 61 73 65  Equals(mDatabase
5130: 46 69 6c 65 50 61 74 68 2c 20 6d 44 61 74 61 62  FilePath, mDatab
5140: 61 73 65 2e 67 65 74 50 61 74 68 28 29 29 3b 0a  ase.getPath());.
5150: 20 20 20 20 7d 0a 0a 20 20 20 20 70 75 62 6c 69      }..    publi
5160: 63 20 76 6f 69 64 20 74 65 73 74 41 63 63 65 73  c void testAcces
5170: 73 56 65 72 73 69 6f 6e 28 29 20 7b 0a 20 20 20  sVersion() {.   
5180: 20 20 20 20 20 6d 44 61 74 61 62 61 73 65 2e 73       mDatabase.s
5190: 65 74 56 65 72 73 69 6f 6e 28 31 29 3b 0a 20 20  etVersion(1);.  
51a0: 20 20 20 20 20 20 61 73 73 65 72 74 45 71 75 61        assertEqua
51b0: 6c 73 28 31 2c 20 6d 44 61 74 61 62 61 73 65 2e  ls(1, mDatabase.
51c0: 67 65 74 56 65 72 73 69 6f 6e 28 29 29 3b 0a 0a  getVersion());..
51d0: 20 20 20 20 20 20 20 20 6d 44 61 74 61 62 61 73          mDatabas
51e0: 65 2e 73 65 74 56 65 72 73 69 6f 6e 28 33 29 3b  e.setVersion(3);
51f0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 45  .        assertE
5200: 71 75 61 6c 73 28 33 2c 20 6d 44 61 74 61 62 61  quals(3, mDataba
5210: 73 65 2e 67 65 74 56 65 72 73 69 6f 6e 28 29 29  se.getVersion())
5220: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 75 62  ;.    }..    pub
5230: 6c 69 63 20 76 6f 69 64 20 74 65 73 74 49 6e 73  lic void testIns
5240: 65 72 74 28 29 20 7b 0a 20 20 20 20 20 20 20 20  ert() {.        
5250: 6d 44 61 74 61 62 61 73 65 2e 65 78 65 63 53 51  mDatabase.execSQ
5260: 4c 28 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  L("CREATE TABLE 
5270: 74 65 73 74 20 28 5f 69 64 20 49 4e 54 45 47 45  test (_id INTEGE
5280: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 22  R PRIMARY KEY, "
5290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
52a0: 20 2b 20 22 6e 61 6d 65 20 54 45 58 54 2c 20 61   + "name TEXT, a
52b0: 67 65 20 49 4e 54 45 47 45 52 2c 20 61 64 64 72  ge INTEGER, addr
52c0: 65 73 73 20 54 45 58 54 29 3b 22 29 3b 0a 0a 20  ess TEXT);");.. 
52d0: 20 20 20 20 20 20 20 43 6f 6e 74 65 6e 74 56 61         ContentVa
52e0: 6c 75 65 73 20 76 61 6c 75 65 73 20 3d 20 6e 65  lues values = ne
52f0: 77 20 43 6f 6e 74 65 6e 74 56 61 6c 75 65 73 28  w ContentValues(
5300: 29 3b 0a 20 20 20 20 20 20 20 20 76 61 6c 75 65  );.        value
5310: 73 2e 70 75 74 28 22 6e 61 6d 65 22 2c 20 22 4a  s.put("name", "J
5320: 61 63 6b 22 29 3b 0a 20 20 20 20 20 20 20 20 76  ack");.        v
5330: 61 6c 75 65 73 2e 70 75 74 28 22 61 67 65 22 2c  alues.put("age",
5340: 20 32 30 29 3b 0a 20 20 20 20 20 20 20 20 76 61   20);.        va
5350: 6c 75 65 73 2e 70 75 74 28 22 61 64 64 72 65 73  lues.put("addres
5360: 73 22 2c 20 22 4c 41 22 29 3b 0a 20 20 20 20 20  s", "LA");.     
5370: 20 20 20 6d 44 61 74 61 62 61 73 65 2e 69 6e 73     mDatabase.ins
5380: 65 72 74 28 54 41 42 4c 45 5f 4e 41 4d 45 2c 20  ert(TABLE_NAME, 
5390: 22 6e 61 6d 65 22 2c 20 76 61 6c 75 65 73 29 3b  "name", values);
53a0: 0a 0a 20 20 20 20 20 20 20 20 43 75 72 73 6f 72  ..        Cursor
53b0: 20 63 75 72 73 6f 72 20 3d 20 6d 44 61 74 61 62   cursor = mDatab
53c0: 61 73 65 2e 71 75 65 72 79 28 54 41 42 4c 45 5f  ase.query(TABLE_
53d0: 4e 41 4d 45 2c 20 54 45 53 54 5f 50 52 4f 4a 45  NAME, TEST_PROJE
53e0: 43 54 49 4f 4e 2c 20 6e 75 6c 6c 2c 0a 20 20 20  CTION, null,.   
53f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6c               nul
5400: 6c 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e  l, null, null, n
5410: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ull);.        as
5420: 73 65 72 74 4e 6f 74 4e 75 6c 6c 28 63 75 72 73  sertNotNull(curs
5430: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  or);.        ass
5440: 65 72 74 45 71 75 61 6c 73 28 31 2c 20 63 75 72  ertEquals(1, cur
5450: 73 6f 72 2e 67 65 74 43 6f 75 6e 74 28 29 29 3b  sor.getCount());
5460: 0a 20 20 20 20 20 20 20 20 63 75 72 73 6f 72 2e  .        cursor.
5470: 6d 6f 76 65 54 6f 46 69 72 73 74 28 29 3b 0a 20  moveToFirst();. 
5480: 20 20 20 20 20 20 20 61 73 73 65 72 74 45 71 75         assertEqu
5490: 61 6c 73 28 22 4a 61 63 6b 22 2c 20 63 75 72 73  als("Jack", curs
54a0: 6f 72 2e 67 65 74 53 74 72 69 6e 67 28 43 4f 4c  or.getString(COL
54b0: 55 4d 4e 5f 4e 41 4d 45 5f 49 4e 44 45 58 29 29  UMN_NAME_INDEX))
54c0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
54d0: 45 71 75 61 6c 73 28 32 30 2c 20 63 75 72 73 6f  Equals(20, curso
54e0: 72 2e 67 65 74 49 6e 74 28 43 4f 4c 55 4d 4e 5f  r.getInt(COLUMN_
54f0: 41 47 45 5f 49 4e 44 45 58 29 29 3b 0a 20 20 20  AGE_INDEX));.   
5500: 20 20 20 20 20 61 73 73 65 72 74 45 71 75 61 6c       assertEqual
5510: 73 28 22 4c 41 22 2c 20 63 75 72 73 6f 72 2e 67  s("LA", cursor.g
5520: 65 74 53 74 72 69 6e 67 28 43 4f 4c 55 4d 4e 5f  etString(COLUMN_
5530: 41 44 44 52 5f 49 4e 44 45 58 29 29 3b 0a 20 20  ADDR_INDEX));.  
5540: 20 20 20 20 20 20 63 75 72 73 6f 72 2e 63 6c 6f        cursor.clo
5550: 73 65 28 29 3b 0a 0a 20 20 20 20 20 20 20 20 6d  se();..        m
5560: 44 61 74 61 62 61 73 65 2e 69 6e 73 65 72 74 28  Database.insert(
5570: 54 41 42 4c 45 5f 4e 41 4d 45 2c 20 22 6e 61 6d  TABLE_NAME, "nam
5580: 65 22 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20  e", null);.     
5590: 20 20 20 63 75 72 73 6f 72 20 3d 20 6d 44 61 74     cursor = mDat
55a0: 61 62 61 73 65 2e 71 75 65 72 79 28 54 41 42 4c  abase.query(TABL
55b0: 45 5f 4e 41 4d 45 2c 20 54 45 53 54 5f 50 52 4f  E_NAME, TEST_PRO
55c0: 4a 45 43 54 49 4f 4e 2c 20 6e 75 6c 6c 2c 20 6e  JECTION, null, n
55d0: 75 6c 6c 2c 20 6e 75 6c 6c 2c 0a 20 20 20 20 20  ull, null,.     
55e0: 20 20 20 20 20 20 20 20 20 20 20 6e 75 6c 6c 2c             null,
55f0: 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20   null);.        
5600: 61 73 73 65 72 74 4e 6f 74 4e 75 6c 6c 28 63 75  assertNotNull(cu
5610: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 61  rsor);.        a
5620: 73 73 65 72 74 45 71 75 61 6c 73 28 32 2c 20 63  ssertEquals(2, c
5630: 75 72 73 6f 72 2e 67 65 74 43 6f 75 6e 74 28 29  ursor.getCount()
5640: 29 3b 0a 20 20 20 20 20 20 20 20 63 75 72 73 6f  );.        curso
5650: 72 2e 6d 6f 76 65 54 6f 46 69 72 73 74 28 29 3b  r.moveToFirst();
5660: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 45  .        assertE
5670: 71 75 61 6c 73 28 22 4a 61 63 6b 22 2c 20 63 75  quals("Jack", cu
5680: 72 73 6f 72 2e 67 65 74 53 74 72 69 6e 67 28 43  rsor.getString(C
5690: 4f 4c 55 4d 4e 5f 4e 41 4d 45 5f 49 4e 44 45 58  OLUMN_NAME_INDEX
56a0: 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ));.        asse
56b0: 72 74 45 71 75 61 6c 73 28 32 30 2c 20 63 75 72  rtEquals(20, cur
56c0: 73 6f 72 2e 67 65 74 49 6e 74 28 43 4f 4c 55 4d  sor.getInt(COLUM
56d0: 4e 5f 41 47 45 5f 49 4e 44 45 58 29 29 3b 0a 20  N_AGE_INDEX));. 
56e0: 20 20 20 20 20 20 20 61 73 73 65 72 74 45 71 75         assertEqu
56f0: 61 6c 73 28 22 4c 41 22 2c 20 63 75 72 73 6f 72  als("LA", cursor
5700: 2e 67 65 74 53 74 72 69 6e 67 28 43 4f 4c 55 4d  .getString(COLUM
5710: 4e 5f 41 44 44 52 5f 49 4e 44 45 58 29 29 3b 0a  N_ADDR_INDEX));.
5720: 20 20 20 20 20 20 20 20 63 75 72 73 6f 72 2e 6d          cursor.m
5730: 6f 76 65 54 6f 4e 65 78 74 28 29 3b 0a 20 20 20  oveToNext();.   
5740: 20 20 20 20 20 61 73 73 65 72 74 4e 75 6c 6c 28       assertNull(
5750: 63 75 72 73 6f 72 2e 67 65 74 53 74 72 69 6e 67  cursor.getString
5760: 28 43 4f 4c 55 4d 4e 5f 4e 41 4d 45 5f 49 4e 44  (COLUMN_NAME_IND
5770: 45 58 29 29 3b 0a 20 20 20 20 20 20 20 20 63 75  EX));.        cu
5780: 72 73 6f 72 2e 63 6c 6f 73 65 28 29 3b 0a 0a 20  rsor.close();.. 
5790: 20 20 20 20 20 20 20 76 61 6c 75 65 73 20 3d 20         values = 
57a0: 6e 65 77 20 43 6f 6e 74 65 6e 74 56 61 6c 75 65  new ContentValue
57b0: 73 28 29 3b 0a 20 20 20 20 20 20 20 20 76 61 6c  s();.        val
57c0: 75 65 73 2e 70 75 74 28 22 57 72 6f 6e 67 20 4b  ues.put("Wrong K
57d0: 65 79 22 2c 20 22 57 72 6f 6e 67 20 76 61 6c 75  ey", "Wrong valu
57e0: 65 22 29 3b 0a 20 20 20 20 20 20 20 20 6d 44 61  e");.        mDa
57f0: 74 61 62 61 73 65 2e 69 6e 73 65 72 74 28 54 41  tabase.insert(TA
5800: 42 4c 45 5f 4e 41 4d 45 2c 20 22 6e 61 6d 65 22  BLE_NAME, "name"
5810: 2c 20 76 61 6c 75 65 73 29 3b 0a 20 20 20 20 20  , values);.     
5820: 20 20 20 2f 2f 20 74 68 65 72 65 20 61 72 65 20     // there are 
5830: 73 74 69 6c 6c 20 32 20 72 65 63 6f 72 64 73 2e  still 2 records.
5840: 0a 20 20 20 20 20 20 20 20 63 75 72 73 6f 72 20  .        cursor 
5850: 3d 20 6d 44 61 74 61 62 61 73 65 2e 71 75 65 72  = mDatabase.quer
5860: 79 28 54 41 42 4c 45 5f 4e 41 4d 45 2c 20 54 45  y(TABLE_NAME, TE
5870: 53 54 5f 50 52 4f 4a 45 43 54 49 4f 4e 2c 20 6e  ST_PROJECTION, n
5880: 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c  ull, null, null,
5890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
58a0: 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20 20   null, null);.  
58b0: 20 20 20 20 20 20 61 73 73 65 72 74 4e 6f 74 4e        assertNotN
58c0: 75 6c 6c 28 63 75 72 73 6f 72 29 3b 0a 20 20 20  ull(cursor);.   
58d0: 20 20 20 20 20 61 73 73 65 72 74 45 71 75 61 6c       assertEqual
58e0: 73 28 32 2c 20 63 75 72 73 6f 72 2e 67 65 74 43  s(2, cursor.getC
58f0: 6f 75 6e 74 28 29 29 3b 0a 20 20 20 20 20 20 20  ount());.       
5900: 20 63 75 72 73 6f 72 2e 63 6c 6f 73 65 28 29 3b   cursor.close();
5910: 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 64 65 6c  ..        // del
5920: 65 74 65 20 61 6c 6c 20 72 65 63 6f 72 64 2e 0a  ete all record..
5930: 20 20 20 20 20 20 20 20 6d 44 61 74 61 62 61 73          mDatabas
5940: 65 2e 65 78 65 63 53 51 4c 28 22 44 45 4c 45 54  e.execSQL("DELET
5950: 45 20 46 52 4f 4d 20 74 65 73 74 3b 22 29 3b 0a  E FROM test;");.
5960: 0a 20 20 20 20 20 20 20 20 76 61 6c 75 65 73 20  .        values 
5970: 3d 20 6e 65 77 20 43 6f 6e 74 65 6e 74 56 61 6c  = new ContentVal
5980: 75 65 73 28 29 3b 0a 20 20 20 20 20 20 20 20 76  ues();.        v
5990: 61 6c 75 65 73 2e 70 75 74 28 22 6e 61 6d 65 22  alues.put("name"
59a0: 2c 20 22 4d 69 6b 65 22 29 3b 0a 20 20 20 20 20  , "Mike");.     
59b0: 20 20 20 76 61 6c 75 65 73 2e 70 75 74 28 22 61     values.put("a
59c0: 67 65 22 2c 20 33 30 29 3b 0a 20 20 20 20 20 20  ge", 30);.      
59d0: 20 20 76 61 6c 75 65 73 2e 70 75 74 28 22 61 64    values.put("ad
59e0: 64 72 65 73 73 22 2c 20 22 4c 6f 6e 64 6f 6e 22  dress", "London"
59f0: 29 3b 0a 20 20 20 20 20 20 20 20 6d 44 61 74 61  );.        mData
5a00: 62 61 73 65 2e 69 6e 73 65 72 74 4f 72 54 68 72  base.insertOrThr
5a10: 6f 77 28 54 41 42 4c 45 5f 4e 41 4d 45 2c 20 22  ow(TABLE_NAME, "
5a20: 6e 61 6d 65 22 2c 20 76 61 6c 75 65 73 29 3b 0a  name", values);.
5a30: 0a 20 20 20 20 20 20 20 20 63 75 72 73 6f 72 20  .        cursor 
5a40: 3d 20 6d 44 61 74 61 62 61 73 65 2e 71 75 65 72  = mDatabase.quer
5a50: 79 28 54 41 42 4c 45 5f 4e 41 4d 45 2c 20 54 45  y(TABLE_NAME, TE
5a60: 53 54 5f 50 52 4f 4a 45 43 54 49 4f 4e 2c 20 6e  ST_PROJECTION, n
5a70: 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c  ull, null, null,
5a80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5a90: 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20 20   null, null);.  
5aa0: 20 20 20 20 20 20 61 73 73 65 72 74 4e 6f 74 4e        assertNotN
5ab0: 75 6c 6c 28 63 75 72 73 6f 72 29 3b 0a 20 20 20  ull(cursor);.   
5ac0: 20 20 20 20 20 61 73 73 65 72 74 45 71 75 61 6c       assertEqual
5ad0: 73 28 31 2c 20 63 75 72 73 6f 72 2e 67 65 74 43  s(1, cursor.getC
5ae0: 6f 75 6e 74 28 29 29 3b 0a 20 20 20 20 20 20 20  ount());.       
5af0: 20 63 75 72 73 6f 72 2e 6d 6f 76 65 54 6f 46 69   cursor.moveToFi
5b00: 72 73 74 28 29 3b 0a 20 20 20 20 20 20 20 20 61  rst();.        a
5b10: 73 73 65 72 74 45 71 75 61 6c 73 28 22 4d 69 6b  ssertEquals("Mik
5b20: 65 22 2c 20 63 75 72 73 6f 72 2e 67 65 74 53 74  e", cursor.getSt
5b30: 72 69 6e 67 28 43 4f 4c 55 4d 4e 5f 4e 41 4d 45  ring(COLUMN_NAME
5b40: 5f 49 4e 44 45 58 29 29 3b 0a 20 20 20 20 20 20  _INDEX));.      
5b50: 20 20 61 73 73 65 72 74 45 71 75 61 6c 73 28 33    assertEquals(3
5b60: 30 2c 20 63 75 72 73 6f 72 2e 67 65 74 49 6e 74  0, cursor.getInt
5b70: 28 43 4f 4c 55 4d 4e 5f 41 47 45 5f 49 4e 44 45  (COLUMN_AGE_INDE
5b80: 58 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  X));.        ass
5b90: 65 72 74 45 71 75 61 6c 73 28 22 4c 6f 6e 64 6f  ertEquals("Londo
5ba0: 6e 22 2c 20 63 75 72 73 6f 72 2e 67 65 74 53 74  n", cursor.getSt
5bb0: 72 69 6e 67 28 43 4f 4c 55 4d 4e 5f 41 44 44 52  ring(COLUMN_ADDR
5bc0: 5f 49 4e 44 45 58 29 29 3b 0a 20 20 20 20 20 20  _INDEX));.      
5bd0: 20 20 63 75 72 73 6f 72 2e 63 6c 6f 73 65 28 29    cursor.close()
5be0: 3b 0a 0a 20 20 20 20 20 20 20 20 6d 44 61 74 61  ;..        mData
5bf0: 62 61 73 65 2e 69 6e 73 65 72 74 4f 72 54 68 72  base.insertOrThr
5c00: 6f 77 28 54 41 42 4c 45 5f 4e 41 4d 45 2c 20 22  ow(TABLE_NAME, "
5c10: 6e 61 6d 65 22 2c 20 6e 75 6c 6c 29 3b 0a 20 20  name", null);.  
5c20: 20 20 20 20 20 20 63 75 72 73 6f 72 20 3d 20 6d        cursor = m
5c30: 44 61 74 61 62 61 73 65 2e 71 75 65 72 79 28 54  Database.query(T
5c40: 41 42 4c 45 5f 4e 41 4d 45 2c 20 54 45 53 54 5f  ABLE_NAME, TEST_
5c50: 50 52 4f 4a 45 43 54 49 4f 4e 2c 20 6e 75 6c 6c  PROJECTION, null
5c60: 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c 0a 20 20  , null, null,.  
5c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75                nu
5c80: 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20  ll, null);.     
5c90: 20 20 20 61 73 73 65 72 74 4e 6f 74 4e 75 6c 6c     assertNotNull
5ca0: 28 63 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  (cursor);.      
5cb0: 20 20 61 73 73 65 72 74 45 71 75 61 6c 73 28 32    assertEquals(2
5cc0: 2c 20 63 75 72 73 6f 72 2e 67 65 74 43 6f 75 6e  , cursor.getCoun
5cd0: 74 28 29 29 3b 0a 20 20 20 20 20 20 20 20 63 75  t());.        cu
5ce0: 72 73 6f 72 2e 6d 6f 76 65 54 6f 46 69 72 73 74  rsor.moveToFirst
5cf0: 28 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ();.        asse
5d00: 72 74 45 71 75 61 6c 73 28 22 4d 69 6b 65 22 2c  rtEquals("Mike",
5d10: 20 63 75 72 73 6f 72 2e 67 65 74 53 74 72 69 6e   cursor.getStrin
5d20: 67 28 43 4f 4c 55 4d 4e 5f 4e 41 4d 45 5f 49 4e  g(COLUMN_NAME_IN
5d30: 44 45 58 29 29 3b 0a 20 20 20 20 20 20 20 20 61  DEX));.        a
5d40: 73 73 65 72 74 45 71 75 61 6c 73 28 33 30 2c 20  ssertEquals(30, 
5d50: 63 75 72 73 6f 72 2e 67 65 74 49 6e 74 28 43 4f  cursor.getInt(CO
5d60: 4c 55 4d 4e 5f 41 47 45 5f 49 4e 44 45 58 29 29  LUMN_AGE_INDEX))
5d70: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
5d80: 45 71 75 61 6c 73 28 22 4c 6f 6e 64 6f 6e 22 2c  Equals("London",
5d90: 20 63 75 72 73 6f 72 2e 67 65 74 53 74 72 69 6e   cursor.getStrin
5da0: 67 28 43 4f 4c 55 4d 4e 5f 41 44 44 52 5f 49 4e  g(COLUMN_ADDR_IN
5db0: 44 45 58 29 29 3b 0a 20 20 20 20 20 20 20 20 63  DEX));.        c
5dc0: 75 72 73 6f 72 2e 6d 6f 76 65 54 6f 4e 65 78 74  ursor.moveToNext
5dd0: 28 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ();.        asse
5de0: 72 74 4e 75 6c 6c 28 63 75 72 73 6f 72 2e 67 65  rtNull(cursor.ge
5df0: 74 53 74 72 69 6e 67 28 43 4f 4c 55 4d 4e 5f 4e  tString(COLUMN_N
5e00: 41 4d 45 5f 49 4e 44 45 58 29 29 3b 0a 20 20 20  AME_INDEX));.   
5e10: 20 20 20 20 20 63 75 72 73 6f 72 2e 63 6c 6f 73       cursor.clos
5e20: 65 28 29 3b 0a 0a 20 20 20 20 20 20 20 20 76 61  e();..        va
5e30: 6c 75 65 73 20 3d 20 6e 65 77 20 43 6f 6e 74 65  lues = new Conte
5e40: 6e 74 56 61 6c 75 65 73 28 29 3b 0a 20 20 20 20  ntValues();.    
5e50: 20 20 20 20 76 61 6c 75 65 73 2e 70 75 74 28 22      values.put("
5e60: 57 72 6f 6e 67 20 4b 65 79 22 2c 20 22 57 72 6f  Wrong Key", "Wro
5e70: 6e 67 20 76 61 6c 75 65 22 29 3b 0a 20 20 20 20  ng value");.    
5e80: 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20      try {.      
5e90: 20 20 20 20 20 20 6d 44 61 74 61 62 61 73 65 2e        mDatabase.
5ea0: 69 6e 73 65 72 74 4f 72 54 68 72 6f 77 28 54 41  insertOrThrow(TA
5eb0: 42 4c 45 5f 4e 41 4d 45 2c 20 22 6e 61 6d 65 22  BLE_NAME, "name"
5ec0: 2c 20 76 61 6c 75 65 73 29 3b 0a 20 20 20 20 20  , values);.     
5ed0: 20 20 20 20 20 20 20 66 61 69 6c 28 22 73 68 6f         fail("sho
5ee0: 75 6c 64 20 74 68 72 6f 77 20 53 51 4c 45 78 63  uld throw SQLExc
5ef0: 65 70 74 69 6f 6e 2e 22 29 3b 0a 20 20 20 20 20  eption.");.     
5f00: 20 20 20 7d 20 63 61 74 63 68 20 28 53 51 4c 45     } catch (SQLE
5f10: 78 63 65 70 74 69 6f 6e 20 65 29 20 7b 0a 20 20  xception e) {.  
5f20: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
5f30: 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20 74     public void t
5f40: 65 73 74 49 73 4f 70 65 6e 28 29 20 7b 0a 20 20  estIsOpen() {.  
5f50: 20 20 20 20 20 20 61 73 73 65 72 74 54 72 75 65        assertTrue
5f60: 28 6d 44 61 74 61 62 61 73 65 2e 69 73 4f 70 65  (mDatabase.isOpe
5f70: 6e 28 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 6d  n());..        m
5f80: 44 61 74 61 62 61 73 65 2e 63 6c 6f 73 65 28 29  Database.close()
5f90: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
5fa0: 46 61 6c 73 65 28 6d 44 61 74 61 62 61 73 65 2e  False(mDatabase.
5fb0: 69 73 4f 70 65 6e 28 29 29 3b 0a 20 20 20 20 7d  isOpen());.    }
5fc0: 0a 0a 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69  ..    public voi
5fd0: 64 20 74 65 73 74 49 73 52 65 61 64 4f 6e 6c 79  d testIsReadOnly
5fe0: 28 29 20 7b 0a 20 20 20 20 20 20 20 20 61 73 73  () {.        ass
5ff0: 65 72 74 46 61 6c 73 65 28 6d 44 61 74 61 62 61  ertFalse(mDataba
6000: 73 65 2e 69 73 52 65 61 64 4f 6e 6c 79 28 29 29  se.isReadOnly())
6010: 3b 0a 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74  ;..        SQLit
6020: 65 44 61 74 61 62 61 73 65 20 64 61 74 61 62 61  eDatabase databa
6030: 73 65 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20 20  se = null;.     
6040: 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20     try {.       
6050: 20 20 20 20 20 64 61 74 61 62 61 73 65 20 3d 20       database = 
6060: 53 51 4c 69 74 65 44 61 74 61 62 61 73 65 2e 6f  SQLiteDatabase.o
6070: 70 65 6e 44 61 74 61 62 61 73 65 28 6d 44 61 74  penDatabase(mDat
6080: 61 62 61 73 65 46 69 6c 65 50 61 74 68 2c 20 6e  abaseFilePath, n
6090: 75 6c 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ull,.           
60a0: 20 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 44           SQLiteD
60b0: 61 74 61 62 61 73 65 2e 4f 50 45 4e 5f 52 45 41  atabase.OPEN_REA
60c0: 44 4f 4e 4c 59 29 3b 0a 20 20 20 20 20 20 20 20  DONLY);.        
60d0: 20 20 20 20 61 73 73 65 72 74 54 72 75 65 28 64      assertTrue(d
60e0: 61 74 61 62 61 73 65 2e 69 73 52 65 61 64 4f 6e  atabase.isReadOn
60f0: 6c 79 28 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  ly());.        }
6100: 20 66 69 6e 61 6c 6c 79 20 7b 0a 20 20 20 20 20   finally {.     
6110: 20 20 20 20 20 20 20 69 66 20 28 64 61 74 61 62         if (datab
6120: 61 73 65 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a 20  ase != null) {. 
6130: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
6140: 61 74 61 62 61 73 65 2e 63 6c 6f 73 65 28 29 3b  atabase.close();
6150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
6160: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a         }.    }..
6170: 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20      public void 
6180: 74 65 73 74 52 65 6c 65 61 73 65 4d 65 6d 6f 72  testReleaseMemor
6190: 79 28 29 20 7b 0a 20 20 20 20 20 20 20 20 53 51  y() {.        SQ
61a0: 4c 69 74 65 44 61 74 61 62 61 73 65 2e 72 65 6c  LiteDatabase.rel
61b0: 65 61 73 65 4d 65 6d 6f 72 79 28 29 3b 0a 20 20  easeMemory();.  
61c0: 20 20 7d 0a 0a 20 20 20 20 70 75 62 6c 69 63 20    }..    public 
61d0: 76 6f 69 64 20 74 65 73 74 53 65 74 4c 6f 63 6b  void testSetLock
61e0: 69 6e 67 45 6e 61 62 6c 65 64 28 29 20 7b 0a 20  ingEnabled() {. 
61f0: 20 20 20 20 20 20 20 6d 44 61 74 61 62 61 73 65         mDatabase
6200: 2e 65 78 65 63 53 51 4c 28 22 43 52 45 41 54 45  .execSQL("CREATE
6210: 20 54 41 42 4c 45 20 74 65 73 74 20 28 6e 75 6d   TABLE test (num
6220: 20 49 4e 54 45 47 45 52 29 3b 22 29 3b 0a 20 20   INTEGER);");.  
6230: 20 20 20 20 20 20 6d 44 61 74 61 62 61 73 65 2e        mDatabase.
6240: 65 78 65 63 53 51 4c 28 22 49 4e 53 45 52 54 20  execSQL("INSERT 
6250: 49 4e 54 4f 20 74 65 73 74 20 28 6e 75 6d 29 20  INTO test (num) 
6260: 56 41 4c 55 45 53 20 28 30 29 22 29 3b 0a 0a 20  VALUES (0)");.. 
6270: 20 20 20 20 20 20 20 6d 44 61 74 61 62 61 73 65         mDatabase
6280: 2e 73 65 74 4c 6f 63 6b 69 6e 67 45 6e 61 62 6c  .setLockingEnabl
6290: 65 64 28 66 61 6c 73 65 29 3b 0a 0a 20 20 20 20  ed(false);..    
62a0: 20 20 20 20 6d 44 61 74 61 62 61 73 65 2e 62 65      mDatabase.be
62b0: 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 29  ginTransaction()
62c0: 3b 0a 20 20 20 20 20 20 20 20 73 65 74 4e 75 6d  ;.        setNum
62d0: 28 31 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  (1);.        ass
62e0: 65 72 74 4e 75 6d 28 31 29 3b 0a 20 20 20 20 20  ertNum(1);.     
62f0: 20 20 20 6d 44 61 74 61 62 61 73 65 2e 73 65 74     mDatabase.set
6300: 54 72 61 6e 73 61 63 74 69 6f 6e 53 75 63 63 65  TransactionSucce
6310: 73 73 66 75 6c 28 29 3b 0a 20 20 20 20 20 20 20  ssful();.       
6320: 20 6d 44 61 74 61 62 61 73 65 2e 65 6e 64 54 72   mDatabase.endTr
6330: 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20 20  ansaction();.   
6340: 20 7d 0a 0a 20 20 20 20 40 53 75 70 70 72 65 73   }..    @Suppres
6350: 73 57 61 72 6e 69 6e 67 73 28 22 64 65 70 72 65  sWarnings("depre
6360: 63 61 74 69 6f 6e 22 29 0a 20 20 20 20 70 75 62  cation").    pub
6370: 6c 69 63 20 76 6f 69 64 20 74 65 73 74 59 69 65  lic void testYie
6380: 6c 64 49 66 43 6f 6e 74 65 6e 64 65 64 57 68 65  ldIfContendedWhe
6390: 6e 4e 6f 74 43 6f 6e 74 65 6e 64 65 64 28 29 20  nNotContended() 
63a0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
63b0: 46 61 6c 73 65 28 6d 44 61 74 61 62 61 73 65 2e  False(mDatabase.
63c0: 79 69 65 6c 64 49 66 43 6f 6e 74 65 6e 64 65 64  yieldIfContended
63d0: 28 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 6d 44  ());..        mD
63e0: 61 74 61 62 61 73 65 2e 65 78 65 63 53 51 4c 28  atabase.execSQL(
63f0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 65  "CREATE TABLE te
6400: 73 74 20 28 6e 75 6d 20 49 4e 54 45 47 45 52 29  st (num INTEGER)
6410: 3b 22 29 3b 0a 20 20 20 20 20 20 20 20 6d 44 61  ;");.        mDa
6420: 74 61 62 61 73 65 2e 65 78 65 63 53 51 4c 28 22  tabase.execSQL("
6430: 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 65 73 74  INSERT INTO test
6440: 20 28 6e 75 6d 29 20 56 41 4c 55 45 53 20 28 30   (num) VALUES (0
6450: 29 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f  )");..        //
6460: 20 4d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   Make sure that 
6470: 74 68 69 6e 67 73 20 77 6f 72 6b 20 6f 75 74 73  things work outs
6480: 69 64 65 20 61 6e 20 65 78 70 6c 69 63 69 74 20  ide an explicit 
6490: 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20 20  transaction..   
64a0: 20 20 20 20 20 73 65 74 4e 75 6d 28 31 29 3b 0a       setNum(1);.
64b0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 4e 75          assertNu
64c0: 6d 28 31 29 3b 0a 0a 20 20 20 20 20 20 20 20 73  m(1);..        s
64d0: 65 74 4e 75 6d 28 30 29 3b 0a 20 20 20 20 20 20  etNum(0);.      
64e0: 20 20 61 73 73 65 72 74 46 61 6c 73 65 28 6d 44    assertFalse(mD
64f0: 61 74 61 62 61 73 65 2e 69 6e 54 72 61 6e 73 61  atabase.inTransa
6500: 63 74 69 6f 6e 28 29 29 3b 0a 20 20 20 20 20 20  ction());.      
6510: 20 20 6d 44 61 74 61 62 61 73 65 2e 62 65 67 69    mDatabase.begi
6520: 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a  nTransaction();.
6530: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 54 72          assertTr
6540: 75 65 28 6d 44 61 74 61 62 61 73 65 2e 69 6e 54  ue(mDatabase.inT
6550: 72 61 6e 73 61 63 74 69 6f 6e 28 29 29 3b 0a 20  ransaction());. 
6560: 20 20 20 20 20 20 20 61 73 73 65 72 74 46 61 6c         assertFal
6570: 73 65 28 6d 44 61 74 61 62 61 73 65 2e 79 69 65  se(mDatabase.yie
6580: 6c 64 49 66 43 6f 6e 74 65 6e 64 65 64 28 29 29  ldIfContended())
6590: 3b 0a 20 20 20 20 20 20 20 20 73 65 74 4e 75 6d  ;.        setNum
65a0: 28 31 29 3b 0a 20 20 20 20 20 20 20 20 6d 44 61  (1);.        mDa
65b0: 74 61 62 61 73 65 2e 73 65 74 54 72 61 6e 73 61  tabase.setTransa
65c0: 63 74 69 6f 6e 53 75 63 63 65 73 73 66 75 6c 28  ctionSuccessful(
65d0: 29 3b 0a 20 20 20 20 20 20 20 20 6d 44 61 74 61  );.        mData
65e0: 62 61 73 65 2e 65 6e 64 54 72 61 6e 73 61 63 74  base.endTransact
65f0: 69 6f 6e 28 29 3b 0a 0a 20 20 20 20 20 20 20 20  ion();..        
6600: 6d 44 61 74 61 62 61 73 65 2e 62 65 67 69 6e 54  mDatabase.beginT
6610: 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20  ransaction();.  
6620: 20 20 20 20 20 20 61 73 73 65 72 74 54 72 75 65        assertTrue
6630: 28 6d 44 61 74 61 62 61 73 65 2e 69 6e 54 72 61  (mDatabase.inTra
6640: 6e 73 61 63 74 69 6f 6e 28 29 29 3b 0a 20 20 20  nsaction());.   
6650: 20 20 20 20 20 61 73 73 65 72 74 46 61 6c 73 65       assertFalse
6660: 28 6d 44 61 74 61 62 61 73 65 2e 79 69 65 6c 64  (mDatabase.yield
6670: 49 66 43 6f 6e 74 65 6e 64 65 64 53 61 66 65 6c  IfContendedSafel
6680: 79 28 29 29 3b 0a 20 20 20 20 20 20 20 20 73 65  y());.        se
6690: 74 4e 75 6d 28 31 29 3b 0a 20 20 20 20 20 20 20  tNum(1);.       
66a0: 20 6d 44 61 74 61 62 61 73 65 2e 73 65 74 54 72   mDatabase.setTr
66b0: 61 6e 73 61 63 74 69 6f 6e 53 75 63 63 65 73 73  ansactionSuccess
66c0: 66 75 6c 28 29 3b 0a 20 20 20 20 20 20 20 20 6d  ful();.        m
66d0: 44 61 74 61 62 61 73 65 2e 65 6e 64 54 72 61 6e  Database.endTran
66e0: 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20 20 20 7d  saction();.    }
66f0: 0a 0a 20 20 20 20 40 53 75 70 70 72 65 73 73 57  ..    @SuppressW
6700: 61 72 6e 69 6e 67 73 28 22 64 65 70 72 65 63 61  arnings("depreca
6710: 74 69 6f 6e 22 29 0a 20 20 20 20 70 75 62 6c 69  tion").    publi
6720: 63 20 76 6f 69 64 20 74 65 73 74 59 69 65 6c 64  c void testYield
6730: 49 66 43 6f 6e 74 65 6e 64 65 64 57 68 65 6e 43  IfContendedWhenC
6740: 6f 6e 74 65 6e 64 65 64 28 29 20 74 68 72 6f 77  ontended() throw
6750: 73 20 45 78 63 65 70 74 69 6f 6e 20 7b 0a 20 20  s Exception {.  
6760: 20 20 20 20 20 20 6d 44 61 74 61 62 61 73 65 2e        mDatabase.
6770: 65 78 65 63 53 51 4c 28 22 43 52 45 41 54 45 20  execSQL("CREATE 
6780: 54 41 42 4c 45 20 74 65 73 74 20 28 6e 75 6d 20  TABLE test (num 
6790: 49 4e 54 45 47 45 52 29 3b 22 29 3b 0a 20 20 20  INTEGER);");.   
67a0: 20 20 20 20 20 6d 44 61 74 61 62 61 73 65 2e 65       mDatabase.e
67b0: 78 65 63 53 51 4c 28 22 49 4e 53 45 52 54 20 49  xecSQL("INSERT I
67c0: 4e 54 4f 20 74 65 73 74 20 28 6e 75 6d 29 20 56  NTO test (num) V
67d0: 41 4c 55 45 53 20 28 30 29 22 29 3b 0a 0a 20 20  ALUES (0)");..  
67e0: 20 20 20 20 20 20 2f 2f 20 42 65 67 69 6e 20 61        // Begin a
67f0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64   transaction and
6800: 20 75 70 64 61 74 65 20 61 20 76 61 6c 75 65 2e   update a value.
6810: 0a 20 20 20 20 20 20 20 20 6d 44 61 74 61 62 61  .        mDataba
6820: 73 65 2e 62 65 67 69 6e 54 72 61 6e 73 61 63 74  se.beginTransact
6830: 69 6f 6e 28 29 3b 0a 20 20 20 20 20 20 20 20 73  ion();.        s
6840: 65 74 4e 75 6d 28 31 29 3b 0a 20 20 20 20 20 20  etNum(1);.      
6850: 20 20 61 73 73 65 72 74 4e 75 6d 28 31 29 3b 0a    assertNum(1);.
6860: 0a 20 20 20 20 20 20 20 20 2f 2f 20 4f 6e 20 61  .        // On a
6870: 6e 6f 74 68 65 72 20 74 68 72 65 61 64 2c 20 62  nother thread, b
6880: 65 67 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69  egin a transacti
6890: 6f 6e 20 74 68 65 72 65 2e 20 20 54 68 69 73 20  on there.  This 
68a0: 63 61 75 73 65 73 20 63 6f 6e 74 65 6e 74 69 6f  causes contentio
68b0: 6e 0a 20 20 20 20 20 20 20 20 2f 2f 20 66 6f 72  n.        // for
68c0: 20 75 73 65 20 6f 66 20 74 68 65 20 64 61 74 61   use of the data
68d0: 62 61 73 65 2e 20 20 57 68 65 6e 20 74 68 65 20  base.  When the 
68e0: 6d 61 69 6e 20 74 68 72 65 61 64 20 79 69 65 6c  main thread yiel
68f0: 64 73 2c 20 74 68 65 20 73 65 63 6f 6e 64 20 74  ds, the second t
6900: 68 72 65 61 64 0a 20 20 20 20 20 20 20 20 2f 2f  hread.        //
6910: 20 62 65 67 69 6e 20 69 74 73 20 6f 77 6e 20 74   begin its own t
6920: 72 61 6e 73 61 63 74 69 6f 6e 2e 20 20 49 74 20  ransaction.  It 
6930: 73 68 6f 75 6c 64 20 70 65 72 63 65 69 76 65 20  should perceive 
6940: 74 68 65 20 6e 65 77 20 73 74 61 74 65 20 74 68  the new state th
6950: 61 74 20 77 61 73 0a 20 20 20 20 20 20 20 20 2f  at was.        /
6960: 2f 20 63 6f 6d 6d 69 74 74 65 64 20 62 79 20 74  / committed by t
6970: 68 65 20 6d 61 69 6e 20 74 68 72 65 61 64 20 77  he main thread w
6980: 68 65 6e 20 69 74 20 79 69 65 6c 64 65 64 2e 0a  hen it yielded..
6990: 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20 53 65          final Se
69a0: 6d 61 70 68 6f 72 65 20 73 20 3d 20 6e 65 77 20  maphore s = new 
69b0: 53 65 6d 61 70 68 6f 72 65 28 30 29 3b 0a 20 20  Semaphore(0);.  
69c0: 20 20 20 20 20 20 54 68 72 65 61 64 20 74 20 3d        Thread t =
69d0: 20 6e 65 77 20 54 68 72 65 61 64 28 29 20 7b 0a   new Thread() {.
69e0: 20 20 20 20 20 20 20 20 20 20 20 20 40 4f 76 65              @Ove
69f0: 72 72 69 64 65 0a 20 20 20 20 20 20 20 20 20 20  rride.          
6a00: 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20 72 75    public void ru
6a10: 6e 28 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  n() {.          
6a20: 20 20 20 20 20 20 73 2e 72 65 6c 65 61 73 65 28        s.release(
6a30: 29 3b 20 2f 2f 20 6c 65 74 20 6d 61 69 6e 20 74  ); // let main t
6a40: 68 72 65 61 64 20 63 6f 6e 74 69 6e 75 65 0a 0a  hread continue..
6a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6a60: 6d 44 61 74 61 62 61 73 65 2e 62 65 67 69 6e 54  mDatabase.beginT
6a70: 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20  ransaction();.  
6a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 73                as
6a90: 73 65 72 74 4e 75 6d 28 31 29 3b 0a 20 20 20 20  sertNum(1);.    
6aa0: 20 20 20 20 20 20 20 20 20 20 20 20 73 65 74 4e              setN
6ab0: 75 6d 28 32 29 3b 0a 20 20 20 20 20 20 20 20 20  um(2);.         
6ac0: 20 20 20 20 20 20 20 61 73 73 65 72 74 4e 75 6d         assertNum
6ad0: 28 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  (2);.           
6ae0: 20 20 20 20 20 6d 44 61 74 61 62 61 73 65 2e 73       mDatabase.s
6af0: 65 74 54 72 61 6e 73 61 63 74 69 6f 6e 53 75 63  etTransactionSuc
6b00: 63 65 73 73 66 75 6c 28 29 3b 0a 20 20 20 20 20  cessful();.     
6b10: 20 20 20 20 20 20 20 20 20 20 20 6d 44 61 74 61             mData
6b20: 62 61 73 65 2e 65 6e 64 54 72 61 6e 73 61 63 74  base.endTransact
6b30: 69 6f 6e 28 29 3b 0a 20 20 20 20 20 20 20 20 20  ion();.         
6b40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 3b 0a     }.        };.
6b50: 20 20 20 20 20 20 20 20 74 2e 73 74 61 72 74 28          t.start(
6b60: 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 57  );..        // W
6b70: 61 69 74 20 66 6f 72 20 74 68 72 65 61 64 20 74  ait for thread t
6b80: 6f 20 74 72 79 20 74 6f 20 62 65 67 69 6e 20 69  o try to begin i
6b90: 74 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a  ts transaction..
6ba0: 20 20 20 20 20 20 20 20 73 2e 61 63 71 75 69 72          s.acquir
6bb0: 65 28 29 3b 0a 20 20 20 20 20 20 20 20 54 68 72  e();.        Thr
6bc0: 65 61 64 2e 73 6c 65 65 70 28 35 30 30 29 3b 0a  ead.sleep(500);.
6bd0: 0a 20 20 20 20 20 20 20 20 2f 2f 20 59 69 65 6c  .        // Yiel
6be0: 64 2e 20 20 54 68 65 72 65 20 73 68 6f 75 6c 64  d.  There should
6bf0: 20 62 65 20 63 6f 6e 74 65 6e 74 69 6f 6e 20 66   be contention f
6c00: 6f 72 20 74 68 65 20 64 61 74 61 62 61 73 65 20  or the database 
6c10: 6e 6f 77 2c 20 73 6f 20 79 69 65 6c 64 20 77 69  now, so yield wi
6c20: 6c 6c 0a 20 20 20 20 20 20 20 20 2f 2f 20 72 65  ll.        // re
6c30: 74 75 72 6e 20 74 72 75 65 2e 0a 20 20 20 20 20  turn true..     
6c40: 20 20 20 61 73 73 65 72 74 54 72 75 65 28 6d 44     assertTrue(mD
6c50: 61 74 61 62 61 73 65 2e 79 69 65 6c 64 49 66 43  atabase.yieldIfC
6c60: 6f 6e 74 65 6e 64 65 64 53 61 66 65 6c 79 28 29  ontendedSafely()
6c70: 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 53  );..        // S
6c80: 69 6e 63 65 20 77 65 20 72 65 61 63 71 75 69 72  ince we reacquir
6c90: 65 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ed the transacti
6ca0: 6f 6e 2c 20 74 68 65 20 6f 74 68 65 72 20 74 68  on, the other th
6cb0: 72 65 61 64 20 6d 75 73 74 20 68 61 76 65 20 66  read must have f
6cc0: 69 6e 69 73 68 65 64 0a 20 20 20 20 20 20 20 20  inished.        
6cd0: 2f 2f 20 69 74 73 20 74 72 61 6e 73 61 63 74 69  // its transacti
6ce0: 6f 6e 2e 20 20 57 65 20 73 68 6f 75 6c 64 20 6f  on.  We should o
6cf0: 62 73 65 72 76 65 20 69 74 73 20 63 68 61 6e 67  bserve its chang
6d00: 65 73 20 61 6e 64 20 6f 75 72 20 6f 77 6e 20 77  es and our own w
6d10: 69 74 68 69 6e 20 74 68 69 73 20 74 72 61 6e 73  ithin this trans
6d20: 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  action..        
6d30: 61 73 73 65 72 74 4e 75 6d 28 32 29 3b 0a 20 20  assertNum(2);.  
6d40: 20 20 20 20 20 20 73 65 74 4e 75 6d 28 33 29 3b        setNum(3);
6d50: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 4e  .        assertN
6d60: 75 6d 28 33 29 3b 0a 0a 20 20 20 20 20 20 20 20  um(3);..        
6d70: 2f 2f 20 47 6f 20 61 68 65 61 64 20 61 6e 64 20  // Go ahead and 
6d80: 66 69 6e 69 73 68 20 74 68 65 20 74 72 61 6e 73  finish the trans
6d90: 61 63 74 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20  action..        
6da0: 6d 44 61 74 61 62 61 73 65 2e 73 65 74 54 72 61  mDatabase.setTra
6db0: 6e 73 61 63 74 69 6f 6e 53 75 63 63 65 73 73 66  nsactionSuccessf
6dc0: 75 6c 28 29 3b 0a 20 20 20 20 20 20 20 20 6d 44  ul();.        mD
6dd0: 61 74 61 62 61 73 65 2e 65 6e 64 54 72 61 6e 73  atabase.endTrans
6de0: 61 63 74 69 6f 6e 28 29 3b 0a 20 20 20 20 20 20  action();.      
6df0: 20 20 61 73 73 65 72 74 4e 75 6d 28 33 29 3b 0a    assertNum(3);.
6e00: 0a 20 20 20 20 20 20 20 20 74 2e 6a 6f 69 6e 28  .        t.join(
6e10: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 75  );.    }..    pu
6e20: 62 6c 69 63 20 76 6f 69 64 20 74 65 73 74 51 75  blic void testQu
6e30: 65 72 79 28 29 20 7b 0a 20 20 20 20 20 20 20 20  ery() {.        
6e40: 6d 44 61 74 61 62 61 73 65 2e 65 78 65 63 53 51  mDatabase.execSQ
6e50: 4c 28 22 43 52 45 41 54 45 20 54 41 42 4c 45 20  L("CREATE TABLE 
6e60: 65 6d 70 6c 6f 79 65 65 20 28 5f 69 64 20 49 4e  employee (_id IN
6e70: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
6e80: 59 2c 20 22 20 2b 0a 20 20 20 20 20 20 20 20 20  Y, " +.         
6e90: 20 20 20 20 20 20 20 22 6e 61 6d 65 20 54 45 58         "name TEX
6ea0: 54 2c 20 6d 6f 6e 74 68 20 49 4e 54 45 47 45 52  T, month INTEGER
6eb0: 2c 20 73 61 6c 61 72 79 20 49 4e 54 45 47 45 52  , salary INTEGER
6ec0: 29 3b 22 29 3b 0a 20 20 20 20 20 20 20 20 6d 44  );");.        mD
6ed0: 61 74 61 62 61 73 65 2e 65 78 65 63 53 51 4c 28  atabase.execSQL(
6ee0: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 65 6d 70  "INSERT INTO emp
6ef0: 6c 6f 79 65 65 20 28 6e 61 6d 65 2c 20 6d 6f 6e  loyee (name, mon
6f00: 74 68 2c 20 73 61 6c 61 72 79 29 20 22 20 2b 0a  th, salary) " +.
6f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f20: 22 56 41 4c 55 45 53 20 28 27 4d 69 6b 65 27 2c  "VALUES ('Mike',
6f30: 20 27 31 27 2c 20 27 31 30 30 30 27 29 3b 22 29   '1', '1000');")
6f40: 3b 0a 20 20 20 20 20 20 20 20 6d 44 61 74 61 62  ;.        mDatab
6f50: 61 73 65 2e 65 78 65 63 53 51 4c 28 22 49 4e 53  ase.execSQL("INS
6f60: 45 52 54 20 49 4e 54 4f 20 65 6d 70 6c 6f 79 65  ERT INTO employe
6f70: 65 20 28 6e 61 6d 65 2c 20 6d 6f 6e 74 68 2c 20  e (name, month, 
6f80: 73 61 6c 61 72 79 29 20 22 20 2b 0a 20 20 20 20  salary) " +.    
6f90: 20 20 20 20 20 20 20 20 20 20 20 20 22 56 41 4c              "VAL
6fa0: 55 45 53 20 28 27 4d 69 6b 65 27 2c 20 27 32 27  UES ('Mike', '2'
6fb0: 2c 20 27 33 30 30 30 27 29 3b 22 29 3b 0a 20 20  , '3000');");.  
6fc0: 20 20 20 20 20 20 6d 44 61 74 61 62 61 73 65 2e        mDatabase.
6fd0: 65 78 65 63 53 51 4c 28 22 49 4e 53 45 52 54 20  execSQL("INSERT 
6fe0: 49 4e 54 4f 20 65 6d 70 6c 6f 79 65 65 20 28 6e  INTO employee (n
6ff0: 61 6d 65 2c 20 6d 6f 6e 74 68 2c 20 73 61 6c 61  ame, month, sala
7000: 72 79 29 20 22 20 2b 0a 20 20 20 20 20 20 20 20  ry) " +.        
7010: 20 20 20 20 20 20 20 20 22 56 41 4c 55 45 53 20          "VALUES 
7020: 28 27 6a 61 63 6b 27 2c 20 27 31 27 2c 20 27 32  ('jack', '1', '2
7030: 30 30 30 27 29 3b 22 29 3b 0a 20 20 20 20 20 20  000');");.      
7040: 20 20 6d 44 61 74 61 62 61 73 65 2e 65 78 65 63    mDatabase.exec
7050: 53 51 4c 28 22 49 4e 53 45 52 54 20 49 4e 54 4f  SQL("INSERT INTO
7060: 20 65 6d 70 6c 6f 79 65 65 20 28 6e 61 6d 65 2c   employee (name,
7070: 20 6d 6f 6e 74 68 2c 20 73 61 6c 61 72 79 29 20   month, salary) 
7080: 22 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20  " +.            
7090: 20 20 20 20 22 56 41 4c 55 45 53 20 28 27 6a 61      "VALUES ('ja
70a0: 63 6b 27 2c 20 27 33 27 2c 20 27 31 35 30 30 27  ck', '3', '1500'
70b0: 29 3b 22 29 3b 0a 20 20 20 20 20 20 20 20 6d 44  );");.        mD
70c0: 61 74 61 62 61 73 65 2e 65 78 65 63 53 51 4c 28  atabase.execSQL(
70d0: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 65 6d 70  "INSERT INTO emp
70e0: 6c 6f 79 65 65 20 28 6e 61 6d 65 2c 20 6d 6f 6e  loyee (name, mon
70f0: 74 68 2c 20 73 61 6c 61 72 79 29 20 22 20 2b 0a  th, salary) " +.
7100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7110: 22 56 41 4c 55 45 53 20 28 27 4a 69 6d 27 2c 20  "VALUES ('Jim', 
7120: 27 31 27 2c 20 27 31 30 30 30 27 29 3b 22 29 3b  '1', '1000');");
7130: 0a 20 20 20 20 20 20 20 20 6d 44 61 74 61 62 61  .        mDataba
7140: 73 65 2e 65 78 65 63 53 51 4c 28 22 49 4e 53 45  se.execSQL("INSE
7150: 52 54 20 49 4e 54 4f 20 65 6d 70 6c 6f 79 65 65  RT INTO employee
7160: 20 28 6e 61 6d 65 2c 20 6d 6f 6e 74 68 2c 20 73   (name, month, s
7170: 61 6c 61 72 79 29 20 22 20 2b 0a 20 20 20 20 20  alary) " +.     
7180: 20 20 20 20 20 20 20 20 20 20 20 22 56 41 4c 55             "VALU
7190: 45 53 20 28 27 4a 69 6d 27 2c 20 27 33 27 2c 20  ES ('Jim', '3', 
71a0: 27 33 35 30 30 27 29 3b 22 29 3b 0a 0a 20 20 20  '3500');");..   
71b0: 20 20 20 20 20 43 75 72 73 6f 72 20 63 75 72 73       Cursor curs
71c0: 6f 72 20 3d 20 6d 44 61 74 61 62 61 73 65 2e 71  or = mDatabase.q
71d0: 75 65 72 79 28 74 72 75 65 2c 20 22 65 6d 70 6c  uery(true, "empl
71e0: 6f 79 65 65 22 2c 20 6e 65 77 20 53 74 72 69 6e  oyee", new Strin
71f0: 67 5b 5d 20 7b 20 22 6e 61 6d 65 22 2c 20 22 73  g[] { "name", "s
7200: 75 6d 28 73 61 6c 61 72 79 29 22 20 7d 2c 0a 20  um(salary)" },. 
7210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
7220: 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 22 6e 61 6d 65  ull, null, "name
7230: 22 2c 20 22 73 75 6d 28 73 61 6c 61 72 79 29 3e  ", "sum(salary)>
7240: 31 30 30 30 22 2c 20 22 6e 61 6d 65 22 2c 20 6e  1000", "name", n
7250: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ull);.        as
7260: 73 65 72 74 4e 6f 74 4e 75 6c 6c 28 63 75 72 73  sertNotNull(curs
7270: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  or);.        ass
7280: 65 72 74 45 71 75 61 6c 73 28 33 2c 20 63 75 72  ertEquals(3, cur
7290: 73 6f 72 2e 67 65 74 43 6f 75 6e 74 28 29 29 3b  sor.getCount());
72a0: 0a 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20  ..        final 
72b0: 69 6e 74 20 43 4f 4c 55 4d 4e 5f 4e 41 4d 45 5f  int COLUMN_NAME_
72c0: 49 4e 44 45 58 20 3d 20 30 3b 0a 20 20 20 20 20  INDEX = 0;.     
72d0: 20 20 20 66 69 6e 61 6c 20 69 6e 74 20 43 4f 4c     final int COL
72e0: 55 4d 4e 5f 53 41 4c 41 52 59 5f 49 4e 44 45 58  UMN_SALARY_INDEX
72f0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 63 75   = 1;.        cu
7300: 72 73 6f 72 2e 6d 6f 76 65 54 6f 46 69 72 73 74  rsor.moveToFirst
7310: 28 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ();.        asse
7320: 72 74 45 71 75 61 6c 73 28 22 4a 69 6d 22 2c 20  rtEquals("Jim", 
7330: 63 75 72 73 6f 72 2e 67 65 74 53 74 72 69 6e 67  cursor.getString
7340: 28 43 4f 4c 55 4d 4e 5f 4e 41 4d 45 5f 49 4e 44  (COLUMN_NAME_IND
7350: 45 58 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73  EX));.        as
7360: 73 65 72 74 45 71 75 61 6c 73 28 34 35 30 30 2c  sertEquals(4500,
7370: 20 63 75 72 73 6f 72 2e 67 65 74 49 6e 74 28 43   cursor.getInt(C
7380: 4f 4c 55 4d 4e 5f 53 41 4c 41 52 59 5f 49 4e 44  OLUMN_SALARY_IND
7390: 45 58 29 29 3b 0a 20 20 20 20 20 20 20 20 63 75  EX));.        cu
73a0: 72 73 6f 72 2e 6d 6f 76 65 54 6f 4e 65 78 74 28  rsor.moveToNext(
73b0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
73c0: 74 45 71 75 61 6c 73 28 22 4d 69 6b 65 22 2c 20  tEquals("Mike", 
73d0: 63 75 72 73 6f 72 2e 67 65 74 53 74 72 69 6e 67  cursor.getString
73e0: 28 43 4f 4c 55 4d 4e 5f 4e 41 4d 45 5f 49 4e 44  (COLUMN_NAME_IND
73f0: 45 58 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73  EX));.        as
7400: 73 65 72 74 45 71 75 61 6c 73 28 34 30 30 30 2c  sertEquals(4000,
7410: 20 63 75 72 73 6f 72 2e 67 65 74 49 6e 74 28 43   cursor.getInt(C
7420: 4f 4c 55 4d 4e 5f 53 41 4c 41 52 59 5f 49 4e 44  OLUMN_SALARY_IND
7430: 45 58 29 29 3b 0a 20 20 20 20 20 20 20 20 63 75  EX));.        cu
7440: 72 73 6f 72 2e 6d 6f 76 65 54 6f 4e 65 78 74 28  rsor.moveToNext(
7450: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
7460: 74 45 71 75 61 6c 73 28 22 6a 61 63 6b 22 2c 20  tEquals("jack", 
7470: 63 75 72 73 6f 72 2e 67 65 74 53 74 72 69 6e 67  cursor.getString
7480: 28 43 4f 4c 55 4d 4e 5f 4e 41 4d 45 5f 49 4e 44  (COLUMN_NAME_IND
7490: 45 58 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73  EX));.        as
74a0: 73 65 72 74 45 71 75 61 6c 73 28 33 35 30 30 2c  sertEquals(3500,
74b0: 20 63 75 72 73 6f 72 2e 67 65 74 49 6e 74 28 43   cursor.getInt(C
74c0: 4f 4c 55 4d 4e 5f 53 41 4c 41 52 59 5f 49 4e 44  OLUMN_SALARY_IND
74d0: 45 58 29 29 3b 0a 20 20 20 20 20 20 20 20 63 75  EX));.        cu
74e0: 72 73 6f 72 2e 63 6c 6f 73 65 28 29 3b 0a 0a 20  rsor.close();.. 
74f0: 20 20 20 20 20 20 20 43 75 72 73 6f 72 46 61 63         CursorFac
7500: 74 6f 72 79 20 66 61 63 74 6f 72 79 20 3d 20 6e  tory factory = n
7510: 65 77 20 43 75 72 73 6f 72 46 61 63 74 6f 72 79  ew CursorFactory
7520: 28 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  () {.           
7530: 20 70 75 62 6c 69 63 20 43 75 72 73 6f 72 20 6e   public Cursor n
7540: 65 77 43 75 72 73 6f 72 28 53 51 4c 69 74 65 44  ewCursor(SQLiteD
7550: 61 74 61 62 61 73 65 20 64 62 2c 20 53 51 4c 69  atabase db, SQLi
7560: 74 65 43 75 72 73 6f 72 44 72 69 76 65 72 20 6d  teCursorDriver m
7570: 61 73 74 65 72 51 75 65 72 79 2c 0a 20 20 20 20  asterQuery,.    
7580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7590: 53 74 72 69 6e 67 20 65 64 69 74 54 61 62 6c 65  String editTable
75a0: 2c 20 53 51 4c 69 74 65 51 75 65 72 79 20 71 75  , SQLiteQuery qu
75b0: 65 72 79 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ery) {.         
75c0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65         return ne
75d0: 77 20 4d 6f 63 6b 53 51 4c 69 74 65 43 75 72 73  w MockSQLiteCurs
75e0: 6f 72 28 64 62 2c 20 6d 61 73 74 65 72 51 75 65  or(db, masterQue
75f0: 72 79 2c 20 65 64 69 74 54 61 62 6c 65 2c 20 71  ry, editTable, q
7600: 75 65 72 79 29 3b 0a 20 20 20 20 20 20 20 20 20  uery);.         
7610: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 3b 0a     }.        };.
7620: 20 20 20 20 20 20 20 20 63 75 72 73 6f 72 20 3d          cursor =
7630: 20 6d 44 61 74 61 62 61 73 65 2e 71 75 65 72 79   mDatabase.query
7640: 57 69 74 68 46 61 63 74 6f 72 79 28 66 61 63 74  WithFactory(fact
7650: 6f 72 79 2c 20 74 72 75 65 2c 20 22 65 6d 70 6c  ory, true, "empl
7660: 6f 79 65 65 22 2c 0a 20 20 20 20 20 20 20 20 20  oyee",.         
7670: 20 20 20 20 20 20 20 6e 65 77 20 53 74 72 69 6e         new Strin
7680: 67 5b 5d 20 7b 20 22 6e 61 6d 65 22 2c 20 22 73  g[] { "name", "s
7690: 75 6d 28 73 61 6c 61 72 79 29 22 20 7d 2c 0a 20  um(salary)" },. 
76a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e                 n
76b0: 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 22 6e 61 6d 65  ull, null, "name
76c0: 22 2c 20 22 73 75 6d 28 73 61 6c 61 72 79 29 20  ", "sum(salary) 
76d0: 3e 20 31 30 30 30 22 2c 20 22 6e 61 6d 65 22 2c  > 1000", "name",
76e0: 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20   null);.        
76f0: 61 73 73 65 72 74 4e 6f 74 4e 75 6c 6c 28 63 75  assertNotNull(cu
7700: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 61  rsor);.        a
7710: 73 73 65 72 74 54 72 75 65 28 63 75 72 73 6f 72  ssertTrue(cursor
7720: 20 69 6e 73 74 61 6e 63 65 6f 66 20 4d 6f 63 6b   instanceof Mock
7730: 53 51 4c 69 74 65 43 75 72 73 6f 72 29 3b 0a 20  SQLiteCursor);. 
7740: 20 20 20 20 20 20 20 63 75 72 73 6f 72 2e 6d 6f         cursor.mo
7750: 76 65 54 6f 46 69 72 73 74 28 29 3b 0a 20 20 20  veToFirst();.   
7760: 20 20 20 20 20 61 73 73 65 72 74 45 71 75 61 6c       assertEqual
7770: 73 28 22 4a 69 6d 22 2c 20 63 75 72 73 6f 72 2e  s("Jim", cursor.
7780: 67 65 74 53 74 72 69 6e 67 28 43 4f 4c 55 4d 4e  getString(COLUMN
7790: 5f 4e 41 4d 45 5f 49 4e 44 45 58 29 29 3b 0a 20  _NAME_INDEX));. 
77a0: 20 20 20 20 20 20 20 61 73 73 65 72 74 45 71 75         assertEqu
77b0: 61 6c 73 28 34 35 30 30 2c 20 63 75 72 73 6f 72  als(4500, cursor
77c0: 2e 67 65 74 49 6e 74 28 43 4f 4c 55 4d 4e 5f 53  .getInt(COLUMN_S
77d0: 41 4c 41 52 59 5f 49 4e 44 45 58 29 29 3b 0a 20  ALARY_INDEX));. 
77e0: 20 20 20 20 20 20 20 63 75 72 73 6f 72 2e 6d 6f         cursor.mo
77f0: 76 65 54 6f 4e 65 78 74 28 29 3b 0a 20 20 20 20  veToNext();.    
7800: 20 20 20 20 61 73 73 65 72 74 45 71 75 61 6c 73      assertEquals
7810: 28 22 4d 69 6b 65 22 2c 20 63 75 72 73 6f 72 2e  ("Mike", cursor.
7820: 67 65 74 53 74 72 69 6e 67 28 43 4f 4c 55 4d 4e  getString(COLUMN
7830: 5f 4e 41 4d 45 5f 49 4e 44 45 58 29 29 3b 0a 20  _NAME_INDEX));. 
7840: 20 20 20 20 20 20 20 61 73 73 65 72 74 45 71 75         assertEqu
7850: 61 6c 73 28 34 30 30 30 2c 20 63 75 72 73 6f 72  als(4000, cursor
7860: 2e 67 65 74 49 6e 74 28 43 4f 4c 55 4d 4e 5f 53  .getInt(COLUMN_S
7870: 41 4c 41 52 59 5f 49 4e 44 45 58 29 29 3b 0a 20  ALARY_INDEX));. 
7880: 20 20 20 20 20 20 20 63 75 72 73 6f 72 2e 6d 6f         cursor.mo
7890: 76 65 54 6f 4e 65 78 74 28 29 3b 0a 20 20 20 20  veToNext();.    
78a0: 20 20 20 20 61 73 73 65 72 74 45 71 75 61 6c 73      assertEquals
78b0: 28 22 6a 61 63 6b 22 2c 20 63 75 72 73 6f 72 2e  ("jack", cursor.
78c0: 67 65 74 53 74 72 69 6e 67 28 43 4f 4c 55 4d 4e  getString(COLUMN
78d0: 5f 4e 41 4d 45 5f 49 4e 44 45 58 29 29 3b 0a 20  _NAME_INDEX));. 
78e0: 20 20 20 20 20 20 20 61 73 73 65 72 74 45 71 75         assertEqu
78f0: 61 6c 73 28 33 35 30 30 2c 20 63 75 72 73 6f 72  als(3500, cursor
7900: 2e 67 65 74 49 6e 74 28 43 4f 4c 55 4d 4e 5f 53  .getInt(COLUMN_S
7910: 41 4c 41 52 59 5f 49 4e 44 45 58 29 29 3b 0a 20  ALARY_INDEX));. 
7920: 20 20 20 20 20 20 20 63 75 72 73 6f 72 2e 63 6c         cursor.cl
7930: 6f 73 65 28 29 3b 0a 0a 20 20 20 20 20 20 20 20  ose();..        
7940: 63 75 72 73 6f 72 20 3d 20 6d 44 61 74 61 62 61  cursor = mDataba
7950: 73 65 2e 71 75 65 72 79 28 22 65 6d 70 6c 6f 79  se.query("employ
7960: 65 65 22 2c 20 6e 65 77 20 53 74 72 69 6e 67 5b  ee", new String[
7970: 5d 20 7b 20 22 6e 61 6d 65 22 2c 20 22 73 75 6d  ] { "name", "sum
7980: 28 73 61 6c 61 72 79 29 22 20 7d 2c 0a 20 20 20  (salary)" },.   
7990: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6c               nul
79a0: 6c 2c 20 6e 75 6c 6c 2c 20 22 6e 61 6d 65 22 2c  l, null, "name",
79b0: 20 22 73 75 6d 28 73 61 6c 61 72 79 29 20 3c 3d   "sum(salary) <=
79c0: 20 34 30 30 30 22 2c 20 22 6e 61 6d 65 22 29 3b   4000", "name");
79d0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 4e  .        assertN
79e0: 6f 74 4e 75 6c 6c 28 63 75 72 73 6f 72 29 3b 0a  otNull(cursor);.
79f0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 45 71          assertEq
7a00: 75 61 6c 73 28 32 2c 20 63 75 72 73 6f 72 2e 67  uals(2, cursor.g
7a10: 65 74 43 6f 75 6e 74 28 29 29 3b 0a 0a 20 20 20  etCount());..   
7a20: 20 20 20 20 20 63 75 72 73 6f 72 2e 6d 6f 76 65       cursor.move
7a30: 54 6f 46 69 72 73 74 28 29 3b 0a 20 20 20 20 20  ToFirst();.     
7a40: 20 20 20 61 73 73 65 72 74 45 71 75 61 6c 73 28     assertEquals(
7a50: 22 4d 69 6b 65 22 2c 20 63 75 72 73 6f 72 2e 67  "Mike", cursor.g
7a60: 65 74 53 74 72 69 6e 67 28 43 4f 4c 55 4d 4e 5f  etString(COLUMN_
7a70: 4e 41 4d 45 5f 49 4e 44 45 58 29 29 3b 0a 20 20  NAME_INDEX));.  
7a80: 20 20 20 20 20 20 61 73 73 65 72 74 45 71 75 61        assertEqua
7a90: 6c 73 28 34 30 30 30 2c 20 63 75 72 73 6f 72 2e  ls(4000, cursor.
7aa0: 67 65 74 49 6e 74 28 43 4f 4c 55 4d 4e 5f 53 41  getInt(COLUMN_SA
7ab0: 4c 41 52 59 5f 49 4e 44 45 58 29 29 3b 0a 20 20  LARY_INDEX));.  
7ac0: 20 20 20 20 20 20 63 75 72 73 6f 72 2e 6d 6f 76        cursor.mov
7ad0: 65 54 6f 4e 65 78 74 28 29 3b 0a 20 20 20 20 20  eToNext();.     
7ae0: 20 20 20 61 73 73 65 72 74 45 71 75 61 6c 73 28     assertEquals(
7af0: 22 6a 61 63 6b 22 2c 20 63 75 72 73 6f 72 2e 67  "jack", cursor.g
7b00: 65 74 53 74 72 69 6e 67 28 43 4f 4c 55 4d 4e 5f  etString(COLUMN_
7b10: 4e 41 4d 45 5f 49 4e 44 45 58 29 29 3b 0a 20 20  NAME_INDEX));.  
7b20: 20 20 20 20 20 20 61 73 73 65 72 74 45 71 75 61        assertEqua
7b30: 6c 73 28 33 35 30 30 2c 20 63 75 72 73 6f 72 2e  ls(3500, cursor.
7b40: 67 65 74 49 6e 74 28 43 4f 4c 55 4d 4e 5f 53 41  getInt(COLUMN_SA
7b50: 4c 41 52 59 5f 49 4e 44 45 58 29 29 3b 0a 20 20  LARY_INDEX));.  
7b60: 20 20 20 20 20 20 63 75 72 73 6f 72 2e 63 6c 6f        cursor.clo
7b70: 73 65 28 29 3b 0a 0a 20 20 20 20 20 20 20 20 63  se();..        c
7b80: 75 72 73 6f 72 20 3d 20 6d 44 61 74 61 62 61 73  ursor = mDatabas
7b90: 65 2e 71 75 65 72 79 28 22 65 6d 70 6c 6f 79 65  e.query("employe
7ba0: 65 22 2c 20 6e 65 77 20 53 74 72 69 6e 67 5b 5d  e", new String[]
7bb0: 20 7b 20 22 6e 61 6d 65 22 2c 20 22 73 75 6d 28   { "name", "sum(
7bc0: 73 61 6c 61 72 79 29 22 20 7d 2c 0a 20 20 20 20  salary)" },.    
7bd0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6c 6c              null
7be0: 2c 20 6e 75 6c 6c 2c 20 22 6e 61 6d 65 22 2c 20  , null, "name", 
7bf0: 22 73 75 6d 28 73 61 6c 61 72 79 29 20 3e 20 31  "sum(salary) > 1
7c00: 30 30 30 22 2c 20 22 6e 61 6d 65 22 2c 20 22 32  000", "name", "2
7c10: 22 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ");.        asse
7c20: 72 74 4e 6f 74 4e 75 6c 6c 28 63 75 72 73 6f 72  rtNotNull(cursor
7c30: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
7c40: 74 45 71 75 61 6c 73 28 32 2c 20 63 75 72 73 6f  tEquals(2, curso
7c50: 72 2e 67 65 74 43 6f 75 6e 74 28 29 29 3b 0a 0a  r.getCount());..
7c60: 20 20 20 20 20 20 20 20 63 75 72 73 6f 72 2e 6d          cursor.m
7c70: 6f 76 65 54 6f 46 69 72 73 74 28 29 3b 0a 20 20  oveToFirst();.  
7c80: 20 20 20 20 20 20 61 73 73 65 72 74 45 71 75 61        assertEqua
7c90: 6c 73 28 22 4a 69 6d 22 2c 20 63 75 72 73 6f 72  ls("Jim", cursor
7ca0: 2e 67 65 74 53 74 72 69 6e 67 28 43 4f 4c 55 4d  .getString(COLUM
7cb0: 4e 5f 4e 41 4d 45 5f 49 4e 44 45 58 29 29 3b 0a  N_NAME_INDEX));.
7cc0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 45 71          assertEq
7cd0: 75 61 6c 73 28 34 35 30 30 2c 20 63 75 72 73 6f  uals(4500, curso
7ce0: 72 2e 67 65 74 49 6e 74 28 43 4f 4c 55 4d 4e 5f  r.getInt(COLUMN_
7cf0: 53 41 4c 41 52 59 5f 49 4e 44 45 58 29 29 3b 0a  SALARY_INDEX));.
7d00: 20 20 20 20 20 20 20 20 63 75 72 73 6f 72 2e 6d          cursor.m
7d10: 6f 76 65 54 6f 4e 65 78 74 28 29 3b 0a 20 20 20  oveToNext();.   
7d20: 20 20 20 20 20 61 73 73 65 72 74 45 71 75 61 6c       assertEqual
7d30: 73 28 22 4d 69 6b 65 22 2c 20 63 75 72 73 6f 72  s("Mike", cursor
7d40: 2e 67 65 74 53 74 72 69 6e 67 28 43 4f 4c 55 4d  .getString(COLUM
7d50: 4e 5f 4e 41 4d 45 5f 49 4e 44 45 58 29 29 3b 0a  N_NAME_INDEX));.
7d60: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 45 71          assertEq
7d70: 75 61 6c 73 28 34 30 30 30 2c 20 63 75 72 73 6f  uals(4000, curso
7d80: 72 2e 67 65 74 49 6e 74 28 43 4f 4c 55 4d 4e 5f  r.getInt(COLUMN_
7d90: 53 41 4c 41 52 59 5f 49 4e 44 45 58 29 29 3b 0a  SALARY_INDEX));.
7da0: 20 20 20 20 20 20 20 20 63 75 72 73 6f 72 2e 63          cursor.c
7db0: 6c 6f 73 65 28 29 3b 0a 0a 20 20 20 20 20 20 20  lose();..       
7dc0: 20 53 74 72 69 6e 67 20 73 71 6c 20 3d 20 22 53   String sql = "S
7dd0: 45 4c 45 43 54 20 6e 61 6d 65 2c 20 6d 6f 6e 74  ELECT name, mont
7de0: 68 20 46 52 4f 4d 20 65 6d 70 6c 6f 79 65 65 20  h FROM employee 
7df0: 57 48 45 52 45 20 73 61 6c 61 72 79 20 3e 20 3f  WHERE salary > ?
7e00: 3b 22 3b 0a 20 20 20 20 20 20 20 20 63 75 72 73  ;";.        curs
7e10: 6f 72 20 3d 20 6d 44 61 74 61 62 61 73 65 2e 72  or = mDatabase.r
7e20: 61 77 51 75 65 72 79 28 73 71 6c 2c 20 6e 65 77  awQuery(sql, new
7e30: 20 53 74 72 69 6e 67 5b 5d 20 7b 20 22 32 30 30   String[] { "200
7e40: 30 22 20 7d 29 3b 0a 20 20 20 20 20 20 20 20 61  0" });.        a
7e50: 73 73 65 72 74 4e 6f 74 4e 75 6c 6c 28 63 75 72  ssertNotNull(cur
7e60: 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73  sor);.        as
7e70: 73 65 72 74 45 71 75 61 6c 73 28 32 2c 20 63 75  sertEquals(2, cu
7e80: 72 73 6f 72 2e 67 65 74 43 6f 75 6e 74 28 29 29  rsor.getCount())
7e90: 3b 0a 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c  ;..        final
7ea0: 20 69 6e 74 20 43 4f 4c 55 4d 4e 5f 4d 4f 4e 54   int COLUMN_MONT
7eb0: 48 5f 49 4e 44 45 58 20 3d 20 31 3b 0a 20 20 20  H_INDEX = 1;.   
7ec0: 20 20 20 20 20 63 75 72 73 6f 72 2e 6d 6f 76 65       cursor.move
7ed0: 54 6f 46 69 72 73 74 28 29 3b 0a 20 20 20 20 20  ToFirst();.     
7ee0: 20 20 20 61 73 73 65 72 74 45 71 75 61 6c 73 28     assertEquals(
7ef0: 22 4d 69 6b 65 22 2c 20 63 75 72 73 6f 72 2e 67  "Mike", cursor.g
7f00: 65 74 53 74 72 69 6e 67 28 43 4f 4c 55 4d 4e 5f  etString(COLUMN_
7f10: 4e 41 4d 45 5f 49 4e 44 45 58 29 29 3b 0a 20 20  NAME_INDEX));.  
7f20: 20 20 20 20 20 20 61 73 73 65 72 74 45 71 75 61        assertEqua
7f30: 6c 73 28 32 2c 20 63 75 72 73 6f 72 2e 67 65 74  ls(2, cursor.get
7f40: 49 6e 74 28 43 4f 4c 55 4d 4e 5f 4d 4f 4e 54 48  Int(COLUMN_MONTH
7f50: 5f 49 4e 44 45 58 29 29 3b 0a 20 20 20 20 20 20  _INDEX));.      
7f60: 20 20 63 75 72 73 6f 72 2e 6d 6f 76 65 54 6f 4e    cursor.moveToN
7f70: 65 78 74 28 29 3b 0a 20 20 20 20 20 20 20 20 61  ext();.        a
7f80: 73 73 65 72 74 45 71 75 61 6c 73 28 22 4a 69 6d  ssertEquals("Jim
7f90: 22 2c 20 63 75 72 73 6f 72 2e 67 65 74 53 74 72  ", cursor.getStr
7fa0: 69 6e 67 28 43 4f 4c 55 4d 4e 5f 4e 41 4d 45 5f  ing(COLUMN_NAME_
7fb0: 49 4e 44 45 58 29 29 3b 0a 20 20 20 20 20 20 20  INDEX));.       
7fc0: 20 61 73 73 65 72 74 45 71 75 61 6c 73 28 33 2c   assertEquals(3,
7fd0: 20 63 75 72 73 6f 72 2e 67 65 74 49 6e 74 28 43   cursor.getInt(C
7fe0: 4f 4c 55 4d 4e 5f 4d 4f 4e 54 48 5f 49 4e 44 45  OLUMN_MONTH_INDE
7ff0: 58 29 29 3b 0a 20 20 20 20 20 20 20 20 63 75 72  X));.        cur
8000: 73 6f 72 2e 63 6c 6f 73 65 28 29 3b 0a 0a 20 20  sor.close();..  
8010: 20 20 20 20 20 20 63 75 72 73 6f 72 20 3d 20 6d        cursor = m
8020: 44 61 74 61 62 61 73 65 2e 72 61 77 51 75 65 72  Database.rawQuer
8030: 79 57 69 74 68 46 61 63 74 6f 72 79 28 66 61 63  yWithFactory(fac
8040: 74 6f 72 79 2c 20 73 71 6c 2c 20 6e 65 77 20 53  tory, sql, new S
8050: 74 72 69 6e 67 5b 5d 20 7b 20 22 32 30 30 30 22  tring[] { "2000"
8060: 20 7d 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20   }, null);.     
8070: 20 20 20 61 73 73 65 72 74 4e 6f 74 4e 75 6c 6c     assertNotNull
8080: 28 63 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20  (cursor);.      
8090: 20 20 61 73 73 65 72 74 45 71 75 61 6c 73 28 32    assertEquals(2
80a0: 2c 20 63 75 72 73 6f 72 2e 67 65 74 43 6f 75 6e  , cursor.getCoun
80b0: 74 28 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73  t());.        as
80c0: 73 65 72 74 54 72 75 65 28 63 75 72 73 6f 72 20  sertTrue(cursor 
80d0: 69 6e 73 74 61 6e 63 65 6f 66 20 4d 6f 63 6b 53  instanceof MockS
80e0: 51 4c 69 74 65 43 75 72 73 6f 72 29 3b 0a 20 20  QLiteCursor);.  
80f0: 20 20 20 20 20 20 63 75 72 73 6f 72 2e 6d 6f 76        cursor.mov
8100: 65 54 6f 46 69 72 73 74 28 29 3b 0a 20 20 20 20  eToFirst();.    
8110: 20 20 20 20 61 73 73 65 72 74 45 71 75 61 6c 73      assertEquals
8120: 28 22 4d 69 6b 65 22 2c 20 63 75 72 73 6f 72 2e  ("Mike", cursor.
8130: 67 65 74 53 74 72 69 6e 67 28 43 4f 4c 55 4d 4e  getString(COLUMN
8140: 5f 4e 41 4d 45 5f 49 4e 44 45 58 29 29 3b 0a 20  _NAME_INDEX));. 
8150: 20 20 20 20 20 20 20 61 73 73 65 72 74 45 71 75         assertEqu
8160: 61 6c 73 28 32 2c 20 63 75 72 73 6f 72 2e 67 65  als(2, cursor.ge
8170: 74 49 6e 74 28 43 4f 4c 55 4d 4e 5f 4d 4f 4e 54  tInt(COLUMN_MONT
8180: 48 5f 49 4e 44 45 58 29 29 3b 0a 20 20 20 20 20  H_INDEX));.     
8190: 20 20 20 63 75 72 73 6f 72 2e 6d 6f 76 65 54 6f     cursor.moveTo
81a0: 4e 65 78 74 28 29 3b 0a 20 20 20 20 20 20 20 20  Next();.        
81b0: 61 73 73 65 72 74 45 71 75 61 6c 73 28 22 4a 69  assertEquals("Ji
81c0: 6d 22 2c 20 63 75 72 73 6f 72 2e 67 65 74 53 74  m", cursor.getSt
81d0: 72 69 6e 67 28 43 4f 4c 55 4d 4e 5f 4e 41 4d 45  ring(COLUMN_NAME
81e0: 5f 49 4e 44 45 58 29 29 3b 0a 20 20 20 20 20 20  _INDEX));.      
81f0: 20 20 61 73 73 65 72 74 45 71 75 61 6c 73 28 33    assertEquals(3
8200: 2c 20 63 75 72 73 6f 72 2e 67 65 74 49 6e 74 28  , cursor.getInt(
8210: 43 4f 4c 55 4d 4e 5f 4d 4f 4e 54 48 5f 49 4e 44  COLUMN_MONTH_IND
8220: 45 58 29 29 3b 0a 20 20 20 20 20 20 20 20 63 75  EX));.        cu
8230: 72 73 6f 72 2e 63 6c 6f 73 65 28 29 3b 0a 20 20  rsor.close();.  
8240: 20 20 7d 0a 0a 20 20 20 20 70 75 62 6c 69 63 20    }..    public 
8250: 76 6f 69 64 20 74 65 73 74 52 65 70 6c 61 63 65  void testReplace
8260: 28 29 20 7b 0a 20 20 20 20 20 20 20 20 6d 44 61  () {.        mDa
8270: 74 61 62 61 73 65 2e 65 78 65 63 53 51 4c 28 22  tabase.execSQL("
8280: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 65 73  CREATE TABLE tes
8290: 74 20 28 5f 69 64 20 49 4e 54 45 47 45 52 20 50  t (_id INTEGER P
82a0: 52 49 4d 41 52 59 20 4b 45 59 2c 20 22 0a 20 20  RIMARY KEY, ".  
82b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2b 20                + 
82c0: 22 6e 61 6d 65 20 54 45 58 54 2c 20 61 67 65 20  "name TEXT, age 
82d0: 49 4e 54 45 47 45 52 2c 20 61 64 64 72 65 73 73  INTEGER, address
82e0: 20 54 45 58 54 29 3b 22 29 3b 0a 0a 20 20 20 20   TEXT);");..    
82f0: 20 20 20 20 43 6f 6e 74 65 6e 74 56 61 6c 75 65      ContentValue
8300: 73 20 76 61 6c 75 65 73 20 3d 20 6e 65 77 20 43  s values = new C
8310: 6f 6e 74 65 6e 74 56 61 6c 75 65 73 28 29 3b 0a  ontentValues();.
8320: 20 20 20 20 20 20 20 20 76 61 6c 75 65 73 2e 70          values.p
8330: 75 74 28 22 6e 61 6d 65 22 2c 20 22 4a 61 63 6b  ut("name", "Jack
8340: 22 29 3b 0a 20 20 20 20 20 20 20 20 76 61 6c 75  ");.        valu
8350: 65 73 2e 70 75 74 28 22 61 67 65 22 2c 20 32 30  es.put("age", 20
8360: 29 3b 0a 20 20 20 20 20 20 20 20 76 61 6c 75 65  );.        value
8370: 73 2e 70 75 74 28 22 61 64 64 72 65 73 73 22 2c  s.put("address",
8380: 20 22 4c 41 22 29 3b 0a 20 20 20 20 20 20 20 20   "LA");.        
8390: 6d 44 61 74 61 62 61 73 65 2e 72 65 70 6c 61 63  mDatabase.replac
83a0: 65 28 54 41 42 4c 45 5f 4e 41 4d 45 2c 20 22 6e  e(TABLE_NAME, "n
83b0: 61 6d 65 22 2c 20 76 61 6c 75 65 73 29 3b 0a 0a  ame", values);..
83c0: 20 20 20 20 20 20 20 20 43 75 72 73 6f 72 20 63          Cursor c
83d0: 75 72 73 6f 72 20 3d 20 6d 44 61 74 61 62 61 73  ursor = mDatabas
83e0: 65 2e 71 75 65 72 79 28 54 41 42 4c 45 5f 4e 41  e.query(TABLE_NA
83f0: 4d 45 2c 20 54 45 53 54 5f 50 52 4f 4a 45 43 54  ME, TEST_PROJECT
8400: 49 4f 4e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ION,.           
8410: 20 20 20 20 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c       null, null,
8420: 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e 75 6c   null, null, nul
8430: 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  l);.        asse
8440: 72 74 4e 6f 74 4e 75 6c 6c 28 63 75 72 73 6f 72  rtNotNull(cursor
8450: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
8460: 74 45 71 75 61 6c 73 28 31 2c 20 63 75 72 73 6f  tEquals(1, curso
8470: 72 2e 67 65 74 43 6f 75 6e 74 28 29 29 3b 0a 20  r.getCount());. 
8480: 20 20 20 20 20 20 20 63 75 72 73 6f 72 2e 6d 6f         cursor.mo
8490: 76 65 54 6f 46 69 72 73 74 28 29 3b 0a 20 20 20  veToFirst();.   
84a0: 20 20 20 20 20 69 6e 74 20 69 64 20 3d 20 63 75       int id = cu
84b0: 72 73 6f 72 2e 67 65 74 49 6e 74 28 43 4f 4c 55  rsor.getInt(COLU
84c0: 4d 4e 5f 49 44 5f 49 4e 44 45 58 29 3b 0a 20 20  MN_ID_INDEX);.  
84d0: 20 20 20 20 20 20 61 73 73 65 72 74 45 71 75 61        assertEqua
84e0: 6c 73 28 22 4a 61 63 6b 22 2c 20 63 75 72 73 6f  ls("Jack", curso
84f0: 72 2e 67 65 74 53 74 72 69 6e 67 28 43 4f 4c 55  r.getString(COLU
8500: 4d 4e 5f 4e 41 4d 45 5f 49 4e 44 45 58 29 29 3b  MN_NAME_INDEX));
8510: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 45  .        assertE
8520: 71 75 61 6c 73 28 32 30 2c 20 63 75 72 73 6f 72  quals(20, cursor
8530: 2e 67 65 74 49 6e 74 28 43 4f 4c 55 4d 4e 5f 41  .getInt(COLUMN_A
8540: 47 45 5f 49 4e 44 45 58 29 29 3b 0a 20 20 20 20  GE_INDEX));.    
8550: 20 20 20 20 61 73 73 65 72 74 45 71 75 61 6c 73      assertEquals
8560: 28 22 4c 41 22 2c 20 63 75 72 73 6f 72 2e 67 65  ("LA", cursor.ge
8570: 74 53 74 72 69 6e 67 28 43 4f 4c 55 4d 4e 5f 41  tString(COLUMN_A
8580: 44 44 52 5f 49 4e 44 45 58 29 29 3b 0a 20 20 20  DDR_INDEX));.   
8590: 20 20 20 20 20 63 75 72 73 6f 72 2e 63 6c 6f 73       cursor.clos
85a0: 65 28 29 3b 0a 0a 20 20 20 20 20 20 20 20 76 61  e();..        va
85b0: 6c 75 65 73 20 3d 20 6e 65 77 20 43 6f 6e 74 65  lues = new Conte
85c0: 6e 74 56 61 6c 75 65 73 28 29 3b 0a 20 20 20 20  ntValues();.    
85d0: 20 20 20 20 76 61 6c 75 65 73 2e 70 75 74 28 22      values.put("
85e0: 5f 69 64 22 2c 20 69 64 29 3b 0a 20 20 20 20 20  _id", id);.     
85f0: 20 20 20 76 61 6c 75 65 73 2e 70 75 74 28 22 6e     values.put("n
8600: 61 6d 65 22 2c 20 22 4d 69 6b 65 22 29 3b 0a 20  ame", "Mike");. 
8610: 20 20 20 20 20 20 20 76 61 6c 75 65 73 2e 70 75         values.pu
8620: 74 28 22 61 67 65 22 2c 20 34 30 29 3b 0a 20 20  t("age", 40);.  
8630: 20 20 20 20 20 20 76 61 6c 75 65 73 2e 70 75 74        values.put
8640: 28 22 61 64 64 72 65 73 73 22 2c 20 22 4c 6f 6e  ("address", "Lon
8650: 64 6f 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 6d  don");.        m
8660: 44 61 74 61 62 61 73 65 2e 72 65 70 6c 61 63 65  Database.replace
8670: 28 54 41 42 4c 45 5f 4e 41 4d 45 2c 20 22 6e 61  (TABLE_NAME, "na
8680: 6d 65 22 2c 20 76 61 6c 75 65 73 29 3b 0a 0a 20  me", values);.. 
8690: 20 20 20 20 20 20 20 63 75 72 73 6f 72 20 3d 20         cursor = 
86a0: 6d 44 61 74 61 62 61 73 65 2e 71 75 65 72 79 28  mDatabase.query(
86b0: 54 41 42 4c 45 5f 4e 41 4d 45 2c 20 54 45 53 54  TABLE_NAME, TEST
86c0: 5f 50 52 4f 4a 45 43 54 49 4f 4e 2c 20 6e 75 6c  _PROJECTION, nul
86d0: 6c 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e  l, null, null, n
86e0: 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20  ull, null);.    
86f0: 20 20 20 20 61 73 73 65 72 74 4e 6f 74 4e 75 6c      assertNotNul
8700: 6c 28 63 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  l(cursor);.     
8710: 20 20 20 61 73 73 65 72 74 45 71 75 61 6c 73 28     assertEquals(
8720: 31 2c 20 63 75 72 73 6f 72 2e 67 65 74 43 6f 75  1, cursor.getCou
8730: 6e 74 28 29 29 3b 20 2f 2f 20 74 68 65 72 65 20  nt()); // there 
8740: 69 73 20 73 74 69 6c 6c 20 4f 4e 4c 59 20 31 20  is still ONLY 1 
8750: 72 65 63 6f 72 64 2e 0a 20 20 20 20 20 20 20 20  record..        
8760: 63 75 72 73 6f 72 2e 6d 6f 76 65 54 6f 46 69 72  cursor.moveToFir
8770: 73 74 28 29 3b 0a 20 20 20 20 20 20 20 20 61 73  st();.        as
8780: 73 65 72 74 45 71 75 61 6c 73 28 22 4d 69 6b 65  sertEquals("Mike
8790: 22 2c 20 63 75 72 73 6f 72 2e 67 65 74 53 74 72  ", cursor.getStr
87a0: 69 6e 67 28 43 4f 4c 55 4d 4e 5f 4e 41 4d 45 5f  ing(COLUMN_NAME_
87b0: 49 4e 44 45 58 29 29 3b 0a 20 20 20 20 20 20 20  INDEX));.       
87c0: 20 61 73 73 65 72 74 45 71 75 61 6c 73 28 34 30   assertEquals(40
87d0: 2c 20 63 75 72 73 6f 72 2e 67 65 74 49 6e 74 28  , cursor.getInt(
87e0: 43 4f 4c 55 4d 4e 5f 41 47 45 5f 49 4e 44 45 58  COLUMN_AGE_INDEX
87f0: 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ));.        asse
8800: 72 74 45 71 75 61 6c 73 28 22 4c 6f 6e 64 6f 6e  rtEquals("London
8810: 22 2c 20 63 75 72 73 6f 72 2e 67 65 74 53 74 72  ", cursor.getStr
8820: 69 6e 67 28 43 4f 4c 55 4d 4e 5f 41 44 44 52 5f  ing(COLUMN_ADDR_
8830: 49 4e 44 45 58 29 29 3b 0a 20 20 20 20 20 20 20  INDEX));.       
8840: 20 63 75 72 73 6f 72 2e 63 6c 6f 73 65 28 29 3b   cursor.close();
8850: 0a 0a 20 20 20 20 20 20 20 20 76 61 6c 75 65 73  ..        values
8860: 20 3d 20 6e 65 77 20 43 6f 6e 74 65 6e 74 56 61   = new ContentVa
8870: 6c 75 65 73 28 29 3b 0a 20 20 20 20 20 20 20 20  lues();.        
8880: 76 61 6c 75 65 73 2e 70 75 74 28 22 6e 61 6d 65  values.put("name
8890: 22 2c 20 22 4a 61 63 6b 22 29 3b 0a 20 20 20 20  ", "Jack");.    
88a0: 20 20 20 20 76 61 6c 75 65 73 2e 70 75 74 28 22      values.put("
88b0: 61 67 65 22 2c 20 32 30 29 3b 0a 20 20 20 20 20  age", 20);.     
88c0: 20 20 20 76 61 6c 75 65 73 2e 70 75 74 28 22 61     values.put("a
88d0: 64 64 72 65 73 73 22 2c 20 22 4c 41 22 29 3b 0a  ddress", "LA");.
88e0: 20 20 20 20 20 20 20 20 6d 44 61 74 61 62 61 73          mDatabas
88f0: 65 2e 72 65 70 6c 61 63 65 4f 72 54 68 72 6f 77  e.replaceOrThrow
8900: 28 54 41 42 4c 45 5f 4e 41 4d 45 2c 20 22 6e 61  (TABLE_NAME, "na
8910: 6d 65 22 2c 20 76 61 6c 75 65 73 29 3b 0a 0a 20  me", values);.. 
8920: 20 20 20 20 20 20 20 63 75 72 73 6f 72 20 3d 20         cursor = 
8930: 6d 44 61 74 61 62 61 73 65 2e 71 75 65 72 79 28  mDatabase.query(
8940: 54 41 42 4c 45 5f 4e 41 4d 45 2c 20 54 45 53 54  TABLE_NAME, TEST
8950: 5f 50 52 4f 4a 45 43 54 49 4f 4e 2c 20 6e 75 6c  _PROJECTION, nul
8960: 6c 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e  l, null, null, n
8970: 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20  ull, null);.    
8980: 20 20 20 20 61 73 73 65 72 74 4e 6f 74 4e 75 6c      assertNotNul
8990: 6c 28 63 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  l(cursor);.     
89a0: 20 20 20 61 73 73 65 72 74 45 71 75 61 6c 73 28     assertEquals(
89b0: 32 2c 20 63 75 72 73 6f 72 2e 67 65 74 43 6f 75  2, cursor.getCou
89c0: 6e 74 28 29 29 3b 0a 20 20 20 20 20 20 20 20 63  nt());.        c
89d0: 75 72 73 6f 72 2e 6d 6f 76 65 54 6f 46 69 72 73  ursor.moveToFirs
89e0: 74 28 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  t();.        ass
89f0: 65 72 74 45 71 75 61 6c 73 28 22 4d 69 6b 65 22  ertEquals("Mike"
8a00: 2c 20 63 75 72 73 6f 72 2e 67 65 74 53 74 72 69  , cursor.getStri
8a10: 6e 67 28 43 4f 4c 55 4d 4e 5f 4e 41 4d 45 5f 49  ng(COLUMN_NAME_I
8a20: 4e 44 45 58 29 29 3b 0a 20 20 20 20 20 20 20 20  NDEX));.        
8a30: 61 73 73 65 72 74 45 71 75 61 6c 73 28 34 30 2c  assertEquals(40,
8a40: 20 63 75 72 73 6f 72 2e 67 65 74 49 6e 74 28 43   cursor.getInt(C
8a50: 4f 4c 55 4d 4e 5f 41 47 45 5f 49 4e 44 45 58 29  OLUMN_AGE_INDEX)
8a60: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
8a70: 74 45 71 75 61 6c 73 28 22 4c 6f 6e 64 6f 6e 22  tEquals("London"
8a80: 2c 20 63 75 72 73 6f 72 2e 67 65 74 53 74 72 69  , cursor.getStri
8a90: 6e 67 28 43 4f 4c 55 4d 4e 5f 41 44 44 52 5f 49  ng(COLUMN_ADDR_I
8aa0: 4e 44 45 58 29 29 3b 0a 20 20 20 20 20 20 20 20  NDEX));.        
8ab0: 63 75 72 73 6f 72 2e 6d 6f 76 65 54 6f 4e 65 78  cursor.moveToNex
8ac0: 74 28 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  t();.        ass
8ad0: 65 72 74 45 71 75 61 6c 73 28 22 4a 61 63 6b 22  ertEquals("Jack"
8ae0: 2c 20 63 75 72 73 6f 72 2e 67 65 74 53 74 72 69  , cursor.getStri
8af0: 6e 67 28 43 4f 4c 55 4d 4e 5f 4e 41 4d 45 5f 49  ng(COLUMN_NAME_I
8b00: 4e 44 45 58 29 29 3b 0a 20 20 20 20 20 20 20 20  NDEX));.        
8b10: 61 73 73 65 72 74 45 71 75 61 6c 73 28 32 30 2c  assertEquals(20,
8b20: 20 63 75 72 73 6f 72 2e 67 65 74 49 6e 74 28 43   cursor.getInt(C
8b30: 4f 4c 55 4d 4e 5f 41 47 45 5f 49 4e 44 45 58 29  OLUMN_AGE_INDEX)
8b40: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
8b50: 74 45 71 75 61 6c 73 28 22 4c 41 22 2c 20 63 75  tEquals("LA", cu
8b60: 72 73 6f 72 2e 67 65 74 53 74 72 69 6e 67 28 43  rsor.getString(C
8b70: 4f 4c 55 4d 4e 5f 41 44 44 52 5f 49 4e 44 45 58  OLUMN_ADDR_INDEX
8b80: 29 29 3b 0a 20 20 20 20 20 20 20 20 63 75 72 73  ));.        curs
8b90: 6f 72 2e 63 6c 6f 73 65 28 29 3b 0a 0a 20 20 20  or.close();..   
8ba0: 20 20 20 20 20 76 61 6c 75 65 73 20 3d 20 6e 65       values = ne
8bb0: 77 20 43 6f 6e 74 65 6e 74 56 61 6c 75 65 73 28  w ContentValues(
8bc0: 29 3b 0a 20 20 20 20 20 20 20 20 76 61 6c 75 65  );.        value
8bd0: 73 2e 70 75 74 28 22 57 72 6f 6e 67 20 4b 65 79  s.put("Wrong Key
8be0: 22 2c 20 22 57 72 6f 6e 67 20 76 61 6c 75 65 22  ", "Wrong value"
8bf0: 29 3b 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b  );.        try {
8c00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 44 61  .            mDa
8c10: 74 61 62 61 73 65 2e 72 65 70 6c 61 63 65 4f 72  tabase.replaceOr
8c20: 54 68 72 6f 77 28 54 41 42 4c 45 5f 4e 41 4d 45  Throw(TABLE_NAME
8c30: 2c 20 22 6e 61 6d 65 22 2c 20 76 61 6c 75 65 73  , "name", values
8c40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
8c50: 61 69 6c 28 22 73 68 6f 75 6c 64 20 74 68 72 6f  ail("should thro
8c60: 77 20 53 51 4c 45 78 63 65 70 74 69 6f 6e 2e 22  w SQLException."
8c70: 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 63 61 74  );.        } cat
8c80: 63 68 20 28 53 51 4c 45 78 63 65 70 74 69 6f 6e  ch (SQLException
8c90: 20 65 29 20 7b 0a 20 20 20 20 20 20 20 20 7d 0a   e) {.        }.
8ca0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 75 62 6c 69      }..    publi
8cb0: 63 20 76 6f 69 64 20 74 65 73 74 55 70 64 61 74  c void testUpdat
8cc0: 65 28 29 20 7b 0a 20 20 20 20 20 20 20 20 6d 44  e() {.        mD
8cd0: 61 74 61 62 61 73 65 2e 65 78 65 63 53 51 4c 28  atabase.execSQL(
8ce0: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 65  "CREATE TABLE te
8cf0: 73 74 20 28 5f 69 64 20 49 4e 54 45 47 45 52 20  st (_id INTEGER 
8d00: 50 52 49 4d 41 52 59 20 4b 45 59 2c 20 64 61 74  PRIMARY KEY, dat
8d10: 61 20 54 45 58 54 29 3b 22 29 3b 0a 0a 20 20 20  a TEXT);");..   
8d20: 20 20 20 20 20 6d 44 61 74 61 62 61 73 65 2e 65       mDatabase.e
8d30: 78 65 63 53 51 4c 28 22 49 4e 53 45 52 54 20 49  xecSQL("INSERT I
8d40: 4e 54 4f 20 74 65 73 74 20 28 64 61 74 61 29 20  NTO test (data) 
8d50: 56 41 4c 55 45 53 20 28 27 73 74 72 69 6e 67 31  VALUES ('string1
8d60: 27 29 3b 22 29 3b 0a 20 20 20 20 20 20 20 20 6d  ');");.        m
8d70: 44 61 74 61 62 61 73 65 2e 65 78 65 63 53 51 4c  Database.execSQL
8d80: 28 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 65  ("INSERT INTO te
8d90: 73 74 20 28 64 61 74 61 29 20 56 41 4c 55 45 53  st (data) VALUES
8da0: 20 28 27 73 74 72 69 6e 67 32 27 29 3b 22 29 3b   ('string2');");
8db0: 0a 20 20 20 20 20 20 20 20 6d 44 61 74 61 62 61  .        mDataba
8dc0: 73 65 2e 65 78 65 63 53 51 4c 28 22 49 4e 53 45  se.execSQL("INSE
8dd0: 52 54 20 49 4e 54 4f 20 74 65 73 74 20 28 64 61  RT INTO test (da
8de0: 74 61 29 20 56 41 4c 55 45 53 20 28 27 73 74 72  ta) VALUES ('str
8df0: 69 6e 67 33 27 29 3b 22 29 3b 0a 0a 20 20 20 20  ing3');");..    
8e00: 20 20 20 20 53 74 72 69 6e 67 20 75 70 64 61 74      String updat
8e10: 65 64 53 74 72 69 6e 67 20 3d 20 22 74 68 69 73  edString = "this
8e20: 20 69 73 20 61 6e 20 75 70 64 61 74 65 64 20 74   is an updated t
8e30: 65 73 74 22 3b 0a 20 20 20 20 20 20 20 20 43 6f  est";.        Co
8e40: 6e 74 65 6e 74 56 61 6c 75 65 73 20 76 61 6c 75  ntentValues valu
8e50: 65 73 20 3d 20 6e 65 77 20 43 6f 6e 74 65 6e 74  es = new Content
8e60: 56 61 6c 75 65 73 28 31 29 3b 0a 20 20 20 20 20  Values(1);.     
8e70: 20 20 20 76 61 6c 75 65 73 2e 70 75 74 28 22 64     values.put("d
8e80: 61 74 61 22 2c 20 75 70 64 61 74 65 64 53 74 72  ata", updatedStr
8e90: 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ing);.        as
8ea0: 73 65 72 74 45 71 75 61 6c 73 28 31 2c 20 6d 44  sertEquals(1, mD
8eb0: 61 74 61 62 61 73 65 2e 75 70 64 61 74 65 28 22  atabase.update("
8ec0: 74 65 73 74 22 2c 20 76 61 6c 75 65 73 2c 20 22  test", values, "
8ed0: 5f 69 64 3d 31 22 2c 20 6e 75 6c 6c 29 29 3b 0a  _id=1", null));.
8ee0: 20 20 20 20 20 20 20 20 43 75 72 73 6f 72 20 63          Cursor c
8ef0: 75 72 73 6f 72 20 3d 20 6d 44 61 74 61 62 61 73  ursor = mDatabas
8f00: 65 2e 71 75 65 72 79 28 22 74 65 73 74 22 2c 20  e.query("test", 
8f10: 6e 75 6c 6c 2c 20 22 5f 69 64 3d 31 22 2c 20 6e  null, "_id=1", n
8f20: 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c  ull, null, null,
8f30: 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20   null);.        
8f40: 61 73 73 65 72 74 4e 6f 74 4e 75 6c 6c 28 63 75  assertNotNull(cu
8f50: 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 61  rsor);.        a
8f60: 73 73 65 72 74 45 71 75 61 6c 73 28 31 2c 20 63  ssertEquals(1, c
8f70: 75 72 73 6f 72 2e 67 65 74 43 6f 75 6e 74 28 29  ursor.getCount()
8f80: 29 3b 0a 20 20 20 20 20 20 20 20 63 75 72 73 6f  );.        curso
8f90: 72 2e 6d 6f 76 65 54 6f 46 69 72 73 74 28 29 3b  r.moveToFirst();
8fa0: 0a 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 20  .        String 
8fb0: 76 61 6c 75 65 20 3d 20 63 75 72 73 6f 72 2e 67  value = cursor.g
8fc0: 65 74 53 74 72 69 6e 67 28 63 75 72 73 6f 72 2e  etString(cursor.
8fd0: 67 65 74 43 6f 6c 75 6d 6e 49 6e 64 65 78 4f 72  getColumnIndexOr
8fe0: 54 68 72 6f 77 28 22 64 61 74 61 22 29 29 3b 0a  Throw("data"));.
8ff0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 45 71          assertEq
9000: 75 61 6c 73 28 75 70 64 61 74 65 64 53 74 72 69  uals(updatedStri
9010: 6e 67 2c 20 76 61 6c 75 65 29 3b 0a 20 20 20 20  ng, value);.    
9020: 20 20 20 20 63 75 72 73 6f 72 2e 63 6c 6f 73 65      cursor.close
9030: 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  ();.    }..    p
9040: 75 62 6c 69 63 20 76 6f 69 64 20 74 65 73 74 4e  ublic void testN
9050: 65 65 64 55 70 67 72 61 64 65 28 29 20 7b 0a 20  eedUpgrade() {. 
9060: 20 20 20 20 20 20 20 6d 44 61 74 61 62 61 73 65         mDatabase
9070: 2e 73 65 74 56 65 72 73 69 6f 6e 28 30 29 3b 0a  .setVersion(0);.
9080: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 54 72          assertTr
9090: 75 65 28 6d 44 61 74 61 62 61 73 65 2e 6e 65 65  ue(mDatabase.nee
90a0: 64 55 70 67 72 61 64 65 28 31 29 29 3b 0a 20 20  dUpgrade(1));.  
90b0: 20 20 20 20 20 20 6d 44 61 74 61 62 61 73 65 2e        mDatabase.
90c0: 73 65 74 56 65 72 73 69 6f 6e 28 31 29 3b 0a 20  setVersion(1);. 
90d0: 20 20 20 20 20 20 20 61 73 73 65 72 74 46 61 6c         assertFal
90e0: 73 65 28 6d 44 61 74 61 62 61 73 65 2e 6e 65 65  se(mDatabase.nee
90f0: 64 55 70 67 72 61 64 65 28 31 29 29 3b 0a 20 20  dUpgrade(1));.  
9100: 20 20 7d 0a 0a 20 20 20 20 70 75 62 6c 69 63 20    }..    public 
9110: 76 6f 69 64 20 74 65 73 74 53 65 74 4c 6f 63 61  void testSetLoca
9120: 6c 65 28 29 20 7b 0a 2f 2f 20 20 20 20 20 20 20  le() {.//       
9130: 20 66 69 6e 61 6c 20 53 74 72 69 6e 67 5b 5d 20   final String[] 
9140: 53 54 52 49 4e 47 53 20 3d 20 7b 0a 2f 2f 20 20  STRINGS = {.//  
9150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63                "c
9160: 5c 75 30 30 66 34 74 5c 75 30 30 65 39 22 2c 0a  \u00f4t\u00e9",.
9170: 2f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20 20  //              
9180: 20 20 22 63 6f 74 65 22 2c 0a 2f 2f 20 20 20 20    "cote",.//    
9190: 20 20 20 20 20 20 20 20 20 20 20 20 22 63 5c 75              "c\u
91a0: 30 30 66 34 74 65 22 2c 0a 2f 2f 20 20 20 20 20  00f4te",.//     
91b0: 20 20 20 20 20 20 20 20 20 20 20 22 63 6f 74 5c             "cot\
91c0: 75 30 30 65 39 22 2c 0a 2f 2f 20 20 20 20 20 20  u00e9",.//      
91d0: 20 20 20 20 20 20 20 20 20 20 22 62 6f 79 22 2c            "boy",
91e0: 0a 2f 2f 20 20 20 20 20 20 20 20 20 20 20 20 20  .//             
91f0: 20 20 20 22 64 6f 67 22 2c 0a 2f 2f 20 20 20 20     "dog",.//    
9200: 20 20 20 20 20 20 20 20 20 20 20 20 22 43 4f 54              "COT
9210: 45 22 2c 0a 2f 2f 20 20 20 20 20 20 20 20 7d 3b  E",.//        };
9220: 0a 2f 2f 0a 2f 2f 20 20 20 20 20 20 20 20 6d 44  .//.//        mD
9230: 61 74 61 62 61 73 65 2e 65 78 65 63 53 51 4c 28  atabase.execSQL(
9240: 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 65  "CREATE TABLE te
9250: 73 74 20 28 64 61 74 61 20 54 45 58 54 20 43 4f  st (data TEXT CO
9260: 4c 4c 41 54 45 20 4c 4f 43 41 4c 49 5a 45 44 29  LLATE LOCALIZED)
9270: 3b 22 29 3b 0a 2f 2f 20 20 20 20 20 20 20 20 66  ;");.//        f
9280: 6f 72 20 28 53 74 72 69 6e 67 20 73 20 3a 20 53  or (String s : S
9290: 54 52 49 4e 47 53 29 20 7b 0a 2f 2f 20 20 20 20  TRINGS) {.//    
92a0: 20 20 20 20 20 20 20 20 6d 44 61 74 61 62 61 73          mDatabas
92b0: 65 2e 65 78 65 63 53 51 4c 28 22 49 4e 53 45 52  e.execSQL("INSER
92c0: 54 20 49 4e 54 4f 20 74 65 73 74 20 56 41 4c 55  T INTO test VALU
92d0: 45 53 28 27 22 20 2b 20 73 20 2b 20 22 27 29 3b  ES('" + s + "');
92e0: 22 29 3b 0a 2f 2f 20 20 20 20 20 20 20 20 7d 0a  ");.//        }.
92f0: 2f 2f 0a 2f 2f 20 20 20 20 20 20 20 20 6d 44 61  //.//        mDa
9300: 74 61 62 61 73 65 2e 73 65 74 4c 6f 63 61 6c 65  tabase.setLocale
9310: 28 6e 65 77 20 4c 6f 63 61 6c 65 28 22 65 6e 22  (new Locale("en"
9320: 2c 20 22 55 53 22 29 29 3b 0a 2f 2f 0a 2f 2f 20  , "US"));.//.// 
9330: 20 20 20 20 20 20 20 53 74 72 69 6e 67 20 73 71         String sq
9340: 6c 20 3d 20 22 53 45 4c 45 43 54 20 64 61 74 61  l = "SELECT data
9350: 20 46 52 4f 4d 20 74 65 73 74 20 4f 52 44 45 52   FROM test ORDER
9360: 20 42 59 20 64 61 74 61 20 43 4f 4c 4c 41 54 45   BY data COLLATE
9370: 20 4c 4f 43 41 4c 49 5a 45 44 20 41 53 43 22 3b   LOCALIZED ASC";
9380: 0a 2f 2f 20 20 20 20 20 20 20 20 43 75 72 73 6f  .//        Curso
9390: 72 20 63 75 72 73 6f 72 20 3d 20 6d 44 61 74 61  r cursor = mData
93a0: 62 61 73 65 2e 72 61 77 51 75 65 72 79 28 73 71  base.rawQuery(sq
93b0: 6c 2c 20 6e 75 6c 6c 29 3b 0a 2f 2f 20 20 20 20  l, null);.//    
93c0: 20 20 20 20 61 73 73 65 72 74 4e 6f 74 4e 75 6c      assertNotNul
93d0: 6c 28 63 75 72 73 6f 72 29 3b 0a 2f 2f 20 20 20  l(cursor);.//   
93e0: 20 20 20 20 20 41 72 72 61 79 4c 69 73 74 3c 53       ArrayList<S
93f0: 74 72 69 6e 67 3e 20 69 74 65 6d 73 20 3d 20 6e  tring> items = n
9400: 65 77 20 41 72 72 61 79 4c 69 73 74 3c 53 74 72  ew ArrayList<Str
9410: 69 6e 67 3e 28 29 3b 0a 2f 2f 20 20 20 20 20 20  ing>();.//      
9420: 20 20 77 68 69 6c 65 20 28 63 75 72 73 6f 72 2e    while (cursor.
9430: 6d 6f 76 65 54 6f 4e 65 78 74 28 29 29 20 7b 0a  moveToNext()) {.
9440: 2f 2f 20 20 20 20 20 20 20 20 20 20 20 20 69 74  //            it
9450: 65 6d 73 2e 61 64 64 28 63 75 72 73 6f 72 2e 67  ems.add(cursor.g
9460: 65 74 53 74 72 69 6e 67 28 30 29 29 3b 0a 2f 2f  etString(0));.//
9470: 20 20 20 20 20 20 20 20 7d 0a 2f 2f 20 20 20 20          }.//    
9480: 20 20 20 20 53 74 72 69 6e 67 5b 5d 20 72 65 73      String[] res
9490: 75 6c 74 73 20 3d 20 69 74 65 6d 73 2e 74 6f 41  ults = items.toA
94a0: 72 72 61 79 28 6e 65 77 20 53 74 72 69 6e 67 5b  rray(new String[
94b0: 69 74 65 6d 73 2e 73 69 7a 65 28 29 5d 29 3b 0a  items.size()]);.
94c0: 2f 2f 20 20 20 20 20 20 20 20 61 73 73 65 72 74  //        assert
94d0: 45 71 75 61 6c 73 28 53 54 52 49 4e 47 53 2e 6c  Equals(STRINGS.l
94e0: 65 6e 67 74 68 2c 20 72 65 73 75 6c 74 73 2e 6c  ength, results.l
94f0: 65 6e 67 74 68 29 3b 0a 2f 2f 20 20 20 20 20 20  ength);.//      
9500: 20 20 63 75 72 73 6f 72 2e 63 6c 6f 73 65 28 29    cursor.close()
9510: 3b 0a 2f 2f 0a 2f 2f 20 20 20 20 20 20 20 20 2f  ;.//.//        /
9520: 2f 20 54 68 65 20 64 61 74 61 62 61 73 65 20 63  / The database c
9530: 6f 64 65 20 63 75 72 72 65 6e 74 6c 79 20 75 73  ode currently us
9540: 65 73 20 50 52 49 4d 41 52 59 20 63 6f 6c 6c 61  es PRIMARY colla
9550: 74 69 6f 6e 20 73 74 72 65 6e 67 74 68 2c 0a 2f  tion strength,./
9560: 2f 20 20 20 20 20 20 20 20 2f 2f 20 6d 65 61 6e  /        // mean
9570: 69 6e 67 20 74 68 61 74 20 61 6c 6c 20 76 65 72  ing that all ver
9580: 73 69 6f 6e 73 20 6f 66 20 61 20 63 68 61 72 61  sions of a chara
9590: 63 74 65 72 20 63 6f 6d 70 61 72 65 20 65 71 75  cter compare equ
95a0: 61 6c 20 28 72 65 67 61 72 64 6c 65 73 73 0a 2f  al (regardless./
95b0: 2f 20 20 20 20 20 20 20 20 2f 2f 20 6f 66 20 63  /        // of c
95c0: 61 73 65 20 6f 72 20 61 63 63 65 6e 74 73 29 2c  ase or accents),
95d0: 20 6c 65 61 76 69 6e 67 20 74 68 65 20 22 63 6f   leaving the "co
95e0: 74 65 22 20 66 6c 61 76 6f 72 73 20 69 6e 20 64  te" flavors in d
95f0: 61 74 61 62 61 73 65 20 6f 72 64 65 72 2e 0a 2f  atabase order../
9600: 2f 20 20 20 20 20 20 20 20 4d 6f 72 65 41 73 73  /        MoreAss
9610: 65 72 74 73 2e 61 73 73 65 72 74 45 71 75 61 6c  erts.assertEqual
9620: 73 28 72 65 73 75 6c 74 73 2c 20 6e 65 77 20 53  s(results, new S
9630: 74 72 69 6e 67 5b 5d 20 7b 0a 2f 2f 20 20 20 20  tring[] {.//    
9640: 20 20 20 20 20 20 20 20 20 20 20 20 53 54 52 49              STRI
9650: 4e 47 53 5b 34 5d 2c 20 20 2f 2f 20 22 62 6f 79  NGS[4],  // "boy
9660: 22 0a 2f 2f 20 20 20 20 20 20 20 20 20 20 20 20  ".//            
9670: 20 20 20 20 53 54 52 49 4e 47 53 5b 30 5d 2c 20      STRINGS[0], 
9680: 20 2f 2f 20 73 75 6e 64 72 79 20 66 6f 72 6d 73   // sundry forms
9690: 20 6f 66 20 22 63 6f 74 65 22 0a 2f 2f 20 20 20   of "cote".//   
96a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 53 54 52               STR
96b0: 49 4e 47 53 5b 31 5d 2c 0a 2f 2f 20 20 20 20 20  INGS[1],.//     
96c0: 20 20 20 20 20 20 20 20 20 20 20 53 54 52 49 4e             STRIN
96d0: 47 53 5b 32 5d 2c 0a 2f 2f 20 20 20 20 20 20 20  GS[2],.//       
96e0: 20 20 20 20 20 20 20 20 20 53 54 52 49 4e 47 53           STRINGS
96f0: 5b 33 5d 2c 0a 2f 2f 20 20 20 20 20 20 20 20 20  [3],.//         
9700: 20 20 20 20 20 20 20 53 54 52 49 4e 47 53 5b 36         STRINGS[6
9710: 5d 2c 20 20 2f 2f 20 22 43 4f 54 45 22 0a 2f 2f  ],  // "COTE".//
9720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9730: 53 54 52 49 4e 47 53 5b 35 5d 2c 20 20 2f 2f 20  STRINGS[5],  // 
9740: 22 64 6f 67 22 0a 2f 2f 20 20 20 20 20 20 20 20  "dog".//        
9750: 7d 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  });.    }..    p
9760: 75 62 6c 69 63 20 76 6f 69 64 20 74 65 73 74 4f  ublic void testO
9770: 6e 41 6c 6c 52 65 66 65 72 65 6e 63 65 73 52 65  nAllReferencesRe
9780: 6c 65 61 73 65 64 28 29 20 7b 0a 20 20 20 20 20  leased() {.     
9790: 20 20 20 61 73 73 65 72 74 54 72 75 65 28 6d 44     assertTrue(mD
97a0: 61 74 61 62 61 73 65 2e 69 73 4f 70 65 6e 28 29  atabase.isOpen()
97b0: 29 3b 0a 20 20 20 20 20 20 20 20 6d 44 61 74 61  );.        mData
97c0: 62 61 73 65 2e 72 65 6c 65 61 73 65 52 65 66 65  base.releaseRefe
97d0: 72 65 6e 63 65 28 29 3b 0a 20 20 20 20 20 20 20  rence();.       
97e0: 20 61 73 73 65 72 74 46 61 6c 73 65 28 6d 44 61   assertFalse(mDa
97f0: 74 61 62 61 73 65 2e 69 73 4f 70 65 6e 28 29 29  tabase.isOpen())
9800: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 75 62  ;.    }..    pub
9810: 6c 69 63 20 76 6f 69 64 20 74 65 73 74 54 72 61  lic void testTra
9820: 6e 73 61 63 74 69 6f 6e 57 69 74 68 53 51 4c 69  nsactionWithSQLi
9830: 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 4c 69 73  teTransactionLis
9840: 74 65 6e 65 72 28 29 20 7b 0a 20 20 20 20 20 20  tener() {.      
9850: 20 20 6d 44 61 74 61 62 61 73 65 2e 65 78 65 63    mDatabase.exec
9860: 53 51 4c 28 22 43 52 45 41 54 45 20 54 41 42 4c  SQL("CREATE TABL
9870: 45 20 74 65 73 74 20 28 6e 75 6d 20 49 4e 54 45  E test (num INTE
9880: 47 45 52 29 3b 22 29 3b 0a 20 20 20 20 20 20 20  GER);");.       
9890: 20 6d 44 61 74 61 62 61 73 65 2e 65 78 65 63 53   mDatabase.execS
98a0: 51 4c 28 22 49 4e 53 45 52 54 20 49 4e 54 4f 20  QL("INSERT INTO 
98b0: 74 65 73 74 20 28 6e 75 6d 29 20 56 41 4c 55 45  test (num) VALUE
98c0: 53 20 28 30 29 22 29 3b 0a 0a 20 20 20 20 20 20  S (0)");..      
98d0: 20 20 61 73 73 65 72 74 45 71 75 61 6c 73 28 6d    assertEquals(m
98e0: 54 72 61 6e 73 61 63 74 69 6f 6e 4c 69 73 74 65  TransactionListe
98f0: 6e 65 72 4f 6e 42 65 67 69 6e 43 61 6c 6c 65 64  nerOnBeginCalled
9900: 2c 20 66 61 6c 73 65 29 3b 0a 20 20 20 20 20 20  , false);.      
9910: 20 20 61 73 73 65 72 74 45 71 75 61 6c 73 28 6d    assertEquals(m
9920: 54 72 61 6e 73 61 63 74 69 6f 6e 4c 69 73 74 65  TransactionListe
9930: 6e 65 72 4f 6e 43 6f 6d 6d 69 74 43 61 6c 6c 65  nerOnCommitCalle
9940: 64 2c 20 66 61 6c 73 65 29 3b 0a 20 20 20 20 20  d, false);.     
9950: 20 20 20 61 73 73 65 72 74 45 71 75 61 6c 73 28     assertEquals(
9960: 6d 54 72 61 6e 73 61 63 74 69 6f 6e 4c 69 73 74  mTransactionList
9970: 65 6e 65 72 4f 6e 52 6f 6c 6c 62 61 63 6b 43 61  enerOnRollbackCa
9980: 6c 6c 65 64 2c 20 66 61 6c 73 65 29 3b 0a 20 20  lled, false);.  
9990: 20 20 20 20 20 20 6d 44 61 74 61 62 61 73 65 2e        mDatabase.
99a0: 62 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  beginTransaction
99b0: 57 69 74 68 4c 69 73 74 65 6e 65 72 28 6e 65 77  WithListener(new
99c0: 20 54 65 73 74 53 51 4c 69 74 65 54 72 61 6e 73   TestSQLiteTrans
99d0: 61 63 74 69 6f 6e 4c 69 73 74 65 6e 65 72 28 29  actionListener()
99e0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 41  );..        // A
99f0: 73 73 65 72 74 20 74 68 61 74 20 74 68 65 20 74  ssert that the t
9a00: 72 61 6e 73 63 61 74 69 6f 6e 20 68 61 73 20 73  ranscation has s
9a10: 74 61 72 74 65 64 0a 20 20 20 20 20 20 20 20 61  tarted.        a
9a20: 73 73 65 72 74 45 71 75 61 6c 73 28 6d 54 72 61  ssertEquals(mTra
9a30: 6e 73 61 63 74 69 6f 6e 4c 69 73 74 65 6e 65 72  nsactionListener
9a40: 4f 6e 42 65 67 69 6e 43 61 6c 6c 65 64 2c 20 74  OnBeginCalled, t
9a50: 72 75 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73  rue);.        as
9a60: 73 65 72 74 45 71 75 61 6c 73 28 6d 54 72 61 6e  sertEquals(mTran
9a70: 73 61 63 74 69 6f 6e 4c 69 73 74 65 6e 65 72 4f  sactionListenerO
9a80: 6e 43 6f 6d 6d 69 74 43 61 6c 6c 65 64 2c 20 66  nCommitCalled, f
9a90: 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61  alse);.        a
9aa0: 73 73 65 72 74 45 71 75 61 6c 73 28 6d 54 72 61  ssertEquals(mTra
9ab0: 6e 73 61 63 74 69 6f 6e 4c 69 73 74 65 6e 65 72  nsactionListener
9ac0: 4f 6e 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 65 64  OnRollbackCalled
9ad0: 2c 20 66 61 6c 73 65 29 3b 0a 0a 20 20 20 20 20  , false);..     
9ae0: 20 20 20 73 65 74 4e 75 6d 28 31 29 3b 0a 0a 20     setNum(1);.. 
9af0: 20 20 20 20 20 20 20 2f 2f 20 53 74 61 74 65 20         // State 
9b00: 73 68 6f 75 6c 64 6e 27 74 20 68 61 76 65 20 63  shouldn't have c
9b10: 68 61 6e 67 65 64 0a 20 20 20 20 20 20 20 20 61  hanged.        a
9b20: 73 73 65 72 74 45 71 75 61 6c 73 28 6d 54 72 61  ssertEquals(mTra
9b30: 6e 73 61 63 74 69 6f 6e 4c 69 73 74 65 6e 65 72  nsactionListener
9b40: 4f 6e 42 65 67 69 6e 43 61 6c 6c 65 64 2c 20 74  OnBeginCalled, t
9b50: 72 75 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73  rue);.        as
9b60: 73 65 72 74 45 71 75 61 6c 73 28 6d 54 72 61 6e  sertEquals(mTran
9b70: 73 61 63 74 69 6f 6e 4c 69 73 74 65 6e 65 72 4f  sactionListenerO
9b80: 6e 43 6f 6d 6d 69 74 43 61 6c 6c 65 64 2c 20 66  nCommitCalled, f
9b90: 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61  alse);.        a
9ba0: 73 73 65 72 74 45 71 75 61 6c 73 28 6d 54 72 61  ssertEquals(mTra
9bb0: 6e 73 61 63 74 69 6f 6e 4c 69 73 74 65 6e 65 72  nsactionListener
9bc0: 4f 6e 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 65 64  OnRollbackCalled
9bd0: 2c 20 66 61 6c 73 65 29 3b 0a 0a 20 20 20 20 20  , false);..     
9be0: 20 20 20 2f 2f 20 63 6f 6d 6d 69 74 20 74 68 65     // commit the
9bf0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20   transaction.   
9c00: 20 20 20 20 20 6d 44 61 74 61 62 61 73 65 2e 73       mDatabase.s
9c10: 65 74 54 72 61 6e 73 61 63 74 69 6f 6e 53 75 63  etTransactionSuc
9c20: 63 65 73 73 66 75 6c 28 29 3b 0a 20 20 20 20 20  cessful();.     
9c30: 20 20 20 6d 44 61 74 61 62 61 73 65 2e 65 6e 64     mDatabase.end
9c40: 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 0a  Transaction();..
9c50: 20 20 20 20 20 20 20 20 2f 2f 20 74 68 65 20 6c          // the l
9c60: 69 73 74 65 6e 65 72 20 73 68 6f 75 6c 64 20 68  istener should h
9c70: 61 76 65 20 62 65 65 6e 20 74 6f 6c 64 20 74 68  ave been told th
9c80: 61 74 20 63 6f 6d 6d 69 74 20 77 61 73 20 63 61  at commit was ca
9c90: 6c 6c 65 64 0a 20 20 20 20 20 20 20 20 61 73 73  lled.        ass
9ca0: 65 72 74 45 71 75 61 6c 73 28 6d 54 72 61 6e 73  ertEquals(mTrans
9cb0: 61 63 74 69 6f 6e 4c 69 73 74 65 6e 65 72 4f 6e  actionListenerOn
9cc0: 42 65 67 69 6e 43 61 6c 6c 65 64 2c 20 74 72 75  BeginCalled, tru
9cd0: 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  e);.        asse
9ce0: 72 74 45 71 75 61 6c 73 28 6d 54 72 61 6e 73 61  rtEquals(mTransa
9cf0: 63 74 69 6f 6e 4c 69 73 74 65 6e 65 72 4f 6e 43  ctionListenerOnC
9d00: 6f 6d 6d 69 74 43 61 6c 6c 65 64 2c 20 74 72 75  ommitCalled, tru
9d10: 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  e);.        asse
9d20: 72 74 45 71 75 61 6c 73 28 6d 54 72 61 6e 73 61  rtEquals(mTransa
9d30: 63 74 69 6f 6e 4c 69 73 74 65 6e 65 72 4f 6e 52  ctionListenerOnR
9d40: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 65 64 2c 20 66  ollbackCalled, f
9d50: 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  alse);.    }..  
9d60: 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20 74 65    public void te
9d70: 73 74 52 6f 6c 6c 62 61 63 6b 54 72 61 6e 73 61  stRollbackTransa
9d80: 63 74 69 6f 6e 57 69 74 68 53 51 4c 69 74 65 54  ctionWithSQLiteT
9d90: 72 61 6e 73 61 63 74 69 6f 6e 4c 69 73 74 65 6e  ransactionListen
9da0: 65 72 28 29 20 7b 0a 20 20 20 20 20 20 20 20 6d  er() {.        m
9db0: 44 61 74 61 62 61 73 65 2e 65 78 65 63 53 51 4c  Database.execSQL
9dc0: 28 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  ("CREATE TABLE t
9dd0: 65 73 74 20 28 6e 75 6d 20 49 4e 54 45 47 45 52  est (num INTEGER
9de0: 29 3b 22 29 3b 0a 20 20 20 20 20 20 20 20 6d 44  );");.        mD
9df0: 61 74 61 62 61 73 65 2e 65 78 65 63 53 51 4c 28  atabase.execSQL(
9e00: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 65 73  "INSERT INTO tes
9e10: 74 20 28 6e 75 6d 29 20 56 41 4c 55 45 53 20 28  t (num) VALUES (
9e20: 30 29 22 29 3b 0a 0a 20 20 20 20 20 20 20 20 61  0)");..        a
9e30: 73 73 65 72 74 45 71 75 61 6c 73 28 6d 54 72 61  ssertEquals(mTra
9e40: 6e 73 61 63 74 69 6f 6e 4c 69 73 74 65 6e 65 72  nsactionListener
9e50: 4f 6e 42 65 67 69 6e 43 61 6c 6c 65 64 2c 20 66  OnBeginCalled, f
9e60: 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61  alse);.        a
9e70: 73 73 65 72 74 45 71 75 61 6c 73 28 6d 54 72 61  ssertEquals(mTra
9e80: 6e 73 61 63 74 69 6f 6e 4c 69 73 74 65 6e 65 72  nsactionListener
9e90: 4f 6e 43 6f 6d 6d 69 74 43 61 6c 6c 65 64 2c 20  OnCommitCalled, 
9ea0: 66 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 20 20  false);.        
9eb0: 61 73 73 65 72 74 45 71 75 61 6c 73 28 6d 54 72  assertEquals(mTr
9ec0: 61 6e 73 61 63 74 69 6f 6e 4c 69 73 74 65 6e 65  ansactionListene
9ed0: 72 4f 6e 52 6f 6c 6c 62 61 63 6b 43 61 6c 6c 65  rOnRollbackCalle
9ee0: 64 2c 20 66 61 6c 73 65 29 3b 0a 20 20 20 20 20  d, false);.     
9ef0: 20 20 20 6d 44 61 74 61 62 61 73 65 2e 62 65 67     mDatabase.beg
9f00: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 57 69 74  inTransactionWit
9f10: 68 4c 69 73 74 65 6e 65 72 28 6e 65 77 20 54 65  hListener(new Te
9f20: 73 74 53 51 4c 69 74 65 54 72 61 6e 73 61 63 74  stSQLiteTransact
9f30: 69 6f 6e 4c 69 73 74 65 6e 65 72 28 29 29 3b 0a  ionListener());.
9f40: 0a 20 20 20 20 20 20 20 20 2f 2f 20 41 73 73 65  .        // Asse
9f50: 72 74 20 74 68 61 74 20 74 68 65 20 74 72 61 6e  rt that the tran
9f60: 73 63 61 74 69 6f 6e 20 68 61 73 20 73 74 61 72  scation has star
9f70: 74 65 64 0a 20 20 20 20 20 20 20 20 61 73 73 65  ted.        asse
9f80: 72 74 45 71 75 61 6c 73 28 6d 54 72 61 6e 73 61  rtEquals(mTransa
9f90: 63 74 69 6f 6e 4c 69 73 74 65 6e 65 72 4f 6e 42  ctionListenerOnB
9fa0: 65 67 69 6e 43 61 6c 6c 65 64 2c 20 74 72 75 65  eginCalled, true
9fb0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
9fc0: 74 45 71 75 61 6c 73 28 6d 54 72 61 6e 73 61 63  tEquals(mTransac
9fd0: 74 69 6f 6e 4c 69 73 74 65 6e 65 72 4f 6e 43 6f  tionListenerOnCo
9fe0: 6d 6d 69 74 43 61 6c 6c 65 64 2c 20 66 61 6c 73  mmitCalled, fals
9ff0: 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  e);.        asse
a000: 72 74 45 71 75 61 6c 73 28 6d 54 72 61 6e 73 61  rtEquals(mTransa
a010: 63 74 69 6f 6e 4c 69 73 74 65 6e 65 72 4f 6e 52  ctionListenerOnR
a020: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 65 64 2c 20 66  ollbackCalled, f
a030: 61 6c 73 65 29 3b 0a 0a 20 20 20 20 20 20 20 20  alse);..        
a040: 73 65 74 4e 75 6d 28 31 29 3b 0a 0a 20 20 20 20  setNum(1);..    
a050: 20 20 20 20 2f 2f 20 53 74 61 74 65 20 73 68 6f      // State sho
a060: 75 6c 64 6e 27 74 20 68 61 76 65 20 63 68 61 6e  uldn't have chan
a070: 67 65 64 0a 20 20 20 20 20 20 20 20 61 73 73 65  ged.        asse
a080: 72 74 45 71 75 61 6c 73 28 6d 54 72 61 6e 73 61  rtEquals(mTransa
a090: 63 74 69 6f 6e 4c 69 73 74 65 6e 65 72 4f 6e 42  ctionListenerOnB
a0a0: 65 67 69 6e 43 61 6c 6c 65 64 2c 20 74 72 75 65  eginCalled, true
a0b0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
a0c0: 74 45 71 75 61 6c 73 28 6d 54 72 61 6e 73 61 63  tEquals(mTransac
a0d0: 74 69 6f 6e 4c 69 73 74 65 6e 65 72 4f 6e 43 6f  tionListenerOnCo
a0e0: 6d 6d 69 74 43 61 6c 6c 65 64 2c 20 66 61 6c 73  mmitCalled, fals
a0f0: 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  e);.        asse
a100: 72 74 45 71 75 61 6c 73 28 6d 54 72 61 6e 73 61  rtEquals(mTransa
a110: 63 74 69 6f 6e 4c 69 73 74 65 6e 65 72 4f 6e 52  ctionListenerOnR
a120: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 65 64 2c 20 66  ollbackCalled, f
a130: 61 6c 73 65 29 3b 0a 0a 20 20 20 20 20 20 20 20  alse);..        
a140: 2f 2f 20 63 6f 6d 6d 69 74 20 74 68 65 20 74 72  // commit the tr
a150: 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20  ansaction.      
a160: 20 20 6d 44 61 74 61 62 61 73 65 2e 65 6e 64 54    mDatabase.endT
a170: 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 0a 20  ransaction();.. 
a180: 20 20 20 20 20 20 20 2f 2f 20 74 68 65 20 6c 69         // the li
a190: 73 74 65 6e 65 72 20 73 68 6f 75 6c 64 20 68 61  stener should ha
a1a0: 76 65 20 62 65 65 6e 20 74 6f 6c 64 20 74 68 61  ve been told tha
a1b0: 74 20 63 6f 6d 6d 69 74 20 77 61 73 20 63 61 6c  t commit was cal
a1c0: 6c 65 64 0a 20 20 20 20 20 20 20 20 61 73 73 65  led.        asse
a1d0: 72 74 45 71 75 61 6c 73 28 6d 54 72 61 6e 73 61  rtEquals(mTransa
a1e0: 63 74 69 6f 6e 4c 69 73 74 65 6e 65 72 4f 6e 42  ctionListenerOnB
a1f0: 65 67 69 6e 43 61 6c 6c 65 64 2c 20 74 72 75 65  eginCalled, true
a200: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
a210: 74 45 71 75 61 6c 73 28 6d 54 72 61 6e 73 61 63  tEquals(mTransac
a220: 74 69 6f 6e 4c 69 73 74 65 6e 65 72 4f 6e 43 6f  tionListenerOnCo
a230: 6d 6d 69 74 43 61 6c 6c 65 64 2c 20 66 61 6c 73  mmitCalled, fals
a240: 65 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  e);.        asse
a250: 72 74 45 71 75 61 6c 73 28 6d 54 72 61 6e 73 61  rtEquals(mTransa
a260: 63 74 69 6f 6e 4c 69 73 74 65 6e 65 72 4f 6e 52  ctionListenerOnR
a270: 6f 6c 6c 62 61 63 6b 43 61 6c 6c 65 64 2c 20 74  ollbackCalled, t
a280: 72 75 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  rue);.    }..   
a290: 20 70 72 69 76 61 74 65 20 63 6c 61 73 73 20 54   private class T
a2a0: 65 73 74 53 51 4c 69 74 65 54 72 61 6e 73 61 63  estSQLiteTransac
a2b0: 74 69 6f 6e 4c 69 73 74 65 6e 65 72 20 69 6d 70  tionListener imp
a2c0: 6c 65 6d 65 6e 74 73 20 53 51 4c 69 74 65 54 72  lements SQLiteTr
a2d0: 61 6e 73 61 63 74 69 6f 6e 4c 69 73 74 65 6e 65  ansactionListene
a2e0: 72 20 7b 0a 20 20 20 20 20 20 20 20 70 75 62 6c  r {.        publ
a2f0: 69 63 20 76 6f 69 64 20 6f 6e 42 65 67 69 6e 28  ic void onBegin(
a300: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
a310: 6d 54 72 61 6e 73 61 63 74 69 6f 6e 4c 69 73 74  mTransactionList
a320: 65 6e 65 72 4f 6e 42 65 67 69 6e 43 61 6c 6c 65  enerOnBeginCalle
a330: 64 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20  d = true;.      
a340: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 75 62    }..        pub
a350: 6c 69 63 20 76 6f 69 64 20 6f 6e 43 6f 6d 6d 69  lic void onCommi
a360: 74 28 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  t() {.          
a370: 20 20 6d 54 72 61 6e 73 61 63 74 69 6f 6e 4c 69    mTransactionLi
a380: 73 74 65 6e 65 72 4f 6e 43 6f 6d 6d 69 74 43 61  stenerOnCommitCa
a390: 6c 6c 65 64 20 3d 20 74 72 75 65 3b 0a 20 20 20  lled = true;.   
a3a0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
a3b0: 70 75 62 6c 69 63 20 76 6f 69 64 20 6f 6e 52 6f  public void onRo
a3c0: 6c 6c 62 61 63 6b 28 29 20 7b 0a 20 20 20 20 20  llback() {.     
a3d0: 20 20 20 20 20 20 20 6d 54 72 61 6e 73 61 63 74         mTransact
a3e0: 69 6f 6e 4c 69 73 74 65 6e 65 72 4f 6e 52 6f 6c  ionListenerOnRol
a3f0: 6c 62 61 63 6b 43 61 6c 6c 65 64 20 3d 20 74 72  lbackCalled = tr
a400: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
a410: 20 20 7d 0a 0a 20 20 20 20 70 75 62 6c 69 63 20    }..    public 
a420: 76 6f 69 64 20 74 65 73 74 47 72 6f 75 70 43 6f  void testGroupCo
a430: 6e 63 61 74 28 29 20 7b 0a 20 20 20 20 20 20 20  ncat() {.       
a440: 20 6d 44 61 74 61 62 61 73 65 2e 65 78 65 63 53   mDatabase.execS
a450: 51 4c 28 22 43 52 45 41 54 45 20 54 41 42 4c 45  QL("CREATE TABLE
a460: 20 74 65 73 74 20 28 69 20 49 4e 54 2c 20 6a 20   test (i INT, j 
a470: 54 45 58 54 29 3b 22 29 3b 0a 0a 20 20 20 20 20  TEXT);");..     
a480: 20 20 20 2f 2f 20 69 6e 73 65 72 74 20 32 20 72     // insert 2 r
a490: 6f 77 73 0a 20 20 20 20 20 20 20 20 53 74 72 69  ows.        Stri
a4a0: 6e 67 20 73 71 6c 20 3d 20 22 49 4e 53 45 52 54  ng sql = "INSERT
a4b0: 20 49 4e 54 4f 20 74 65 73 74 20 28 69 29 20 56   INTO test (i) V
a4c0: 41 4c 55 45 53 20 28 3f 29 3b 22 3b 0a 20 20 20  ALUES (?);";.   
a4d0: 20 20 20 20 20 53 51 4c 69 74 65 53 74 61 74 65       SQLiteState
a4e0: 6d 65 6e 74 20 69 6e 73 65 72 74 53 74 61 74 65  ment insertState
a4f0: 6d 65 6e 74 20 3d 20 6d 44 61 74 61 62 61 73 65  ment = mDatabase
a500: 2e 63 6f 6d 70 69 6c 65 53 74 61 74 65 6d 65 6e  .compileStatemen
a510: 74 28 73 71 6c 29 3b 0a 20 20 20 20 20 20 20 20  t(sql);.        
a520: 44 61 74 61 62 61 73 65 55 74 69 6c 73 2e 62 69  DatabaseUtils.bi
a530: 6e 64 4f 62 6a 65 63 74 54 6f 50 72 6f 67 72 61  ndObjectToProgra
a540: 6d 28 69 6e 73 65 72 74 53 74 61 74 65 6d 65 6e  m(insertStatemen
a550: 74 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20  t, 1, 1);.      
a560: 20 20 69 6e 73 65 72 74 53 74 61 74 65 6d 65 6e    insertStatemen
a570: 74 2e 65 78 65 63 75 74 65 28 29 3b 0a 20 20 20  t.execute();.   
a580: 20 20 20 20 20 44 61 74 61 62 61 73 65 55 74 69       DatabaseUti
a590: 6c 73 2e 62 69 6e 64 4f 62 6a 65 63 74 54 6f 50  ls.bindObjectToP
a5a0: 72 6f 67 72 61 6d 28 69 6e 73 65 72 74 53 74 61  rogram(insertSta
a5b0: 74 65 6d 65 6e 74 2c 20 31 2c 20 32 29 3b 0a 20  tement, 1, 2);. 
a5c0: 20 20 20 20 20 20 20 69 6e 73 65 72 74 53 74 61         insertSta
a5d0: 74 65 6d 65 6e 74 2e 65 78 65 63 75 74 65 28 29  tement.execute()
a5e0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 73 65 72 74  ;.        insert
a5f0: 53 74 61 74 65 6d 65 6e 74 2e 63 6c 6f 73 65 28  Statement.close(
a600: 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 6d  );..        // m
a610: 61 6b 65 20 73 75 72 65 20 74 68 65 72 65 20 61  ake sure there a
a620: 72 65 20 32 20 72 6f 77 73 20 69 6e 20 74 68 65  re 2 rows in the
a630: 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20 20 43   table.        C
a640: 75 72 73 6f 72 20 63 75 72 73 6f 72 20 3d 20 6d  ursor cursor = m
a650: 44 61 74 61 62 61 73 65 2e 72 61 77 51 75 65 72  Database.rawQuer
a660: 79 28 22 53 45 4c 45 43 54 20 63 6f 75 6e 74 28  y("SELECT count(
a670: 2a 29 20 46 52 4f 4d 20 74 65 73 74 22 2c 20 6e  *) FROM test", n
a680: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ull);.        as
a690: 73 65 72 74 4e 6f 74 4e 75 6c 6c 28 63 75 72 73  sertNotNull(curs
a6a0: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  or);.        ass
a6b0: 65 72 74 45 71 75 61 6c 73 28 31 2c 20 63 75 72  ertEquals(1, cur
a6c0: 73 6f 72 2e 67 65 74 43 6f 75 6e 74 28 29 29 3b  sor.getCount());
a6d0: 0a 20 20 20 20 20 20 20 20 63 75 72 73 6f 72 2e  .        cursor.
a6e0: 6d 6f 76 65 54 6f 4e 65 78 74 28 29 3b 0a 20 20  moveToNext();.  
a6f0: 20 20 20 20 20 20 61 73 73 65 72 74 45 71 75 61        assertEqua
a700: 6c 73 28 32 2c 20 63 75 72 73 6f 72 2e 67 65 74  ls(2, cursor.get
a710: 49 6e 74 28 30 29 29 3b 0a 20 20 20 20 20 20 20  Int(0));.       
a720: 20 63 75 72 73 6f 72 2e 63 6c 6f 73 65 28 29 3b   cursor.close();
a730: 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 63 6f 6e  ..        // con
a740: 63 61 74 65 6e 61 74 65 20 63 6f 6c 75 6d 6e 20  catenate column 
a750: 6a 20 66 72 6f 6d 20 61 6c 6c 20 74 68 65 20 72  j from all the r
a760: 6f 77 73 2e 20 73 68 6f 75 6c 64 20 72 65 74 75  ows. should retu
a770: 72 6e 20 4e 55 4c 4c 0a 20 20 20 20 20 20 20 20  rn NULL.        
a780: 63 75 72 73 6f 72 20 3d 20 6d 44 61 74 61 62 61  cursor = mDataba
a790: 73 65 2e 72 61 77 51 75 65 72 79 28 22 53 45 4c  se.rawQuery("SEL
a7a0: 45 43 54 20 67 72 6f 75 70 5f 63 6f 6e 63 61 74  ECT group_concat
a7b0: 28 6a 2c 20 27 20 27 29 20 46 52 4f 4d 20 74 65  (j, ' ') FROM te
a7c0: 73 74 22 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20  st", null);.    
a7d0: 20 20 20 20 61 73 73 65 72 74 4e 6f 74 4e 75 6c      assertNotNul
a7e0: 6c 28 63 75 72 73 6f 72 29 3b 0a 20 20 20 20 20  l(cursor);.     
a7f0: 20 20 20 61 73 73 65 72 74 45 71 75 61 6c 73 28     assertEquals(
a800: 31 2c 20 63 75 72 73 6f 72 2e 67 65 74 43 6f 75  1, cursor.getCou
a810: 6e 74 28 29 29 3b 0a 20 20 20 20 20 20 20 20 63  nt());.        c
a820: 75 72 73 6f 72 2e 6d 6f 76 65 54 6f 4e 65 78 74  ursor.moveToNext
a830: 28 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ();.        asse
a840: 72 74 4e 75 6c 6c 28 63 75 72 73 6f 72 2e 67 65  rtNull(cursor.ge
a850: 74 53 74 72 69 6e 67 28 30 29 29 3b 0a 20 20 20  tString(0));.   
a860: 20 20 20 20 20 63 75 72 73 6f 72 2e 63 6c 6f 73       cursor.clos
a870: 65 28 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f  e();..        //
a880: 20 64 72 6f 70 20 74 68 65 20 74 61 62 6c 65 0a   drop the table.
a890: 20 20 20 20 20 20 20 20 6d 44 61 74 61 62 61 73          mDatabas
a8a0: 65 2e 65 78 65 63 53 51 4c 28 22 44 52 4f 50 20  e.execSQL("DROP 
a8b0: 54 41 42 4c 45 20 74 65 73 74 3b 22 29 3b 0a 20  TABLE test;");. 
a8c0: 20 20 20 20 20 20 20 2f 2f 20 73 68 6f 75 6c 64         // should
a8d0: 20 67 65 74 20 6e 6f 20 65 78 63 65 70 74 69 6f   get no exceptio
a8e0: 6e 73 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 75  ns.    }..    pu
a8f0: 62 6c 69 63 20 76 6f 69 64 20 74 65 73 74 53 63  blic void testSc
a900: 68 65 6d 61 43 68 61 6e 67 65 73 28 29 20 7b 0a  hemaChanges() {.
a910: 20 20 20 20 20 20 20 20 6d 44 61 74 61 62 61 73          mDatabas
a920: 65 2e 65 78 65 63 53 51 4c 28 22 43 52 45 41 54  e.execSQL("CREAT
a930: 45 20 54 41 42 4c 45 20 74 65 73 74 20 28 69 20  E TABLE test (i 
a940: 49 4e 54 2c 20 6a 20 49 4e 54 29 3b 22 29 3b 0a  INT, j INT);");.
a950: 0a 20 20 20 20 20 20 20 20 2f 2f 20 61 74 20 74  .        // at t
a960: 68 65 20 62 65 67 69 6e 6e 69 6e 67 2c 20 74 68  he beginning, th
a970: 65 72 65 20 69 73 20 6e 6f 20 72 65 63 6f 72 64  ere is no record
a980: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
a990: 2e 0a 20 20 20 20 20 20 20 20 43 75 72 73 6f 72  ..        Cursor
a9a0: 20 63 75 72 73 6f 72 20 3d 20 6d 44 61 74 61 62   cursor = mDatab
a9b0: 61 73 65 2e 72 61 77 51 75 65 72 79 28 22 53 45  ase.rawQuery("SE
a9c0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 73 74  LECT * FROM test
a9d0: 22 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  ", null);.      
a9e0: 20 20 61 73 73 65 72 74 4e 6f 74 4e 75 6c 6c 28    assertNotNull(
a9f0: 63 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20  cursor);.       
aa00: 20 61 73 73 65 72 74 45 71 75 61 6c 73 28 30 2c   assertEquals(0,
aa10: 20 63 75 72 73 6f 72 2e 67 65 74 43 6f 75 6e 74   cursor.getCount
aa20: 28 29 29 3b 0a 20 20 20 20 20 20 20 20 63 75 72  ());.        cur
aa30: 73 6f 72 2e 63 6c 6f 73 65 28 29 3b 0a 0a 20 20  sor.close();..  
aa40: 20 20 20 20 20 20 53 74 72 69 6e 67 20 73 71 6c        String sql
aa50: 20 3d 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20   = "INSERT INTO 
aa60: 74 65 73 74 20 56 41 4c 55 45 53 20 28 3f 2c 20  test VALUES (?, 
aa70: 3f 29 3b 22 3b 0a 20 20 20 20 20 20 20 20 53 51  ?);";.        SQ
aa80: 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 69 6e  LiteStatement in
aa90: 73 65 72 74 53 74 61 74 65 6d 65 6e 74 20 3d 20  sertStatement = 
aaa0: 6d 44 61 74 61 62 61 73 65 2e 63 6f 6d 70 69 6c  mDatabase.compil
aab0: 65 53 74 61 74 65 6d 65 6e 74 28 73 71 6c 29 3b  eStatement(sql);
aac0: 0a 20 20 20 20 20 20 20 20 44 61 74 61 62 61 73  .        Databas
aad0: 65 55 74 69 6c 73 2e 62 69 6e 64 4f 62 6a 65 63  eUtils.bindObjec
aae0: 74 54 6f 50 72 6f 67 72 61 6d 28 69 6e 73 65 72  tToProgram(inser
aaf0: 74 53 74 61 74 65 6d 65 6e 74 2c 20 31 2c 20 31  tStatement, 1, 1
ab00: 29 3b 0a 20 20 20 20 20 20 20 20 44 61 74 61 62  );.        Datab
ab10: 61 73 65 55 74 69 6c 73 2e 62 69 6e 64 4f 62 6a  aseUtils.bindObj
ab20: 65 63 74 54 6f 50 72 6f 67 72 61 6d 28 69 6e 73  ectToProgram(ins
ab30: 65 72 74 53 74 61 74 65 6d 65 6e 74 2c 20 32 2c  ertStatement, 2,
ab40: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 73   2);.        ins
ab50: 65 72 74 53 74 61 74 65 6d 65 6e 74 2e 65 78 65  ertStatement.exe
ab60: 63 75 74 65 28 29 3b 0a 20 20 20 20 20 20 20 20  cute();.        
ab70: 69 6e 73 65 72 74 53 74 61 74 65 6d 65 6e 74 2e  insertStatement.
ab80: 63 6c 6f 73 65 28 29 3b 0a 0a 20 20 20 20 20 20  close();..      
ab90: 20 20 2f 2f 20 72 65 61 64 20 74 68 65 20 64 61    // read the da
aba0: 74 61 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  ta from the tabl
abb0: 65 20 61 6e 64 20 6d 61 6b 65 20 73 75 72 65 20  e and make sure 
abc0: 69 74 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20  it is correct.  
abd0: 20 20 20 20 20 20 63 75 72 73 6f 72 20 3d 20 6d        cursor = m
abe0: 44 61 74 61 62 61 73 65 2e 72 61 77 51 75 65 72  Database.rawQuer
abf0: 79 28 22 53 45 4c 45 43 54 20 69 2c 6a 20 46 52  y("SELECT i,j FR
ac00: 4f 4d 20 74 65 73 74 22 2c 20 6e 75 6c 6c 29 3b  OM test", null);
ac10: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 4e  .        assertN
ac20: 6f 74 4e 75 6c 6c 28 63 75 72 73 6f 72 29 3b 0a  otNull(cursor);.
ac30: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 45 71          assertEq
ac40: 75 61 6c 73 28 31 2c 20 63 75 72 73 6f 72 2e 67  uals(1, cursor.g
ac50: 65 74 43 6f 75 6e 74 28 29 29 3b 0a 20 20 20 20  etCount());.    
ac60: 20 20 20 20 63 75 72 73 6f 72 2e 6d 6f 76 65 54      cursor.moveT
ac70: 6f 4e 65 78 74 28 29 3b 0a 20 20 20 20 20 20 20  oNext();.       
ac80: 20 61 73 73 65 72 74 45 71 75 61 6c 73 28 31 2c   assertEquals(1,
ac90: 20 63 75 72 73 6f 72 2e 67 65 74 49 6e 74 28 30   cursor.getInt(0
aca0: 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ));.        asse
acb0: 72 74 45 71 75 61 6c 73 28 32 2c 20 63 75 72 73  rtEquals(2, curs
acc0: 6f 72 2e 67 65 74 49 6e 74 28 31 29 29 3b 0a 20  or.getInt(1));. 
acd0: 20 20 20 20 20 20 20 63 75 72 73 6f 72 2e 63 6c         cursor.cl
ace0: 6f 73 65 28 29 3b 0a 0a 20 20 20 20 20 20 20 20  ose();..        
acf0: 2f 2f 20 61 6c 74 65 72 20 74 68 65 20 74 61 62  // alter the tab
ad00: 6c 65 20 61 6e 64 20 65 78 65 63 75 74 65 20 61  le and execute a
ad10: 6e 6f 74 68 65 72 20 73 74 61 74 65 6d 65 6e 74  nother statement
ad20: 0a 20 20 20 20 20 20 20 20 6d 44 61 74 61 62 61  .        mDataba
ad30: 73 65 2e 65 78 65 63 53 51 4c 28 22 41 4c 54 45  se.execSQL("ALTE
ad40: 52 20 54 41 42 4c 45 20 74 65 73 74 20 41 44 44  R TABLE test ADD
ad50: 20 43 4f 4c 55 4d 4e 20 6b 20 69 6e 74 3b 22 29   COLUMN k int;")
ad60: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 20 3d 20  ;.        sql = 
ad70: 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 74 65 73  "INSERT INTO tes
ad80: 74 20 56 41 4c 55 45 53 20 28 3f 2c 20 3f 2c 20  t VALUES (?, ?, 
ad90: 3f 29 3b 22 3b 0a 20 20 20 20 20 20 20 20 69 6e  ?);";.        in
ada0: 73 65 72 74 53 74 61 74 65 6d 65 6e 74 20 3d 20  sertStatement = 
adb0: 6d 44 61 74 61 62 61 73 65 2e 63 6f 6d 70 69 6c  mDatabase.compil
adc0: 65 53 74 61 74 65 6d 65 6e 74 28 73 71 6c 29 3b  eStatement(sql);
add0: 0a 20 20 20 20 20 20 20 20 44 61 74 61 62 61 73  .        Databas
ade0: 65 55 74 69 6c 73 2e 62 69 6e 64 4f 62 6a 65 63  eUtils.bindObjec
adf0: 74 54 6f 50 72 6f 67 72 61 6d 28 69 6e 73 65 72  tToProgram(inser
ae00: 74 53 74 61 74 65 6d 65 6e 74 2c 20 31 2c 20 33  tStatement, 1, 3
ae10: 29 3b 0a 20 20 20 20 20 20 20 20 44 61 74 61 62  );.        Datab
ae20: 61 73 65 55 74 69 6c 73 2e 62 69 6e 64 4f 62 6a  aseUtils.bindObj
ae30: 65 63 74 54 6f 50 72 6f 67 72 61 6d 28 69 6e 73  ectToProgram(ins
ae40: 65 72 74 53 74 61 74 65 6d 65 6e 74 2c 20 32 2c  ertStatement, 2,
ae50: 20 34 29 3b 0a 20 20 20 20 20 20 20 20 44 61 74   4);.        Dat
ae60: 61 62 61 73 65 55 74 69 6c 73 2e 62 69 6e 64 4f  abaseUtils.bindO
ae70: 62 6a 65 63 74 54 6f 50 72 6f 67 72 61 6d 28 69  bjectToProgram(i
ae80: 6e 73 65 72 74 53 74 61 74 65 6d 65 6e 74 2c 20  nsertStatement, 
ae90: 33 2c 20 35 29 3b 0a 20 20 20 20 20 20 20 20 69  3, 5);.        i
aea0: 6e 73 65 72 74 53 74 61 74 65 6d 65 6e 74 2e 65  nsertStatement.e
aeb0: 78 65 63 75 74 65 28 29 3b 0a 20 20 20 20 20 20  xecute();.      
aec0: 20 20 69 6e 73 65 72 74 53 74 61 74 65 6d 65 6e    insertStatemen
aed0: 74 2e 63 6c 6f 73 65 28 29 3b 0a 0a 20 20 20 20  t.close();..    
aee0: 20 20 20 20 2f 2f 20 72 65 61 64 20 74 68 65 20      // read the 
aef0: 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 74 61  data from the ta
af00: 62 6c 65 20 61 6e 64 20 6d 61 6b 65 20 73 75 72  ble and make sur
af10: 65 20 69 74 20 69 73 20 63 6f 72 72 65 63 74 0a  e it is correct.
af20: 20 20 20 20 20 20 20 20 63 75 72 73 6f 72 20 3d          cursor =
af30: 20 6d 44 61 74 61 62 61 73 65 2e 72 61 77 51 75   mDatabase.rawQu
af40: 65 72 79 28 22 53 45 4c 45 43 54 20 69 2c 6a 2c  ery("SELECT i,j,
af50: 6b 20 46 52 4f 4d 20 74 65 73 74 22 2c 20 6e 75  k FROM test", nu
af60: 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ll);.        ass
af70: 65 72 74 4e 6f 74 4e 75 6c 6c 28 63 75 72 73 6f  ertNotNull(curso
af80: 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  r);.        asse
af90: 72 74 45 71 75 61 6c 73 28 32 2c 20 63 75 72 73  rtEquals(2, curs
afa0: 6f 72 2e 67 65 74 43 6f 75 6e 74 28 29 29 3b 0a  or.getCount());.
afb0: 20 20 20 20 20 20 20 20 63 75 72 73 6f 72 2e 6d          cursor.m
afc0: 6f 76 65 54 6f 4e 65 78 74 28 29 3b 0a 20 20 20  oveToNext();.   
afd0: 20 20 20 20 20 61 73 73 65 72 74 45 71 75 61 6c       assertEqual
afe0: 73 28 31 2c 20 63 75 72 73 6f 72 2e 67 65 74 49  s(1, cursor.getI
aff0: 6e 74 28 30 29 29 3b 0a 20 20 20 20 20 20 20 20  nt(0));.        
b000: 61 73 73 65 72 74 45 71 75 61 6c 73 28 32 2c 20  assertEquals(2, 
b010: 63 75 72 73 6f 72 2e 67 65 74 49 6e 74 28 31 29  cursor.getInt(1)
b020: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
b030: 74 4e 75 6c 6c 28 63 75 72 73 6f 72 2e 67 65 74  tNull(cursor.get
b040: 53 74 72 69 6e 67 28 32 29 29 3b 0a 20 20 20 20  String(2));.    
b050: 20 20 20 20 63 75 72 73 6f 72 2e 6d 6f 76 65 54      cursor.moveT
b060: 6f 4e 65 78 74 28 29 3b 0a 20 20 20 20 20 20 20  oNext();.       
b070: 20 61 73 73 65 72 74 45 71 75 61 6c 73 28 33 2c   assertEquals(3,
b080: 20 63 75 72 73 6f 72 2e 67 65 74 49 6e 74 28 30   cursor.getInt(0
b090: 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ));.        asse
b0a0: 72 74 45 71 75 61 6c 73 28 34 2c 20 63 75 72 73  rtEquals(4, curs
b0b0: 6f 72 2e 67 65 74 49 6e 74 28 31 29 29 3b 0a 20  or.getInt(1));. 
b0c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 45 71 75         assertEqu
b0d0: 61 6c 73 28 35 2c 20 63 75 72 73 6f 72 2e 67 65  als(5, cursor.ge
b0e0: 74 49 6e 74 28 32 29 29 3b 0a 20 20 20 20 20 20  tInt(2));.      
b0f0: 20 20 63 75 72 73 6f 72 2e 63 6c 6f 73 65 28 29    cursor.close()
b100: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 6d 61  ;..        // ma
b110: 6b 65 20 73 75 72 65 20 74 68 65 20 6f 6c 64 20  ke sure the old 
b120: 73 74 61 74 65 6d 65 6e 74 20 2d 20 77 68 69 63  statement - whic
b130: 68 20 73 68 6f 75 6c 64 20 2a 74 72 79 20 74 6f  h should *try to
b140: 20 72 65 75 73 65 2a 20 63 61 63 68 65 64 20 71   reuse* cached q
b150: 75 65 72 79 20 70 6c 61 6e 20 2d 0a 20 20 20 20  uery plan -.    
b160: 20 20 20 20 2f 2f 20 73 74 69 6c 6c 20 77 6f 72      // still wor
b170: 6b 73 0a 20 20 20 20 20 20 20 20 63 75 72 73 6f  ks.        curso
b180: 72 20 3d 20 6d 44 61 74 61 62 61 73 65 2e 72 61  r = mDatabase.ra
b190: 77 51 75 65 72 79 28 22 53 45 4c 45 43 54 20 69  wQuery("SELECT i
b1a0: 2c 6a 20 46 52 4f 4d 20 74 65 73 74 22 2c 20 6e  ,j FROM test", n
b1b0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ull);.        as
b1c0: 73 65 72 74 4e 6f 74 4e 75 6c 6c 28 63 75 72 73  sertNotNull(curs
b1d0: 6f 72 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  or);.        ass
b1e0: 65 72 74 45 71 75 61 6c 73 28 32 2c 20 63 75 72  ertEquals(2, cur
b1f0: 73 6f 72 2e 67 65 74 43 6f 75 6e 74 28 29 29 3b  sor.getCount());
b200: 0a 20 20 20 20 20 20 20 20 63 75 72 73 6f 72 2e  .        cursor.
b210: 6d 6f 76 65 54 6f 4e 65 78 74 28 29 3b 0a 20 20  moveToNext();.  
b220: 20 20 20 20 20 20 61 73 73 65 72 74 45 71 75 61        assertEqua
b230: 6c 73 28 31 2c 20 63 75 72 73 6f 72 2e 67 65 74  ls(1, cursor.get
b240: 49 6e 74 28 30 29 29 3b 0a 20 20 20 20 20 20 20  Int(0));.       
b250: 20 61 73 73 65 72 74 45 71 75 61 6c 73 28 32 2c   assertEquals(2,
b260: 20 63 75 72 73 6f 72 2e 67 65 74 49 6e 74 28 31   cursor.getInt(1
b270: 29 29 3b 0a 20 20 20 20 20 20 20 20 63 75 72 73  ));.        curs
b280: 6f 72 2e 6d 6f 76 65 54 6f 4e 65 78 74 28 29 3b  or.moveToNext();
b290: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 45  .        assertE
b2a0: 71 75 61 6c 73 28 33 2c 20 63 75 72 73 6f 72 2e  quals(3, cursor.
b2b0: 67 65 74 49 6e 74 28 30 29 29 3b 0a 20 20 20 20  getInt(0));.    
b2c0: 20 20 20 20 61 73 73 65 72 74 45 71 75 61 6c 73      assertEquals
b2d0: 28 34 2c 20 63 75 72 73 6f 72 2e 67 65 74 49 6e  (4, cursor.getIn
b2e0: 74 28 31 29 29 3b 0a 20 20 20 20 20 20 20 20 63  t(1));.        c
b2f0: 75 72 73 6f 72 2e 63 6c 6f 73 65 28 29 3b 0a 0a  ursor.close();..
b300: 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 53 74          SQLiteSt
b310: 61 74 65 6d 65 6e 74 20 64 65 6c 65 74 65 53 74  atement deleteSt
b320: 61 74 65 6d 65 6e 74 20 3d 20 6d 44 61 74 61 62  atement = mDatab
b330: 61 73 65 2e 63 6f 6d 70 69 6c 65 53 74 61 74 65  ase.compileState
b340: 6d 65 6e 74 28 22 44 45 4c 45 54 45 20 46 52 4f  ment("DELETE FRO
b350: 4d 20 74 65 73 74 22 29 3b 0a 20 20 20 20 20 20  M test");.      
b360: 20 20 64 65 6c 65 74 65 53 74 61 74 65 6d 65 6e    deleteStatemen
b370: 74 2e 65 78 65 63 75 74 65 28 29 3b 0a 20 20 20  t.execute();.   
b380: 20 20 20 20 20 64 65 6c 65 74 65 53 74 61 74 65       deleteState
b390: 6d 65 6e 74 2e 63 6c 6f 73 65 28 29 3b 0a 20 20  ment.close();.  
b3a0: 20 20 7d 0a 0a 20 20 20 20 70 75 62 6c 69 63 20    }..    public 
b3b0: 76 6f 69 64 20 74 65 73 74 53 63 68 65 6d 61 43  void testSchemaC
b3c0: 68 61 6e 67 65 73 4e 65 77 54 61 62 6c 65 28 29  hangesNewTable()
b3d0: 20 7b 0a 20 20 20 20 20 20 20 20 6d 44 61 74 61   {.        mData
b3e0: 62 61 73 65 2e 65 78 65 63 53 51 4c 28 22 43 52  base.execSQL("CR
b3f0: 45 41 54 45 20 54 41 42 4c 45 20 74 65 73 74 20  EATE TABLE test 
b400: 28 69 20 49 4e 54 2c 20 6a 20 49 4e 54 29 3b 22  (i INT, j INT);"
b410: 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 61  );..        // a
b420: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 2c  t the beginning,
b430: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 72 65 63   there is no rec
b440: 6f 72 64 20 69 6e 20 74 68 65 20 64 61 74 61 62  ord in the datab
b450: 61 73 65 2e 0a 20 20 20 20 20 20 20 20 43 75 72  ase..        Cur
b460: 73 6f 72 20 63 75 72 73 6f 72 20 3d 20 6d 44 61  sor cursor = mDa
b470: 74 61 62 61 73 65 2e 72 61 77 51 75 65 72 79 28  tabase.rawQuery(
b480: 22 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74  "SELECT * FROM t
b490: 65 73 74 22 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20  est", null);.   
b4a0: 20 20 20 20 20 61 73 73 65 72 74 4e 6f 74 4e 75       assertNotNu
b4b0: 6c 6c 28 63 75 72 73 6f 72 29 3b 0a 20 20 20 20  ll(cursor);.    
b4c0: 20 20 20 20 61 73 73 65 72 74 45 71 75 61 6c 73      assertEquals
b4d0: 28 30 2c 20 63 75 72 73 6f 72 2e 67 65 74 43 6f  (0, cursor.getCo
b4e0: 75 6e 74 28 29 29 3b 0a 20 20 20 20 20 20 20 20  unt());.        
b4f0: 63 75 72 73 6f 72 2e 63 6c 6f 73 65 28 29 3b 0a  cursor.close();.
b500: 0a 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 20  .        String 
b510: 73 71 6c 20 3d 20 22 49 4e 53 45 52 54 20 49 4e  sql = "INSERT IN
b520: 54 4f 20 74 65 73 74 20 56 41 4c 55 45 53 20 28  TO test VALUES (
b530: 3f 2c 20 3f 29 3b 22 3b 0a 20 20 20 20 20 20 20  ?, ?);";.       
b540: 20 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74   SQLiteStatement
b550: 20 69 6e 73 65 72 74 53 74 61 74 65 6d 65 6e 74   insertStatement
b560: 20 3d 20 6d 44 61 74 61 62 61 73 65 2e 63 6f 6d   = mDatabase.com
b570: 70 69 6c 65 53 74 61 74 65 6d 65 6e 74 28 73 71  pileStatement(sq
b580: 6c 29 3b 0a 20 20 20 20 20 20 20 20 44 61 74 61  l);.        Data
b590: 62 61 73 65 55 74 69 6c 73 2e 62 69 6e 64 4f 62  baseUtils.bindOb
b5a0: 6a 65 63 74 54 6f 50 72 6f 67 72 61 6d 28 69 6e  jectToProgram(in
b5b0: 73 65 72 74 53 74 61 74 65 6d 65 6e 74 2c 20 31  sertStatement, 1
b5c0: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 44 61  , 1);.        Da
b5d0: 74 61 62 61 73 65 55 74 69 6c 73 2e 62 69 6e 64  tabaseUtils.bind
b5e0: 4f 62 6a 65 63 74 54 6f 50 72 6f 67 72 61 6d 28  ObjectToProgram(
b5f0: 69 6e 73 65 72 74 53 74 61 74 65 6d 65 6e 74 2c  insertStatement,
b600: 20 32 2c 20 32 29 3b 0a 20 20 20 20 20 20 20 20   2, 2);.        
b610: 69 6e 73 65 72 74 53 74 61 74 65 6d 65 6e 74 2e  insertStatement.
b620: 65 78 65 63 75 74 65 28 29 3b 0a 20 20 20 20 20  execute();.     
b630: 20 20 20 69 6e 73 65 72 74 53 74 61 74 65 6d 65     insertStateme
b640: 6e 74 2e 63 6c 6f 73 65 28 29 3b 0a 0a 20 20 20  nt.close();..   
b650: 20 20 20 20 20 2f 2f 20 72 65 61 64 20 74 68 65       // read the
b660: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 74   data from the t
b670: 61 62 6c 65 20 61 6e 64 20 6d 61 6b 65 20 73 75  able and make su
b680: 72 65 20 69 74 20 69 73 20 63 6f 72 72 65 63 74  re it is correct
b690: 0a 20 20 20 20 20 20 20 20 63 75 72 73 6f 72 20  .        cursor 
b6a0: 3d 20 6d 44 61 74 61 62 61 73 65 2e 72 61 77 51  = mDatabase.rawQ
b6b0: 75 65 72 79 28 22 53 45 4c 45 43 54 20 69 2c 6a  uery("SELECT i,j
b6c0: 20 46 52 4f 4d 20 74 65 73 74 22 2c 20 6e 75 6c   FROM test", nul
b6d0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  l);.        asse
b6e0: 72 74 4e 6f 74 4e 75 6c 6c 28 63 75 72 73 6f 72  rtNotNull(cursor
b6f0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
b700: 74 45 71 75 61 6c 73 28 31 2c 20 63 75 72 73 6f  tEquals(1, curso
b710: 72 2e 67 65 74 43 6f 75 6e 74 28 29 29 3b 0a 20  r.getCount());. 
b720: 20 20 20 20 20 20 20 63 75 72 73 6f 72 2e 6d 6f         cursor.mo
b730: 76 65 54 6f 4e 65 78 74 28 29 3b 0a 20 20 20 20  veToNext();.    
b740: 20 20 20 20 61 73 73 65 72 74 45 71 75 61 6c 73      assertEquals
b750: 28 31 2c 20 63 75 72 73 6f 72 2e 67 65 74 49 6e  (1, cursor.getIn
b760: 74 28 30 29 29 3b 0a 20 20 20 20 20 20 20 20 61  t(0));.        a
b770: 73 73 65 72 74 45 71 75 61 6c 73 28 32 2c 20 63  ssertEquals(2, c
b780: 75 72 73 6f 72 2e 67 65 74 49 6e 74 28 31 29 29  ursor.getInt(1))
b790: 3b 0a 20 20 20 20 20 20 20 20 63 75 72 73 6f 72  ;.        cursor
b7a0: 2e 63 6c 6f 73 65 28 29 3b 0a 0a 20 20 20 20 20  .close();..     
b7b0: 20 20 20 2f 2f 20 61 6c 74 65 72 20 74 68 65 20     // alter the 
b7c0: 74 61 62 6c 65 20 61 6e 64 20 65 78 65 63 75 74  table and execut
b7d0: 65 20 61 6e 6f 74 68 65 72 20 73 74 61 74 65 6d  e another statem
b7e0: 65 6e 74 0a 20 20 20 20 20 20 20 20 6d 44 61 74  ent.        mDat
b7f0: 61 62 61 73 65 2e 65 78 65 63 53 51 4c 28 22 43  abase.execSQL("C
b800: 52 45 41 54 45 20 54 41 42 4c 45 20 74 65 73 74  REATE TABLE test
b810: 5f 6e 65 77 20 28 69 20 49 4e 54 2c 20 6a 20 49  _new (i INT, j I
b820: 4e 54 2c 20 6b 20 49 4e 54 29 3b 22 29 3b 0a 20  NT, k INT);");. 
b830: 20 20 20 20 20 20 20 73 71 6c 20 3d 20 22 49 4e         sql = "IN
b840: 53 45 52 54 20 49 4e 54 4f 20 74 65 73 74 5f 6e  SERT INTO test_n
b850: 65 77 20 56 41 4c 55 45 53 20 28 3f 2c 20 3f 2c  ew VALUES (?, ?,
b860: 20 3f 29 3b 22 3b 0a 20 20 20 20 20 20 20 20 69   ?);";.        i
b870: 6e 73 65 72 74 53 74 61 74 65 6d 65 6e 74 20 3d  nsertStatement =
b880: 20 6d 44 61 74 61 62 61 73 65 2e 63 6f 6d 70 69   mDatabase.compi
b890: 6c 65 53 74 61 74 65 6d 65 6e 74 28 73 71 6c 29  leStatement(sql)
b8a0: 3b 0a 20 20 20 20 20 20 20 20 44 61 74 61 62 61  ;.        Databa
b8b0: 73 65 55 74 69 6c 73 2e 62 69 6e 64 4f 62 6a 65  seUtils.bindObje
b8c0: 63 74 54 6f 50 72 6f 67 72 61 6d 28 69 6e 73 65  ctToProgram(inse
b8d0: 72 74 53 74 61 74 65 6d 65 6e 74 2c 20 31 2c 20  rtStatement, 1, 
b8e0: 33 29 3b 0a 20 20 20 20 20 20 20 20 44 61 74 61  3);.        Data
b8f0: 62 61 73 65 55 74 69 6c 73 2e 62 69 6e 64 4f 62  baseUtils.bindOb
b900: 6a 65 63 74 54 6f 50 72 6f 67 72 61 6d 28 69 6e  jectToProgram(in
b910: 73 65 72 74 53 74 61 74 65 6d 65 6e 74 2c 20 32  sertStatement, 2
b920: 2c 20 34 29 3b 0a 20 20 20 20 20 20 20 20 44 61  , 4);.        Da
b930: 74 61 62 61 73 65 55 74 69 6c 73 2e 62 69 6e 64  tabaseUtils.bind
b940: 4f 62 6a 65 63 74 54 6f 50 72 6f 67 72 61 6d 28  ObjectToProgram(
b950: 69 6e 73 65 72 74 53 74 61 74 65 6d 65 6e 74 2c  insertStatement,
b960: 20 33 2c 20 35 29 3b 0a 20 20 20 20 20 20 20 20   3, 5);.        
b970: 69 6e 73 65 72 74 53 74 61 74 65 6d 65 6e 74 2e  insertStatement.
b980: 65 78 65 63 75 74 65 28 29 3b 0a 20 20 20 20 20  execute();.     
b990: 20 20 20 69 6e 73 65 72 74 53 74 61 74 65 6d 65     insertStateme
b9a0: 6e 74 2e 63 6c 6f 73 65 28 29 3b 0a 0a 20 20 20  nt.close();..   
b9b0: 20 20 20 20 20 2f 2f 20 72 65 61 64 20 74 68 65       // read the
b9c0: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 74   data from the t
b9d0: 61 62 6c 65 20 61 6e 64 20 6d 61 6b 65 20 73 75  able and make su
b9e0: 72 65 20 69 74 20 69 73 20 63 6f 72 72 65 63 74  re it is correct
b9f0: 0a 20 20 20 20 20 20 20 20 63 75 72 73 6f 72 20  .        cursor 
ba00: 3d 20 6d 44 61 74 61 62 61 73 65 2e 72 61 77 51  = mDatabase.rawQ
ba10: 75 65 72 79 28 22 53 45 4c 45 43 54 20 69 2c 6a  uery("SELECT i,j
ba20: 2c 6b 20 46 52 4f 4d 20 74 65 73 74 5f 6e 65 77  ,k FROM test_new
ba30: 22 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  ", null);.      
ba40: 20 20 61 73 73 65 72 74 4e 6f 74 4e 75 6c 6c 28    assertNotNull(
ba50: 63 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20  cursor);.       
ba60: 20 61 73 73 65 72 74 45 71 75 61 6c 73 28 31 2c   assertEquals(1,
ba70: 20 63 75 72 73 6f 72 2e 67 65 74 43 6f 75 6e 74   cursor.getCount
ba80: 28 29 29 3b 0a 20 20 20 20 20 20 20 20 63 75 72  ());.        cur
ba90: 73 6f 72 2e 6d 6f 76 65 54 6f 4e 65 78 74 28 29  sor.moveToNext()
baa0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
bab0: 45 71 75 61 6c 73 28 33 2c 20 63 75 72 73 6f 72  Equals(3, cursor
bac0: 2e 67 65 74 49 6e 74 28 30 29 29 3b 0a 20 20 20  .getInt(0));.   
bad0: 20 20 20 20 20 61 73 73 65 72 74 45 71 75 61 6c       assertEqual
bae0: 73 28 34 2c 20 63 75 72 73 6f 72 2e 67 65 74 49  s(4, cursor.getI
baf0: 6e 74 28 31 29 29 3b 0a 20 20 20 20 20 20 20 20  nt(1));.        
bb00: 61 73 73 65 72 74 45 71 75 61 6c 73 28 35 2c 20  assertEquals(5, 
bb10: 63 75 72 73 6f 72 2e 67 65 74 49 6e 74 28 32 29  cursor.getInt(2)
bb20: 29 3b 0a 20 20 20 20 20 20 20 20 63 75 72 73 6f  );.        curso
bb30: 72 2e 63 6c 6f 73 65 28 29 3b 0a 0a 20 20 20 20  r.close();..    
bb40: 20 20 20 20 2f 2f 20 6d 61 6b 65 20 73 75 72 65      // make sure
bb50: 20 74 68 65 20 6f 6c 64 20 73 74 61 74 65 6d 65   the old stateme
bb60: 6e 74 20 2d 20 77 68 69 63 68 20 73 68 6f 75 6c  nt - which shoul
bb70: 64 20 2a 74 72 79 20 74 6f 20 72 65 75 73 65 2a  d *try to reuse*
bb80: 20 63 61 63 68 65 64 20 71 75 65 72 79 20 70 6c   cached query pl
bb90: 61 6e 20 2d 0a 20 20 20 20 20 20 20 20 2f 2f 20  an -.        // 
bba0: 73 74 69 6c 6c 20 77 6f 72 6b 73 0a 20 20 20 20  still works.    
bbb0: 20 20 20 20 63 75 72 73 6f 72 20 3d 20 6d 44 61      cursor = mDa
bbc0: 74 61 62 61 73 65 2e 72 61 77 51 75 65 72 79 28  tabase.rawQuery(
bbd0: 22 53 45 4c 45 43 54 20 69 2c 6a 20 46 52 4f 4d  "SELECT i,j FROM
bbe0: 20 74 65 73 74 22 2c 20 6e 75 6c 6c 29 3b 0a 20   test", null);. 
bbf0: 20 20 20 20 20 20 20 61 73 73 65 72 74 4e 6f 74         assertNot
bc00: 4e 75 6c 6c 28 63 75 72 73 6f 72 29 3b 0a 20 20  Null(cursor);.  
bc10: 20 20 20 20 20 20 61 73 73 65 72 74 45 71 75 61        assertEqua
bc20: 6c 73 28 31 2c 20 63 75 72 73 6f 72 2e 67 65 74  ls(1, cursor.get
bc30: 43 6f 75 6e 74 28 29 29 3b 0a 20 20 20 20 20 20  Count());.      
bc40: 20 20 63 75 72 73 6f 72 2e 6d 6f 76 65 54 6f 4e    cursor.moveToN
bc50: 65 78 74 28 29 3b 0a 20 20 20 20 20 20 20 20 61  ext();.        a
bc60: 73 73 65 72 74 45 71 75 61 6c 73 28 31 2c 20 63  ssertEquals(1, c
bc70: 75 72 73 6f 72 2e 67 65 74 49 6e 74 28 30 29 29  ursor.getInt(0))
bc80: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
bc90: 45 71 75 61 6c 73 28 32 2c 20 63 75 72 73 6f 72  Equals(2, cursor
bca0: 2e 67 65 74 49 6e 74 28 31 29 29 3b 0a 20 20 20  .getInt(1));.   
bcb0: 20 20 20 20 20 63 75 72 73 6f 72 2e 63 6c 6f 73       cursor.clos
bcc0: 65 28 29 3b 0a 0a 20 20 20 20 20 20 20 20 53 51  e();..        SQ
bcd0: 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 64 65  LiteStatement de
bce0: 6c 65 74 65 53 74 61 74 65 6d 65 6e 74 20 3d 20  leteStatement = 
bcf0: 6d 44 61 74 61 62 61 73 65 2e 63 6f 6d 70 69 6c  mDatabase.compil
bd00: 65 53 74 61 74 65 6d 65 6e 74 28 22 44 45 4c 45  eStatement("DELE
bd10: 54 45 20 46 52 4f 4d 20 74 65 73 74 22 29 3b 0a  TE FROM test");.
bd20: 20 20 20 20 20 20 20 20 64 65 6c 65 74 65 53 74          deleteSt
bd30: 61 74 65 6d 65 6e 74 2e 65 78 65 63 75 74 65 28  atement.execute(
bd40: 29 3b 0a 20 20 20 20 20 20 20 20 64 65 6c 65 74  );.        delet
bd50: 65 53 74 61 74 65 6d 65 6e 74 2e 63 6c 6f 73 65  eStatement.close
bd60: 28 29 3b 0a 0a 20 20 20 20 20 20 20 20 53 51 4c  ();..        SQL
bd70: 69 74 65 53 74 61 74 65 6d 65 6e 74 20 64 65 6c  iteStatement del
bd80: 65 74 65 53 74 61 74 65 6d 65 6e 74 32 20 3d 20  eteStatement2 = 
bd90: 6d 44 61 74 61 62 61 73 65 2e 63 6f 6d 70 69 6c  mDatabase.compil
bda0: 65 53 74 61 74 65 6d 65 6e 74 28 22 44 45 4c 45  eStatement("DELE
bdb0: 54 45 20 46 52 4f 4d 20 74 65 73 74 5f 6e 65 77  TE FROM test_new
bdc0: 22 29 3b 0a 20 20 20 20 20 20 20 20 64 65 6c 65  ");.        dele
bdd0: 74 65 53 74 61 74 65 6d 65 6e 74 32 2e 65 78 65  teStatement2.exe
bde0: 63 75 74 65 28 29 3b 0a 20 20 20 20 20 20 20 20  cute();.        
bdf0: 64 65 6c 65 74 65 53 74 61 74 65 6d 65 6e 74 32  deleteStatement2
be00: 2e 63 6c 6f 73 65 28 29 3b 0a 20 20 20 20 7d 0a  .close();.    }.
be10: 0a 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64  .    public void
be20: 20 74 65 73 74 53 63 68 65 6d 61 43 68 61 6e 67   testSchemaChang
be30: 65 73 44 72 6f 70 54 61 62 6c 65 28 29 20 7b 0a  esDropTable() {.
be40: 20 20 20 20 20 20 20 20 6d 44 61 74 61 62 61 73          mDatabas
be50: 65 2e 65 78 65 63 53 51 4c 28 22 43 52 45 41 54  e.execSQL("CREAT
be60: 45 20 54 41 42 4c 45 20 74 65 73 74 20 28 69 20  E TABLE test (i 
be70: 49 4e 54 2c 20 6a 20 49 4e 54 29 3b 22 29 3b 0a  INT, j INT);");.
be80: 0a 20 20 20 20 20 20 20 20 2f 2f 20 61 74 20 74  .        // at t
be90: 68 65 20 62 65 67 69 6e 6e 69 6e 67 2c 20 74 68  he beginning, th
bea0: 65 72 65 20 69 73 20 6e 6f 20 72 65 63 6f 72 64  ere is no record
beb0: 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
bec0: 2e 0a 20 20 20 20 20 20 20 20 43 75 72 73 6f 72  ..        Cursor
bed0: 20 63 75 72 73 6f 72 20 3d 20 6d 44 61 74 61 62   cursor = mDatab
bee0: 61 73 65 2e 72 61 77 51 75 65 72 79 28 22 53 45  ase.rawQuery("SE
bef0: 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 65 73 74  LECT * FROM test
bf00: 22 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  ", null);.      
bf10: 20 20 61 73 73 65 72 74 4e 6f 74 4e 75 6c 6c 28    assertNotNull(
bf20: 63 75 72 73 6f 72 29 3b 0a 20 20 20 20 20 20 20  cursor);.       
bf30: 20 61 73 73 65 72 74 45 71 75 61 6c 73 28 30 2c   assertEquals(0,
bf40: 20 63 75 72 73 6f 72 2e 67 65 74 43 6f 75 6e 74   cursor.getCount
bf50: 28 29 29 3b 0a 20 20 20 20 20 20 20 20 63 75 72  ());.        cur
bf60: 73 6f 72 2e 63 6c 6f 73 65 28 29 3b 0a 0a 20 20  sor.close();..  
bf70: 20 20 20 20 20 20 53 74 72 69 6e 67 20 73 71 6c        String sql
bf80: 20 3d 20 22 49 4e 53 45 52 54 20 49 4e 54 4f 20   = "INSERT INTO 
bf90: 74 65 73 74 20 56 41 4c 55 45 53 20 28 3f 2c 20  test VALUES (?, 
bfa0: 3f 29 3b 22 3b 0a 20 20 20 20 20 20 20 20 53 51  ?);";.        SQ
bfb0: 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 69 6e  LiteStatement in
bfc0: 73 65 72 74 53 74 61 74 65 6d 65 6e 74 20 3d 20  sertStatement = 
bfd0: 6d 44 61 74 61 62 61 73 65 2e 63 6f 6d 70 69 6c  mDatabase.compil
bfe0: 65 53 74 61 74 65 6d 65 6e 74 28 73 71 6c 29 3b  eStatement(sql);
bff0: 0a 20 20 20 20 20 20 20 20 44 61 74 61 62 61 73  .        Databas
c000: 65 55 74 69 6c 73 2e 62 69 6e 64 4f 62 6a 65 63  eUtils.bindObjec
c010: 74 54 6f 50 72 6f 67 72 61 6d 28 69 6e 73 65 72  tToProgram(inser
c020: 74 53 74 61 74 65 6d 65 6e 74 2c 20 31 2c 20 31  tStatement, 1, 1
c030: 29 3b 0a 20 20 20 20 20 20 20 20 44 61 74 61 62  );.        Datab
c040: 61 73 65 55 74 69 6c 73 2e 62 69 6e 64 4f 62 6a  aseUtils.bindObj
c050: 65 63 74 54 6f 50 72 6f 67 72 61 6d 28 69 6e 73  ectToProgram(ins
c060: 65 72 74 53 74 61 74 65 6d 65 6e 74 2c 20 32 2c  ertStatement, 2,
c070: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 73   2);.        ins
c080: 65 72 74 53 74 61 74 65 6d 65 6e 74 2e 65 78 65  ertStatement.exe
c090: 63 75 74 65 28 29 3b 0a 20 20 20 20 20 20 20 20  cute();.        
c0a0: 69 6e 73 65 72 74 53 74 61 74 65 6d 65 6e 74 2e  insertStatement.
c0b0: 63 6c 6f 73 65 28 29 3b 0a 0a 20 20 20 20 20 20  close();..      
c0c0: 20 20 2f 2f 20 72 65 61 64 20 74 68 65 20 64 61    // read the da
c0d0: 74 61 20 66 72 6f 6d 20 74 68 65 20 74 61 62 6c  ta from the tabl
c0e0: 65 20 61 6e 64 20 6d 61 6b 65 20 73 75 72 65 20  e and make sure 
c0f0: 69 74 20 69 73 20 63 6f 72 72 65 63 74 0a 20 20  it is correct.  
c100: 20 20 20 20 20 20 63 75 72 73 6f 72 20 3d 20 6d        cursor = m
c110: 44 61 74 61 62 61 73 65 2e 72 61 77 51 75 65 72  Database.rawQuer
c120: 79 28 22 53 45 4c 45 43 54 20 69 2c 6a 20 46 52  y("SELECT i,j FR
c130: 4f 4d 20 74 65 73 74 22 2c 20 6e 75 6c 6c 29 3b  OM test", null);
c140: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 4e  .        assertN
c150: 6f 74 4e 75 6c 6c 28 63 75 72 73 6f 72 29 3b 0a  otNull(cursor);.
c160: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 45 71          assertEq
c170: 75 61 6c 73 28 31 2c 20 63 75 72 73 6f 72 2e 67  uals(1, cursor.g
c180: 65 74 43 6f 75 6e 74 28 29 29 3b 0a 20 20 20 20  etCount());.    
c190: 20 20 20 20 63 75 72 73 6f 72 2e 6d 6f 76 65 54      cursor.moveT
c1a0: 6f 4e 65 78 74 28 29 3b 0a 20 20 20 20 20 20 20  oNext();.       
c1b0: 20 61 73 73 65 72 74 45 71 75 61 6c 73 28 31 2c   assertEquals(1,
c1c0: 20 63 75 72 73 6f 72 2e 67 65 74 49 6e 74 28 30   cursor.getInt(0
c1d0: 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ));.        asse
c1e0: 72 74 45 71 75 61 6c 73 28 32 2c 20 63 75 72 73  rtEquals(2, curs
c1f0: 6f 72 2e 67 65 74 49 6e 74 28 31 29 29 3b 0a 20  or.getInt(1));. 
c200: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20     }..    /**.  
c210: 20 20 20 2a 20 57 69 74 68 20 73 71 6c 69 74 65     * With sqlite
c220: 27 73 20 77 72 69 74 65 2d 61 68 65 61 64 2d 6c  's write-ahead-l
c230: 6f 67 67 69 6e 67 20 28 57 41 4c 29 20 65 6e 61  ogging (WAL) ena
c240: 62 6c 65 64 2c 20 72 65 61 64 65 72 73 20 67 65  bled, readers ge
c250: 74 20 6f 6c 64 20 76 65 72 73 69 6f 6e 20 6f 66  t old version of
c260: 20 64 61 74 61 0a 20 20 20 20 20 2a 20 66 72 6f   data.     * fro
c270: 6d 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  m the table that
c280: 20 61 20 77 72 69 74 65 72 20 69 73 20 6d 6f 64   a writer is mod
c290: 69 66 79 69 6e 67 20 61 74 20 74 68 65 20 73 61  ifying at the sa
c2a0: 6d 65 20 74 69 6d 65 2e 0a 20 20 20 20 20 2a 20  me time..     * 
c2b0: 3c 70 3e 0a 20 20 20 20 20 2a 20 54 68 69 73 20  <p>.     * This 
c2c0: 6d 65 74 68 6f 64 20 64 6f 65 73 20 74 68 65 20  method does the 
c2d0: 66 6f 6c 6c 6f 77 69 6e 67 20 74 6f 20 74 65 73  following to tes
c2e0: 74 20 74 68 69 73 20 73 71 6c 69 74 65 33 20 66  t this sqlite3 f
c2f0: 65 61 74 75 72 65 0a 20 20 20 20 20 2a 20 3c 6f  eature.     * <o
c300: 6c 3e 0a 20 20 20 20 20 2a 20 20 20 3c 6c 69 3e  l>.     *   <li>
c310: 63 72 65 61 74 65 73 20 61 20 74 61 62 6c 65 20  creates a table 
c320: 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20  in the database 
c330: 61 6e 64 20 70 6f 70 75 6c 61 74 65 73 20 69 74  and populates it
c340: 20 77 69 74 68 20 35 20 72 6f 77 73 20 6f 66 20   with 5 rows of 
c350: 64 61 74 61 3c 2f 6c 69 3e 0a 20 20 20 20 20 2a  data</li>.     *
c360: 20 20 20 3c 6c 69 3e 64 6f 20 22 73 65 6c 65 63     <li>do "selec
c370: 74 20 63 6f 75 6e 74 28 2a 29 20 66 72 6f 6d 20  t count(*) from 
c380: 74 68 69 73 5f 74 61 62 6c 65 22 20 61 6e 64 20  this_table" and 
c390: 65 78 70 65 63 74 20 74 6f 20 72 65 63 65 69 76  expect to receiv
c3a0: 65 20 35 3c 2f 6c 69 3e 0a 20 20 20 20 20 2a 20  e 5</li>.     * 
c3b0: 20 20 3c 6c 69 3e 73 74 61 72 74 20 61 20 77 72    <li>start a wr
c3c0: 69 74 65 72 20 74 68 72 65 61 64 20 77 68 6f 20  iter thread who 
c3d0: 42 45 47 49 4e 73 20 61 20 74 72 61 6e 73 61 63  BEGINs a transac
c3e0: 74 69 6f 6e 2c 20 49 4e 53 45 52 54 73 20 61 20  tion, INSERTs a 
c3f0: 73 69 6e 67 6c 65 20 72 6f 77 0a 20 20 20 20 20  single row.     
c400: 2a 20 20 20 69 6e 74 6f 20 74 68 69 73 5f 74 61  *   into this_ta
c410: 62 6c 65 3c 2f 6c 69 3e 0a 20 20 20 20 20 2a 20  ble</li>.     * 
c420: 20 20 3c 6c 69 3e 77 72 69 74 65 72 20 73 74 6f    <li>writer sto
c430: 70 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ps the transacti
c440: 6f 6e 20 61 74 20 74 68 69 73 20 70 6f 69 6e 74  on at this point
c450: 2c 20 6b 69 63 6b 73 20 6f 66 66 20 61 20 72 65  , kicks off a re
c460: 61 64 65 72 20 74 68 72 65 61 64 20 2d 20 77 68  ader thread - wh
c470: 69 63 68 20 77 69 6c 6c 0a 20 20 20 20 20 2a 20  ich will.     * 
c480: 20 20 20 20 20 20 64 6f 20 20 74 68 65 20 61 62        do  the ab
c490: 6f 76 65 20 53 45 4c 45 43 54 20 71 75 65 72 79  ove SELECT query
c4a0: 3a 20 22 73 65 6c 65 63 74 20 63 6f 75 6e 74 28  : "select count(
c4b0: 2a 29 20 66 72 6f 6d 20 74 68 69 73 5f 74 61 62  *) from this_tab
c4c0: 6c 65 22 3c 2f 6c 69 3e 0a 20 20 20 20 20 2a 20  le"</li>.     * 
c4d0: 20 20 3c 6c 69 3e 74 68 69 73 20 71 75 65 72 79    <li>this query
c4e0: 20 73 68 6f 75 6c 64 20 72 65 74 75 72 6e 20 76   should return v
c4f0: 61 6c 75 65 20 35 20 2d 20 62 65 63 61 75 73 65  alue 5 - because
c500: 20 77 72 69 74 65 72 20 69 73 20 73 74 69 6c 6c   writer is still
c510: 20 69 6e 20 74 72 61 6e 73 61 63 74 69 6f 6e 20   in transaction 
c520: 61 6e 64 0a 20 20 20 20 20 2a 20 20 20 20 73 71  and.     *    sq
c530: 6c 69 74 65 20 72 65 74 75 72 6e 73 20 4f 4c 44  lite returns OLD
c540: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
c550: 64 61 74 61 3c 2f 6c 69 3e 0a 20 20 20 20 20 2a  data</li>.     *
c560: 20 20 20 3c 6c 69 3e 77 72 69 74 65 72 20 65 6e     <li>writer en
c570: 64 73 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  ds the transacti
c580: 6f 6e 2c 20 74 68 75 73 20 6d 61 6b 69 6e 67 20  on, thus making 
c590: 74 68 65 20 65 78 74 72 61 20 72 6f 77 20 6e 6f  the extra row no
c5a0: 77 20 76 69 73 69 62 6c 65 20 74 6f 20 65 76 65  w visible to eve
c5b0: 72 79 6f 6e 65 3c 2f 6c 69 3e 0a 20 20 20 20 20  ryone</li>.     
c5c0: 2a 20 20 20 3c 6c 69 3e 72 65 61 64 65 72 20 69  *   <li>reader i
c5d0: 73 20 6b 69 63 6b 65 64 20 6f 66 66 20 61 67 61  s kicked off aga
c5e0: 69 6e 20 74 6f 20 64 6f 20 74 68 65 20 73 61 6d  in to do the sam
c5f0: 65 20 71 75 65 72 79 2e 20 74 68 69 73 20 74 69  e query. this ti
c600: 6d 65 20 71 75 65 72 79 20 73 68 6f 75 6c 64 0a  me query should.
c610: 20 20 20 20 20 2a 20 20 20 72 65 74 75 72 6e 20       *   return 
c620: 76 61 6c 75 65 20 3d 20 36 20 77 68 69 63 68 20  value = 6 which 
c630: 69 6e 63 6c 75 64 65 73 20 74 68 65 20 6e 65 77  includes the new
c640: 6c 79 20 69 6e 73 65 72 74 65 64 20 72 6f 77 20  ly inserted row 
c650: 69 6e 74 6f 20 74 68 69 73 5f 74 61 62 6c 65 2e  into this_table.
c660: 3c 2f 6c 69 3e 0a 20 20 20 20 20 2a 3c 2f 70 3e  </li>.     *</p>
c670: 0a 20 20 20 20 20 2a 20 40 74 68 72 6f 77 73 20  .     * @throws 
c680: 49 6e 74 65 72 72 75 70 74 65 64 45 78 63 65 70  InterruptedExcep
c690: 74 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  tion.     */.   
c6a0: 20 40 4c 61 72 67 65 54 65 73 74 0a 20 20 20 20   @LargeTest.    
c6b0: 70 75 62 6c 69 63 20 76 6f 69 64 20 74 65 73 74  public void test
c6c0: 52 65 61 64 65 72 47 65 74 73 4f 6c 64 56 65 72  ReaderGetsOldVer
c6d0: 73 69 6f 6e 4f 66 44 61 74 61 57 68 65 6e 57 72  sionOfDataWhenWr
c6e0: 69 74 65 72 49 73 49 6e 58 61 63 74 28 29 20 74  iterIsInXact() t
c6f0: 68 72 6f 77 73 20 49 6e 74 65 72 72 75 70 74 65  hrows Interrupte
c700: 64 45 78 63 65 70 74 69 6f 6e 20 7b 0a 20 20 20  dException {.   
c710: 20 20 20 20 20 2f 2f 20 72 65 64 6f 20 73 65 74       // redo set
c720: 75 70 20 74 6f 20 63 72 65 61 74 65 20 57 41 4c  up to create WAL
c730: 20 65 6e 61 62 6c 65 64 20 64 61 74 61 62 61 73   enabled databas
c740: 65 0a 20 20 20 20 20 20 20 20 6d 44 61 74 61 62  e.        mDatab
c750: 61 73 65 2e 63 6c 6f 73 65 28 29 3b 0a 20 20 20  ase.close();.   
c760: 20 20 20 20 20 6e 65 77 20 46 69 6c 65 28 6d 44       new File(mD
c770: 61 74 61 62 61 73 65 2e 67 65 74 50 61 74 68 28  atabase.getPath(
c780: 29 29 2e 64 65 6c 65 74 65 28 29 3b 0a 20 20 20  )).delete();.   
c790: 20 20 20 20 20 6d 44 61 74 61 62 61 73 65 20 3d       mDatabase =
c7a0: 20 53 51 4c 69 74 65 44 61 74 61 62 61 73 65 2e   SQLiteDatabase.
c7b0: 6f 70 65 6e 4f 72 43 72 65 61 74 65 44 61 74 61  openOrCreateData
c7c0: 62 61 73 65 28 6d 44 61 74 61 62 61 73 65 46 69  base(mDatabaseFi
c7d0: 6c 65 2e 67 65 74 50 61 74 68 28 29 2c 20 6e 75  le.getPath(), nu
c7e0: 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20  ll, null);.     
c7f0: 20 20 20 62 6f 6f 6c 65 61 6e 20 72 73 6c 74 20     boolean rslt 
c800: 3d 20 6d 44 61 74 61 62 61 73 65 2e 65 6e 61 62  = mDatabase.enab
c810: 6c 65 57 72 69 74 65 41 68 65 61 64 4c 6f 67 67  leWriteAheadLogg
c820: 69 6e 67 28 29 3b 0a 20 20 20 20 20 20 20 20 61  ing();.        a
c830: 73 73 65 72 74 54 72 75 65 28 72 73 6c 74 29 3b  ssertTrue(rslt);
c840: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 4e  .        assertN
c850: 6f 74 4e 75 6c 6c 28 6d 44 61 74 61 62 61 73 65  otNull(mDatabase
c860: 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 63  );..        // c
c870: 72 65 61 74 65 20 61 20 6e 65 77 20 74 61 62 6c  reate a new tabl
c880: 65 20 61 6e 64 20 69 6e 73 65 72 74 20 35 20 72  e and insert 5 r
c890: 65 63 6f 72 64 73 20 69 6e 74 6f 20 69 74 2e 0a  ecords into it..
c8a0: 20 20 20 20 20 20 20 20 6d 44 61 74 61 62 61 73          mDatabas
c8b0: 65 2e 65 78 65 63 53 51 4c 28 22 43 52 45 41 54  e.execSQL("CREAT
c8c0: 45 20 54 41 42 4c 45 20 74 31 20 28 69 20 69 6e  E TABLE t1 (i in
c8d0: 74 2c 20 6a 20 69 6e 74 29 3b 22 29 3b 0a 20 20  t, j int);");.  
c8e0: 20 20 20 20 20 20 6d 44 61 74 61 62 61 73 65 2e        mDatabase.
c8f0: 62 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  beginTransaction
c900: 28 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 20  ();.        for 
c910: 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c 20  (int i = 0; i < 
c920: 35 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20  5; i++) {.      
c930: 20 20 20 20 20 20 6d 44 61 74 61 62 61 73 65 2e        mDatabase.
c940: 65 78 65 63 53 51 4c 28 22 69 6e 73 65 72 74 20  execSQL("insert 
c950: 69 6e 74 6f 20 74 31 20 76 61 6c 75 65 73 28 3f  into t1 values(?
c960: 2c 3f 29 3b 22 2c 20 6e 65 77 20 53 74 72 69 6e  ,?);", new Strin
c970: 67 5b 5d 20 7b 69 2b 22 22 2c 20 69 2b 22 22 7d  g[] {i+"", i+""}
c980: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
c990: 20 20 20 20 20 6d 44 61 74 61 62 61 73 65 2e 73       mDatabase.s
c9a0: 65 74 54 72 61 6e 73 61 63 74 69 6f 6e 53 75 63  etTransactionSuc
c9b0: 63 65 73 73 66 75 6c 28 29 3b 0a 20 20 20 20 20  cessful();.     
c9c0: 20 20 20 6d 44 61 74 61 62 61 73 65 2e 65 6e 64     mDatabase.end
c9d0: 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 0a  Transaction();..
c9e0: 20 20 20 20 20 20 20 20 2f 2f 20 6d 61 6b 65 20          // make 
c9f0: 73 75 72 65 20 61 20 72 65 61 64 65 72 20 63 61  sure a reader ca
ca00: 6e 20 72 65 61 64 20 74 68 65 20 61 62 6f 76 65  n read the above
ca10: 20 64 61 74 61 0a 20 20 20 20 20 20 20 20 52 65   data.        Re
ca20: 61 64 65 72 51 75 65 72 79 69 6e 67 44 61 74 61  aderQueryingData
ca30: 20 72 31 20 3d 20 6e 65 77 20 52 65 61 64 65 72   r1 = new Reader
ca40: 51 75 65 72 79 69 6e 67 44 61 74 61 28 35 29 3b  QueryingData(5);
ca50: 0a 20 20 20 20 20 20 20 20 72 31 2e 73 74 61 72  .        r1.star
ca60: 74 28 29 3b 0a 20 20 20 20 20 20 20 20 54 68 72  t();.        Thr
ca70: 65 61 64 2e 79 69 65 6c 64 28 29 3b 0a 20 20 20  ead.yield();.   
ca80: 20 20 20 20 20 74 72 79 20 7b 72 31 2e 6a 6f 69       try {r1.joi
ca90: 6e 28 29 3b 7d 20 63 61 74 63 68 20 28 45 78 63  n();} catch (Exc
caa0: 65 70 74 69 6f 6e 20 65 29 20 7b 7d 0a 0a 20 20  eption e) {}..  
cab0: 20 20 20 20 20 20 57 72 69 74 65 72 44 6f 69 6e        WriterDoin
cac0: 67 53 69 6e 67 6c 65 54 72 61 6e 73 61 63 74 69  gSingleTransacti
cad0: 6f 6e 20 77 20 3d 20 6e 65 77 20 57 72 69 74 65  on w = new Write
cae0: 72 44 6f 69 6e 67 53 69 6e 67 6c 65 54 72 61 6e  rDoingSingleTran
caf0: 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20 20 20 20  saction();.     
cb00: 20 20 20 77 2e 73 74 61 72 74 28 29 3b 0a 20 20     w.start();.  
cb10: 20 20 20 20 20 20 77 2e 6a 6f 69 6e 28 29 3b 0a        w.join();.
cb20: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 69 76 61      }..    priva
cb30: 74 65 20 63 6c 61 73 73 20 57 72 69 74 65 72 44  te class WriterD
cb40: 6f 69 6e 67 53 69 6e 67 6c 65 54 72 61 6e 73 61  oingSingleTransa
cb50: 63 74 69 6f 6e 20 65 78 74 65 6e 64 73 20 54 68  ction extends Th
cb60: 72 65 61 64 20 7b 0a 20 20 20 20 20 20 20 20 40  read {.        @
cb70: 4f 76 65 72 72 69 64 65 20 70 75 62 6c 69 63 20  Override public 
cb80: 76 6f 69 64 20 72 75 6e 28 29 20 7b 0a 20 20 20  void run() {.   
cb90: 20 20 20 20 20 20 20 20 20 2f 2f 20 73 74 61 72           // star
cba0: 74 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a  t a transaction.
cbb0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 44 61 74              mDat
cbc0: 61 62 61 73 65 2e 62 65 67 69 6e 54 72 61 6e 73  abase.beginTrans
cbd0: 61 63 74 69 6f 6e 4e 6f 6e 45 78 63 6c 75 73 69  actionNonExclusi
cbe0: 76 65 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ve();.          
cbf0: 20 20 6d 44 61 74 61 62 61 73 65 2e 65 78 65 63    mDatabase.exec
cc00: 53 51 4c 28 22 69 6e 73 65 72 74 20 69 6e 74 6f  SQL("insert into
cc10: 20 74 31 20 76 61 6c 75 65 73 28 3f 2c 3f 29 3b   t1 values(?,?);
cc20: 22 2c 20 6e 65 77 20 53 74 72 69 6e 67 5b 5d 20  ", new String[] 
cc30: 7b 22 31 31 22 2c 20 22 31 31 22 7d 29 3b 0a 20  {"11", "11"});. 
cc40: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
cc50: 74 54 72 75 65 28 6d 44 61 74 61 62 61 73 65 2e  tTrue(mDatabase.
cc60: 69 73 4f 70 65 6e 28 29 29 3b 0a 0a 20 20 20 20  isOpen());..    
cc70: 20 20 20 20 20 20 20 20 2f 2f 20 77 68 69 6c 65          // while
cc80: 20 74 68 65 20 77 72 69 74 65 72 20 69 73 20 69   the writer is i
cc90: 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c  n a transaction,
cca0: 20 73 74 61 72 74 20 61 20 72 65 61 64 65 72 20   start a reader 
ccb0: 61 6e 64 20 6d 61 6b 65 20 73 75 72 65 20 69 74  and make sure it
ccc0: 20 63 61 6e 20 73 74 69 6c 6c 0a 20 20 20 20 20   can still.     
ccd0: 20 20 20 20 20 20 20 2f 2f 20 72 65 61 64 20 35         // read 5
cce0: 20 72 6f 77 73 20 6f 66 20 64 61 74 61 20 28 3d   rows of data (=
ccf0: 20 6f 6c 64 20 64 61 74 61 20 70 72 69 6f 72 20   old data prior 
cd00: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 74  to the current t
cd10: 72 61 6e 73 61 63 74 69 6f 6e 29 0a 20 20 20 20  ransaction).    
cd20: 20 20 20 20 20 20 20 20 52 65 61 64 65 72 51 75          ReaderQu
cd30: 65 72 79 69 6e 67 44 61 74 61 20 72 31 20 3d 20  eryingData r1 = 
cd40: 6e 65 77 20 52 65 61 64 65 72 51 75 65 72 79 69  new ReaderQueryi
cd50: 6e 67 44 61 74 61 28 35 29 3b 0a 20 20 20 20 20  ngData(5);.     
cd60: 20 20 20 20 20 20 20 72 31 2e 73 74 61 72 74 28         r1.start(
cd70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  );.            t
cd80: 72 79 20 7b 72 31 2e 6a 6f 69 6e 28 29 3b 7d 20  ry {r1.join();} 
cd90: 63 61 74 63 68 20 28 45 78 63 65 70 74 69 6f 6e  catch (Exception
cda0: 20 65 29 20 7b 7d 0a 0a 20 20 20 20 20 20 20 20   e) {}..        
cdb0: 20 20 20 20 2f 2f 20 6e 6f 77 2c 20 68 61 76 65      // now, have
cdc0: 20 74 68 65 20 77 72 69 74 65 72 20 64 6f 20 74   the writer do t
cdd0: 68 65 20 73 65 6c 65 63 74 20 63 6f 75 6e 74 28  he select count(
cde0: 2a 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  *).            /
cdf0: 2f 20 69 74 20 73 68 6f 75 6c 64 20 65 78 65 63  / it should exec
ce00: 75 74 65 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ute on the same 
ce10: 63 6f 6e 6e 65 63 74 69 6f 6e 20 61 73 20 74 68  connection as th
ce20: 69 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20  is transaction. 
ce30: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 61 6e             // an
ce40: 64 20 63 6f 75 6e 74 28 2a 29 20 73 68 6f 75 6c  d count(*) shoul
ce50: 64 20 72 65 66 6c 65 63 74 20 74 68 65 20 6e 65  d reflect the ne
ce60: 77 6c 79 20 69 6e 73 65 72 74 65 64 20 72 6f 77  wly inserted row
ce70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 4c 6f 6e  .            Lon
ce80: 67 20 6c 20 3d 20 44 61 74 61 62 61 73 65 55 74  g l = DatabaseUt
ce90: 69 6c 73 2e 6c 6f 6e 67 46 6f 72 51 75 65 72 79  ils.longForQuery
cea0: 28 6d 44 61 74 61 62 61 73 65 2c 20 22 73 65 6c  (mDatabase, "sel
ceb0: 65 63 74 20 63 6f 75 6e 74 28 2a 29 20 66 72 6f  ect count(*) fro
cec0: 6d 20 74 31 22 2c 20 6e 75 6c 6c 29 3b 0a 20 20  m t1", null);.  
ced0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
cee0: 45 71 75 61 6c 73 28 36 2c 20 6c 2e 69 6e 74 56  Equals(6, l.intV
cef0: 61 6c 75 65 28 29 29 3b 0a 0a 20 20 20 20 20 20  alue());..      
cf00: 20 20 20 20 20 20 2f 2f 20 65 6e 64 20 74 72 61        // end tra
cf10: 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 20 20  nsaction.       
cf20: 20 20 20 20 20 6d 44 61 74 61 62 61 73 65 2e 73       mDatabase.s
cf30: 65 74 54 72 61 6e 73 61 63 74 69 6f 6e 53 75 63  etTransactionSuc
cf40: 63 65 73 73 66 75 6c 28 29 3b 0a 20 20 20 20 20  cessful();.     
cf50: 20 20 20 20 20 20 20 6d 44 61 74 61 62 61 73 65         mDatabase
cf60: 2e 65 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  .endTransaction(
cf70: 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
cf80: 2f 2f 20 72 65 61 64 65 72 20 73 68 6f 75 6c 64  // reader should
cf90: 20 6e 6f 77 20 62 65 20 61 62 6c 65 20 74 6f 20   now be able to 
cfa0: 72 65 61 64 20 36 20 72 6f 77 73 20 3d 20 6e 65  read 6 rows = ne
cfb0: 77 20 64 61 74 61 20 41 46 54 45 52 20 74 68 69  w data AFTER thi
cfc0: 73 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  s transaction.  
cfd0: 20 20 20 20 20 20 20 20 20 20 72 31 20 3d 20 6e            r1 = n
cfe0: 65 77 20 52 65 61 64 65 72 51 75 65 72 79 69 6e  ew ReaderQueryin
cff0: 67 44 61 74 61 28 36 29 3b 0a 20 20 20 20 20 20  gData(6);.      
d000: 20 20 20 20 20 20 72 31 2e 73 74 61 72 74 28 29        r1.start()
d010: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72  ;.            tr
d020: 79 20 7b 72 31 2e 6a 6f 69 6e 28 29 3b 7d 20 63  y {r1.join();} c
d030: 61 74 63 68 20 28 45 78 63 65 70 74 69 6f 6e 20  atch (Exception 
d040: 65 29 20 7b 7d 0a 20 20 20 20 20 20 20 20 7d 0a  e) {}.        }.
d050: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 69 76 61      }..    priva
d060: 74 65 20 63 6c 61 73 73 20 52 65 61 64 65 72 51  te class ReaderQ
d070: 75 65 72 79 69 6e 67 44 61 74 61 20 65 78 74 65  ueryingData exte
d080: 6e 64 73 20 54 68 72 65 61 64 20 7b 0a 20 20 20  nds Thread {.   
d090: 20 20 20 20 20 70 72 69 76 61 74 65 20 69 6e 74       private int
d0a0: 20 63 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20 20   count;.        
d0b0: 2f 2a 2a 0a 20 20 20 20 20 20 20 20 20 2a 20 63  /**.         * c
d0c0: 6f 6e 73 74 72 75 63 74 6f 72 20 77 69 74 68 20  onstructor with 
d0d0: 61 20 70 61 72 61 6d 20 74 6f 20 69 6e 64 69 63  a param to indic
d0e0: 61 74 65 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ate the number o
d0f0: 66 20 72 6f 77 73 20 65 78 70 65 63 74 65 64 20  f rows expected 
d100: 74 6f 20 62 65 20 72 65 61 64 0a 20 20 20 20 20  to be read.     
d110: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
d120: 75 62 6c 69 63 20 52 65 61 64 65 72 51 75 65 72  ublic ReaderQuer
d130: 79 69 6e 67 44 61 74 61 28 69 6e 74 20 63 6f 75  yingData(int cou
d140: 6e 74 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  nt) {.          
d150: 20 20 74 68 69 73 2e 63 6f 75 6e 74 20 3d 20 63    this.count = c
d160: 6f 75 6e 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ount;.        }.
d170: 20 20 20 20 20 20 20 20 40 4f 76 65 72 72 69 64          @Overrid
d180: 65 20 70 75 62 6c 69 63 20 76 6f 69 64 20 72 75  e public void ru
d190: 6e 28 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  n() {.          
d1a0: 20 20 4c 6f 6e 67 20 6c 20 3d 20 44 61 74 61 62    Long l = Datab
d1b0: 61 73 65 55 74 69 6c 73 2e 6c 6f 6e 67 46 6f 72  aseUtils.longFor
d1c0: 51 75 65 72 79 28 6d 44 61 74 61 62 61 73 65 2c  Query(mDatabase,
d1d0: 20 22 73 65 6c 65 63 74 20 63 6f 75 6e 74 28 2a   "select count(*
d1e0: 29 20 66 72 6f 6d 20 74 31 22 2c 20 6e 75 6c 6c  ) from t1", null
d1f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  );.            a
d200: 73 73 65 72 74 45 71 75 61 6c 73 28 63 6f 75 6e  ssertEquals(coun
d210: 74 2c 20 6c 2e 69 6e 74 56 61 6c 75 65 28 29 29  t, l.intValue())
d220: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d230: 7d 0a 0a 20 20 20 20 70 75 62 6c 69 63 20 76 6f  }..    public vo
d240: 69 64 20 74 65 73 74 45 78 63 65 70 74 69 6f 6e  id testException
d250: 73 46 72 6f 6d 45 6e 61 62 6c 65 57 72 69 74 65  sFromEnableWrite
d260: 41 68 65 61 64 4c 6f 67 67 69 6e 67 28 29 20 7b  AheadLogging() {
d270: 0a 20 20 20 20 20 20 20 20 2f 2f 20 61 74 74 61  .        // atta
d280: 63 68 20 61 20 64 61 74 61 62 61 73 65 0a 20 20  ch a database.  
d290: 20 20 20 20 20 20 2f 2f 20 72 65 64 6f 20 73 65        // redo se
d2a0: 74 75 70 20 74 6f 20 63 72 65 61 74 65 20 57 41  tup to create WA
d2b0: 4c 20 65 6e 61 62 6c 65 64 20 64 61 74 61 62 61  L enabled databa
d2c0: 73 65 0a 20 20 20 20 20 20 20 20 6d 44 61 74 61  se.        mData
d2d0: 62 61 73 65 2e 63 6c 6f 73 65 28 29 3b 0a 20 20  base.close();.  
d2e0: 20 20 20 20 20 20 6e 65 77 20 46 69 6c 65 28 6d        new File(m
d2f0: 44 61 74 61 62 61 73 65 2e 67 65 74 50 61 74 68  Database.getPath
d300: 28 29 29 2e 64 65 6c 65 74 65 28 29 3b 0a 20 20  ()).delete();.  
d310: 20 20 20 20 20 20 6d 44 61 74 61 62 61 73 65 20        mDatabase 
d320: 3d 20 53 51 4c 69 74 65 44 61 74 61 62 61 73 65  = SQLiteDatabase
d330: 2e 6f 70 65 6e 4f 72 43 72 65 61 74 65 44 61 74  .openOrCreateDat
d340: 61 62 61 73 65 28 6d 44 61 74 61 62 61 73 65 46  abase(mDatabaseF
d350: 69 6c 65 2e 67 65 74 50 61 74 68 28 29 2c 20 6e  ile.getPath(), n
d360: 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 0a 20 20 20  ull, null);..   
d370: 20 20 20 20 20 2f 2f 20 61 74 74 61 63 68 20 61       // attach a
d380: 20 64 61 74 61 62 61 73 65 20 61 6e 64 20 63 61   database and ca
d390: 6c 6c 20 65 6e 61 62 6c 65 57 72 69 74 65 41 68  ll enableWriteAh
d3a0: 65 61 64 4c 6f 67 67 69 6e 67 20 2d 20 73 68 6f  eadLogging - sho
d3b0: 75 6c 64 20 6e 6f 74 20 62 65 20 61 6c 6c 6f 77  uld not be allow
d3c0: 65 64 0a 20 20 20 20 20 20 20 20 6d 44 61 74 61  ed.        mData
d3d0: 62 61 73 65 2e 65 78 65 63 53 51 4c 28 22 61 74  base.execSQL("at
d3e0: 74 61 63 68 20 64 61 74 61 62 61 73 65 20 27 3a  tach database ':
d3f0: 6d 65 6d 6f 72 79 3a 27 20 61 73 20 6d 65 6d 6f  memory:' as memo
d400: 72 79 44 62 22 29 3b 0a 20 20 20 20 20 20 20 20  ryDb");.        
d410: 61 73 73 65 72 74 46 61 6c 73 65 28 6d 44 61 74  assertFalse(mDat
d420: 61 62 61 73 65 2e 69 73 57 72 69 74 65 41 68 65  abase.isWriteAhe
d430: 61 64 4c 6f 67 67 69 6e 67 45 6e 61 62 6c 65 64  adLoggingEnabled
d440: 28 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ());.        ass
d450: 65 72 74 46 61 6c 73 65 28 6d 44 61 74 61 62 61  ertFalse(mDataba
d460: 73 65 2e 65 6e 61 62 6c 65 57 72 69 74 65 41 68  se.enableWriteAh
d470: 65 61 64 4c 6f 67 67 69 6e 67 28 29 29 3b 0a 20  eadLogging());. 
d480: 20 20 20 20 20 20 20 61 73 73 65 72 74 46 61 6c         assertFal
d490: 73 65 28 6d 44 61 74 61 62 61 73 65 2e 69 73 57  se(mDatabase.isW
d4a0: 72 69 74 65 41 68 65 61 64 4c 6f 67 67 69 6e 67  riteAheadLogging
d4b0: 45 6e 61 62 6c 65 64 28 29 29 3b 0a 0a 20 20 20  Enabled());..   
d4c0: 20 20 20 20 20 2f 2f 20 65 6e 61 62 6c 65 57 72       // enableWr
d4d0: 69 74 65 41 68 65 61 64 4c 6f 67 67 69 6e 67 20  iteAheadLogging 
d4e0: 6f 6e 20 6d 65 6d 6f 72 79 20 64 61 74 61 62 61  on memory databa
d4f0: 73 65 20 69 73 20 6e 6f 74 20 61 6c 6c 6f 77 65  se is not allowe
d500: 64 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74 65  d.        SQLite
d510: 44 61 74 61 62 61 73 65 20 64 62 20 3d 20 53 51  Database db = SQ
d520: 4c 69 74 65 44 61 74 61 62 61 73 65 2e 63 72 65  LiteDatabase.cre
d530: 61 74 65 28 6e 75 6c 6c 29 3b 0a 20 20 20 20 20  ate(null);.     
d540: 20 20 20 61 73 73 65 72 74 46 61 6c 73 65 28 6d     assertFalse(m
d550: 44 61 74 61 62 61 73 65 2e 69 73 57 72 69 74 65  Database.isWrite
d560: 41 68 65 61 64 4c 6f 67 67 69 6e 67 45 6e 61 62  AheadLoggingEnab
d570: 6c 65 64 28 29 29 3b 0a 20 20 20 20 20 20 20 20  led());.        
d580: 61 73 73 65 72 74 46 61 6c 73 65 28 64 62 2e 65  assertFalse(db.e
d590: 6e 61 62 6c 65 57 72 69 74 65 41 68 65 61 64 4c  nableWriteAheadL
d5a0: 6f 67 67 69 6e 67 28 29 29 3b 0a 20 20 20 20 20  ogging());.     
d5b0: 20 20 20 61 73 73 65 72 74 46 61 6c 73 65 28 6d     assertFalse(m
d5c0: 44 61 74 61 62 61 73 65 2e 69 73 57 72 69 74 65  Database.isWrite
d5d0: 41 68 65 61 64 4c 6f 67 67 69 6e 67 45 6e 61 62  AheadLoggingEnab
d5e0: 6c 65 64 28 29 29 3b 0a 20 20 20 20 20 20 20 20  led());.        
d5f0: 64 62 2e 63 6c 6f 73 65 28 29 3b 0a 20 20 20 20  db.close();.    
d600: 7d 0a 0a 20 20 20 20 70 75 62 6c 69 63 20 76 6f  }..    public vo
d610: 69 64 20 74 65 73 74 45 6e 61 62 6c 65 54 68 65  id testEnableThe
d620: 6e 44 69 73 61 62 6c 65 57 72 69 74 65 41 68 65  nDisableWriteAhe
d630: 61 64 4c 6f 67 67 69 6e 67 28 29 20 7b 0a 20 20  adLogging() {.  
d640: 20 20 20 20 20 20 2f 2f 20 45 6e 61 62 6c 65 20        // Enable 
d650: 57 41 4c 2e 0a 20 20 20 20 20 20 20 20 61 73 73  WAL..        ass
d660: 65 72 74 46 61 6c 73 65 28 6d 44 61 74 61 62 61  ertFalse(mDataba
d670: 73 65 2e 69 73 57 72 69 74 65 41 68 65 61 64 4c  se.isWriteAheadL
d680: 6f 67 67 69 6e 67 45 6e 61 62 6c 65 64 28 29 29  oggingEnabled())
d690: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
d6a0: 54 72 75 65 28 6d 44 61 74 61 62 61 73 65 2e 65  True(mDatabase.e
d6b0: 6e 61 62 6c 65 57 72 69 74 65 41 68 65 61 64 4c  nableWriteAheadL
d6c0: 6f 67 67 69 6e 67 28 29 29 3b 0a 20 20 20 20 20  ogging());.     
d6d0: 20 20 20 61 73 73 65 72 74 54 72 75 65 28 6d 44     assertTrue(mD
d6e0: 61 74 61 62 61 73 65 2e 69 73 57 72 69 74 65 41  atabase.isWriteA
d6f0: 68 65 61 64 4c 6f 67 67 69 6e 67 45 6e 61 62 6c  headLoggingEnabl
d700: 65 64 28 29 29 3b 0a 20 20 20 20 20 20 20 20 61  ed());.        a
d710: 73 73 65 72 74 54 72 75 65 28 44 61 74 61 62 61  ssertTrue(Databa
d720: 73 65 55 74 69 6c 73 2e 73 74 72 69 6e 67 46 6f  seUtils.stringFo
d730: 72 51 75 65 72 79 28 6d 44 61 74 61 62 61 73 65  rQuery(mDatabase
d740: 2c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  , "PRAGMA journa
d750: 6c 5f 6d 6f 64 65 22 2c 20 6e 75 6c 6c 29 0a 20  l_mode", null). 
d760: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2e                 .
d770: 65 71 75 61 6c 73 49 67 6e 6f 72 65 43 61 73 65  equalsIgnoreCase
d780: 28 22 57 41 4c 22 29 29 3b 0a 0a 20 20 20 20 20  ("WAL"));..     
d790: 20 20 20 2f 2f 20 45 6e 61 62 6c 69 6e 67 20 77     // Enabling w
d7a0: 68 65 6e 20 61 6c 72 65 61 64 79 20 65 6e 61 62  hen already enab
d7b0: 6c 65 64 20 73 68 6f 75 6c 64 20 68 61 76 65 20  led should have 
d7c0: 6e 6f 20 6f 62 73 65 72 76 61 62 6c 65 20 65 66  no observable ef
d7d0: 66 65 63 74 2e 0a 20 20 20 20 20 20 20 20 61 73  fect..        as
d7e0: 73 65 72 74 54 72 75 65 28 6d 44 61 74 61 62 61  sertTrue(mDataba
d7f0: 73 65 2e 65 6e 61 62 6c 65 57 72 69 74 65 41 68  se.enableWriteAh
d800: 65 61 64 4c 6f 67 67 69 6e 67 28 29 29 3b 0a 20  eadLogging());. 
d810: 20 20 20 20 20 20 20 61 73 73 65 72 74 54 72 75         assertTru
d820: 65 28 6d 44 61 74 61 62 61 73 65 2e 69 73 57 72  e(mDatabase.isWr
d830: 69 74 65 41 68 65 61 64 4c 6f 67 67 69 6e 67 45  iteAheadLoggingE
d840: 6e 61 62 6c 65 64 28 29 29 3b 0a 20 20 20 20 20  nabled());.     
d850: 20 20 20 61 73 73 65 72 74 54 72 75 65 28 44 61     assertTrue(Da
d860: 74 61 62 61 73 65 55 74 69 6c 73 2e 73 74 72 69  tabaseUtils.stri
d870: 6e 67 46 6f 72 51 75 65 72 79 28 6d 44 61 74 61  ngForQuery(mData
d880: 62 61 73 65 2c 20 22 50 52 41 47 4d 41 20 6a 6f  base, "PRAGMA jo
d890: 75 72 6e 61 6c 5f 6d 6f 64 65 22 2c 20 6e 75 6c  urnal_mode", nul
d8a0: 6c 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l).             
d8b0: 20 20 20 2e 65 71 75 61 6c 73 49 67 6e 6f 72 65     .equalsIgnore
d8c0: 43 61 73 65 28 22 57 41 4c 22 29 29 3b 0a 0a 20  Case("WAL"));.. 
d8d0: 20 20 20 20 20 20 20 2f 2f 20 44 69 73 61 62 6c         // Disabl
d8e0: 69 6e 67 20 77 68 65 6e 20 74 68 65 72 65 20 61  ing when there a
d8f0: 72 65 20 6e 6f 20 63 6f 6e 6e 65 63 74 69 6f 6e  re no connection
d900: 73 20 73 68 6f 75 6c 64 20 77 6f 72 6b 2e 0a 20  s should work.. 
d910: 20 20 20 20 20 20 20 6d 44 61 74 61 62 61 73 65         mDatabase
d920: 2e 64 69 73 61 62 6c 65 57 72 69 74 65 41 68 65  .disableWriteAhe
d930: 61 64 4c 6f 67 67 69 6e 67 28 29 3b 0a 20 20 20  adLogging();.   
d940: 20 20 20 20 20 61 73 73 65 72 74 46 61 6c 73 65       assertFalse
d950: 28 6d 44 61 74 61 62 61 73 65 2e 69 73 57 72 69  (mDatabase.isWri
d960: 74 65 41 68 65 61 64 4c 6f 67 67 69 6e 67 45 6e  teAheadLoggingEn
d970: 61 62 6c 65 64 28 29 29 3b 0a 20 20 20 20 7d 0a  abled());.    }.
d980: 0a 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64  .    public void
d990: 20 74 65 73 74 45 6e 61 62 6c 65 54 68 65 6e 44   testEnableThenD
d9a0: 69 73 61 62 6c 65 57 72 69 74 65 41 68 65 61 64  isableWriteAhead
d9b0: 4c 6f 67 67 69 6e 67 55 73 69 6e 67 4f 70 65 6e  LoggingUsingOpen
d9c0: 46 6c 61 67 28 29 20 7b 0a 20 20 20 20 20 20 20  Flag() {.       
d9d0: 20 6e 65 77 20 46 69 6c 65 28 6d 44 61 74 61 62   new File(mDatab
d9e0: 61 73 65 2e 67 65 74 50 61 74 68 28 29 29 2e 64  ase.getPath()).d
d9f0: 65 6c 65 74 65 28 29 3b 0a 20 20 20 20 20 20 20  elete();.       
da00: 20 6d 44 61 74 61 62 61 73 65 20 3d 20 53 51 4c   mDatabase = SQL
da10: 69 74 65 44 61 74 61 62 61 73 65 2e 6f 70 65 6e  iteDatabase.open
da20: 44 61 74 61 62 61 73 65 28 6d 44 61 74 61 62 61  Database(mDataba
da30: 73 65 46 69 6c 65 2e 67 65 74 50 61 74 68 28 29  seFile.getPath()
da40: 2c 20 6e 75 6c 6c 2c 0a 20 20 20 20 20 20 20 20  , null,.        
da50: 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 44 61          SQLiteDa
da60: 74 61 62 61 73 65 2e 43 52 45 41 54 45 5f 49 46  tabase.CREATE_IF
da70: 5f 4e 45 43 45 53 53 41 52 59 20 7c 20 53 51 4c  _NECESSARY | SQL
da80: 69 74 65 44 61 74 61 62 61 73 65 2e 45 4e 41 42  iteDatabase.ENAB
da90: 4c 45 5f 57 52 49 54 45 5f 41 48 45 41 44 5f 4c  LE_WRITE_AHEAD_L
daa0: 4f 47 47 49 4e 47 2c 0a 20 20 20 20 20 20 20 20  OGGING,.        
dab0: 20 20 20 20 20 20 20 20 6e 75 6c 6c 29 3b 0a 20          null);. 
dac0: 20 20 20 20 20 20 20 61 73 73 65 72 74 54 72 75         assertTru
dad0: 65 28 6d 44 61 74 61 62 61 73 65 2e 69 73 57 72  e(mDatabase.isWr
dae0: 69 74 65 41 68 65 61 64 4c 6f 67 67 69 6e 67 45  iteAheadLoggingE
daf0: 6e 61 62 6c 65 64 28 29 29 3b 0a 20 20 20 20 20  nabled());.     
db00: 20 20 20 61 73 73 65 72 74 54 72 75 65 28 44 61     assertTrue(Da
db10: 74 61 62 61 73 65 55 74 69 6c 73 2e 73 74 72 69  tabaseUtils.stri
db20: 6e 67 46 6f 72 51 75 65 72 79 28 6d 44 61 74 61  ngForQuery(mData
db30: 62 61 73 65 2c 20 22 50 52 41 47 4d 41 20 6a 6f  base, "PRAGMA jo
db40: 75 72 6e 61 6c 5f 6d 6f 64 65 22 2c 20 6e 75 6c  urnal_mode", nul
db50: 6c 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  l).             
db60: 20 20 20 2e 65 71 75 61 6c 73 49 67 6e 6f 72 65     .equalsIgnore
db70: 43 61 73 65 28 22 57 41 4c 22 29 29 3b 0a 0a 20  Case("WAL"));.. 
db80: 20 20 20 20 20 20 20 2f 2f 20 45 6e 61 62 6c 69         // Enabli
db90: 6e 67 20 77 68 65 6e 20 61 6c 72 65 61 64 79 20  ng when already 
dba0: 65 6e 61 62 6c 65 64 20 73 68 6f 75 6c 64 20 68  enabled should h
dbb0: 61 76 65 20 6e 6f 20 6f 62 73 65 72 76 61 62 6c  ave no observabl
dbc0: 65 20 65 66 66 65 63 74 2e 0a 20 20 20 20 20 20  e effect..      
dbd0: 20 20 61 73 73 65 72 74 54 72 75 65 28 6d 44 61    assertTrue(mDa
dbe0: 74 61 62 61 73 65 2e 65 6e 61 62 6c 65 57 72 69  tabase.enableWri
dbf0: 74 65 41 68 65 61 64 4c 6f 67 67 69 6e 67 28 29  teAheadLogging()
dc00: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
dc10: 74 54 72 75 65 28 6d 44 61 74 61 62 61 73 65 2e  tTrue(mDatabase.
dc20: 69 73 57 72 69 74 65 41 68 65 61 64 4c 6f 67 67  isWriteAheadLogg
dc30: 69 6e 67 45 6e 61 62 6c 65 64 28 29 29 3b 0a 20  ingEnabled());. 
dc40: 20 20 20 20 20 20 20 61 73 73 65 72 74 54 72 75         assertTru
dc50: 65 28 44 61 74 61 62 61 73 65 55 74 69 6c 73 2e  e(DatabaseUtils.
dc60: 73 74 72 69 6e 67 46 6f 72 51 75 65 72 79 28 6d  stringForQuery(m
dc70: 44 61 74 61 62 61 73 65 2c 20 22 50 52 41 47 4d  Database, "PRAGM
dc80: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 22 2c  A journal_mode",
dc90: 20 6e 75 6c 6c 29 0a 20 20 20 20 20 20 20 20 20   null).         
dca0: 20 20 20 20 20 20 20 2e 65 71 75 61 6c 73 49 67         .equalsIg
dcb0: 6e 6f 72 65 43 61 73 65 28 22 57 41 4c 22 29 29  noreCase("WAL"))
dcc0: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 44 69  ;..        // Di
dcd0: 73 61 62 6c 69 6e 67 20 77 68 65 6e 20 74 68 65  sabling when the
dce0: 72 65 20 61 72 65 20 6e 6f 20 63 6f 6e 6e 65 63  re are no connec
dcf0: 74 69 6f 6e 73 20 73 68 6f 75 6c 64 20 77 6f 72  tions should wor
dd00: 6b 2e 0a 20 20 20 20 20 20 20 20 6d 44 61 74 61  k..        mData
dd10: 62 61 73 65 2e 64 69 73 61 62 6c 65 57 72 69 74  base.disableWrit
dd20: 65 41 68 65 61 64 4c 6f 67 67 69 6e 67 28 29 3b  eAheadLogging();
dd30: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 46  .        assertF
dd40: 61 6c 73 65 28 6d 44 61 74 61 62 61 73 65 2e 69  alse(mDatabase.i
dd50: 73 57 72 69 74 65 41 68 65 61 64 4c 6f 67 67 69  sWriteAheadLoggi
dd60: 6e 67 45 6e 61 62 6c 65 64 28 29 29 3b 0a 20 20  ngEnabled());.  
dd70: 20 20 7d 0a 0a 20 20 20 20 70 75 62 6c 69 63 20    }..    public 
dd80: 76 6f 69 64 20 74 65 73 74 45 6e 61 62 6c 65 57  void testEnableW
dd90: 72 69 74 65 41 68 65 61 64 4c 6f 67 67 69 6e 67  riteAheadLogging
dda0: 46 72 6f 6d 43 6f 6e 74 65 78 74 55 73 69 6e 67  FromContextUsing
ddb0: 4d 6f 64 65 46 6c 61 67 28 29 20 7b 0a 20 20 20  ModeFlag() {.   
ddc0: 20 20 20 20 20 2f 2f 20 57 69 74 68 6f 75 74 20       // Without 
ddd0: 74 68 65 20 4d 4f 44 45 5f 45 4e 41 42 4c 45 5f  the MODE_ENABLE_
dde0: 57 52 49 54 45 5f 41 48 45 41 44 5f 4c 4f 47 47  WRITE_AHEAD_LOGG
ddf0: 49 4e 47 20 66 6c 61 67 2c 20 64 61 74 61 62 61  ING flag, databa
de00: 73 65 20 6f 70 65 6e 73 20 77 69 74 68 6f 75 74  se opens without
de10: 20 57 41 4c 2e 0a 20 20 20 20 20 20 20 20 67 65   WAL..        ge
de20: 74 43 6f 6e 74 65 78 74 28 29 2e 64 65 6c 65 74  tContext().delet
de30: 65 44 61 74 61 62 61 73 65 28 44 41 54 41 42 41  eDatabase(DATABA
de40: 53 45 5f 46 49 4c 45 5f 4e 41 4d 45 29 3b 0a 0a  SE_FILE_NAME);..
de50: 20 20 20 20 20 20 20 20 46 69 6c 65 20 66 20 3d          File f =
de60: 20 67 65 74 43 6f 6e 74 65 78 74 28 29 2e 67 65   getContext().ge
de70: 74 44 61 74 61 62 61 73 65 50 61 74 68 28 44 41  tDatabasePath(DA
de80: 54 41 42 41 53 45 5f 46 49 4c 45 5f 4e 41 4d 45  TABASE_FILE_NAME
de90: 29 3b 0a 20 20 20 20 20 20 20 20 6d 44 61 74 61  );.        mData
dea0: 62 61 73 65 20 3d 20 53 51 4c 69 74 65 44 61 74  base = SQLiteDat
deb0: 61 62 61 73 65 2e 6f 70 65 6e 4f 72 43 72 65 61  abase.openOrCrea
dec0: 74 65 44 61 74 61 62 61 73 65 28 66 2c 6e 75 6c  teDatabase(f,nul
ded0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  l);.        asse
dee0: 72 74 46 61 6c 73 65 28 6d 44 61 74 61 62 61 73  rtFalse(mDatabas
def0: 65 2e 69 73 57 72 69 74 65 41 68 65 61 64 4c 6f  e.isWriteAheadLo
df00: 67 67 69 6e 67 45 6e 61 62 6c 65 64 28 29 29 3b  ggingEnabled());
df10: 0a 20 20 20 20 20 20 20 20 6d 44 61 74 61 62 61  .        mDataba
df20: 73 65 2e 63 6c 6f 73 65 28 29 3b 0a 0a 20 20 20  se.close();..   
df30: 20 20 20 20 20 2f 2f 20 2f 2f 20 57 69 74 68 20       // // With 
df40: 74 68 65 20 4d 4f 44 45 5f 45 4e 41 42 4c 45 5f  the MODE_ENABLE_
df50: 57 52 49 54 45 5f 41 48 45 41 44 5f 4c 4f 47 47  WRITE_AHEAD_LOGG
df60: 49 4e 47 20 66 6c 61 67 2c 20 64 61 74 61 62 61  ING flag, databa
df70: 73 65 20 6f 70 65 6e 73 20 77 69 74 68 20 57 41  se opens with WA
df80: 4c 2e 0a 20 20 20 20 20 20 20 20 2f 2f 20 67 65  L..        // ge
df90: 74 43 6f 6e 74 65 78 74 28 29 2e 64 65 6c 65 74  tContext().delet
dfa0: 65 44 61 74 61 62 61 73 65 28 44 41 54 41 42 41  eDatabase(DATABA
dfb0: 53 45 5f 46 49 4c 45 5f 4e 41 4d 45 29 3b 0a 20  SE_FILE_NAME);. 
dfc0: 20 20 20 20 20 20 20 2f 2f 20 6d 44 61 74 61 62         // mDatab
dfd0: 61 73 65 20 3d 20 67 65 74 43 6f 6e 74 65 78 74  ase = getContext
dfe0: 28 29 2e 6f 70 65 6e 4f 72 43 72 65 61 74 65 44  ().openOrCreateD
dff0: 61 74 61 62 61 73 65 28 44 41 54 41 42 41 53 45  atabase(DATABASE
e000: 5f 46 49 4c 45 5f 4e 41 4d 45 2c 0a 20 20 20 20  _FILE_NAME,.    
e010: 20 20 20 20 2f 2f 20 20 20 20 20 20 20 20 43 6f      //        Co
e020: 6e 74 65 78 74 2e 4d 4f 44 45 5f 50 52 49 56 41  ntext.MODE_PRIVA
e030: 54 45 20 7c 20 43 6f 6e 74 65 78 74 2e 4d 4f 44  TE | Context.MOD
e040: 45 5f 45 4e 41 42 4c 45 5f 57 52 49 54 45 5f 41  E_ENABLE_WRITE_A
e050: 48 45 41 44 5f 4c 4f 47 47 49 4e 47 2c 20 6e 75  HEAD_LOGGING, nu
e060: 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 2f 2f 20  ll);.        // 
e070: 61 73 73 65 72 74 54 72 75 65 28 6d 44 61 74 61  assertTrue(mData
e080: 62 61 73 65 2e 69 73 57 72 69 74 65 41 68 65 61  base.isWriteAhea
e090: 64 4c 6f 67 67 69 6e 67 45 6e 61 62 6c 65 64 28  dLoggingEnabled(
e0a0: 29 29 3b 0a 20 20 20 20 20 20 20 20 2f 2f 20 6d  ));.        // m
e0b0: 44 61 74 61 62 61 73 65 2e 63 6c 6f 73 65 28 29  Database.close()
e0c0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 75 62  ;.    }..    pub
e0d0: 6c 69 63 20 76 6f 69 64 20 74 65 73 74 45 6e 61  lic void testEna
e0e0: 62 6c 65 57 72 69 74 65 41 68 65 61 64 4c 6f 67  bleWriteAheadLog
e0f0: 67 69 6e 67 53 68 6f 75 6c 64 54 68 72 6f 77 49  gingShouldThrowI
e100: 66 54 72 61 6e 73 61 63 74 69 6f 6e 49 6e 50 72  fTransactionInPr
e110: 6f 67 72 65 73 73 28 29 20 7b 0a 20 20 20 20 20  ogress() {.     
e120: 20 20 20 61 73 73 65 72 74 46 61 6c 73 65 28 6d     assertFalse(m
e130: 44 61 74 61 62 61 73 65 2e 69 73 57 72 69 74 65  Database.isWrite
e140: 41 68 65 61 64 4c 6f 67 67 69 6e 67 45 6e 61 62  AheadLoggingEnab
e150: 6c 65 64 28 29 29 3b 0a 20 20 20 20 20 20 20 20  led());.        
e160: 53 74 72 69 6e 67 20 6f 6c 64 4a 6f 75 72 6e 61  String oldJourna
e170: 6c 4d 6f 64 65 20 3d 20 44 61 74 61 62 61 73 65  lMode = Database
e180: 55 74 69 6c 73 2e 73 74 72 69 6e 67 46 6f 72 51  Utils.stringForQ
e190: 75 65 72 79 28 0a 20 20 20 20 20 20 20 20 20 20  uery(.          
e1a0: 20 20 20 20 20 20 6d 44 61 74 61 62 61 73 65 2c        mDatabase,
e1b0: 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61 6c   "PRAGMA journal
e1c0: 5f 6d 6f 64 65 22 2c 20 6e 75 6c 6c 29 3b 0a 0a  _mode", null);..
e1d0: 20 20 20 20 20 20 20 20 2f 2f 20 42 65 67 69 6e          // Begin
e1e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
e1f0: 20 20 20 20 20 20 6d 44 61 74 61 62 61 73 65 2e        mDatabase.
e200: 62 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  beginTransaction
e210: 28 29 3b 0a 0a 20 20 20 20 20 20 20 20 74 72 79  ();..        try
e220: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f   {.            /
e230: 2f 20 41 74 74 65 6d 70 74 20 74 6f 20 65 6e 61  / Attempt to ena
e240: 62 6c 65 20 57 41 4c 20 73 68 6f 75 6c 64 20 66  ble WAL should f
e250: 61 69 6c 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ail..           
e260: 20 6d 44 61 74 61 62 61 73 65 2e 65 6e 61 62 6c   mDatabase.enabl
e270: 65 57 72 69 74 65 41 68 65 61 64 4c 6f 67 67 69  eWriteAheadLoggi
e280: 6e 67 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ng();.          
e290: 20 20 66 61 69 6c 28 22 45 78 70 65 63 74 65 64    fail("Expected
e2a0: 20 49 6c 6c 65 67 61 6c 53 74 61 74 65 45 78 63   IllegalStateExc
e2b0: 65 70 74 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20  eption");.      
e2c0: 20 20 7d 20 63 61 74 63 68 20 28 49 6c 6c 65 67    } catch (Illeg
e2d0: 61 6c 53 74 61 74 65 45 78 63 65 70 74 69 6f 6e  alStateException
e2e0: 20 65 78 29 20 7b 0a 20 20 20 20 20 20 20 20 20   ex) {.         
e2f0: 20 20 20 2f 2f 20 65 78 70 65 63 74 65 64 0a 20     // expected. 
e300: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
e310: 20 20 61 73 73 65 72 74 46 61 6c 73 65 28 6d 44    assertFalse(mD
e320: 61 74 61 62 61 73 65 2e 69 73 57 72 69 74 65 41  atabase.isWriteA
e330: 68 65 61 64 4c 6f 67 67 69 6e 67 45 6e 61 62 6c  headLoggingEnabl
e340: 65 64 28 29 29 3b 0a 20 20 20 20 20 20 20 20 61  ed());.        a
e350: 73 73 65 72 74 54 72 75 65 28 44 61 74 61 62 61  ssertTrue(Databa
e360: 73 65 55 74 69 6c 73 2e 73 74 72 69 6e 67 46 6f  seUtils.stringFo
e370: 72 51 75 65 72 79 28 6d 44 61 74 61 62 61 73 65  rQuery(mDatabase
e380: 2c 20 22 50 52 41 47 4d 41 20 6a 6f 75 72 6e 61  , "PRAGMA journa
e390: 6c 5f 6d 6f 64 65 22 2c 20 6e 75 6c 6c 29 0a 20  l_mode", null). 
e3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2e                 .
e3b0: 65 71 75 61 6c 73 49 67 6e 6f 72 65 43 61 73 65  equalsIgnoreCase
e3c0: 28 6f 6c 64 4a 6f 75 72 6e 61 6c 4d 6f 64 65 29  (oldJournalMode)
e3d0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 75  );.    }..    pu
e3e0: 62 6c 69 63 20 76 6f 69 64 20 74 65 73 74 44 69  blic void testDi
e3f0: 73 61 62 6c 65 57 72 69 74 65 41 68 65 61 64 4c  sableWriteAheadL
e400: 6f 67 67 69 6e 67 53 68 6f 75 6c 64 54 68 72 6f  oggingShouldThro
e410: 77 49 66 54 72 61 6e 73 61 63 74 69 6f 6e 49 6e  wIfTransactionIn
e420: 50 72 6f 67 72 65 73 73 28 29 20 7b 0a 20 20 20  Progress() {.   
e430: 20 20 20 20 20 2f 2f 20 45 6e 61 62 6c 65 20 57       // Enable W
e440: 41 4c 2e 0a 20 20 20 20 20 20 20 20 61 73 73 65  AL..        asse
e450: 72 74 46 61 6c 73 65 28 6d 44 61 74 61 62 61 73  rtFalse(mDatabas
e460: 65 2e 69 73 57 72 69 74 65 41 68 65 61 64 4c 6f  e.isWriteAheadLo
e470: 67 67 69 6e 67 45 6e 61 62 6c 65 64 28 29 29 3b  ggingEnabled());
e480: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 54  .        assertT
e490: 72 75 65 28 6d 44 61 74 61 62 61 73 65 2e 65 6e  rue(mDatabase.en
e4a0: 61 62 6c 65 57 72 69 74 65 41 68 65 61 64 4c 6f  ableWriteAheadLo
e4b0: 67 67 69 6e 67 28 29 29 3b 0a 20 20 20 20 20 20  gging());.      
e4c0: 20 20 61 73 73 65 72 74 54 72 75 65 28 6d 44 61    assertTrue(mDa
e4d0: 74 61 62 61 73 65 2e 69 73 57 72 69 74 65 41 68  tabase.isWriteAh
e4e0: 65 61 64 4c 6f 67 67 69 6e 67 45 6e 61 62 6c 65  eadLoggingEnable
e4f0: 64 28 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  d());..        /
e500: 2f 20 42 65 67 69 6e 20 74 72 61 6e 73 61 63 74  / Begin transact
e510: 69 6f 6e 2e 0a 20 20 20 20 20 20 20 20 6d 44 61  ion..        mDa
e520: 74 61 62 61 73 65 2e 62 65 67 69 6e 54 72 61 6e  tabase.beginTran
e530: 73 61 63 74 69 6f 6e 28 29 3b 0a 0a 20 20 20 20  saction();..    
e540: 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20      try {.      
e550: 20 20 20 20 20 20 2f 2f 20 41 74 74 65 6d 70 74        // Attempt
e560: 20 74 6f 20 64 69 73 61 62 6c 65 20 57 41 4c 20   to disable WAL 
e570: 73 68 6f 75 6c 64 20 66 61 69 6c 2e 0a 20 20 20  should fail..   
e580: 20 20 20 20 20 20 20 20 20 6d 44 61 74 61 62 61           mDataba
e590: 73 65 2e 64 69 73 61 62 6c 65 57 72 69 74 65 41  se.disableWriteA
e5a0: 68 65 61 64 4c 6f 67 67 69 6e 67 28 29 3b 0a 20  headLogging();. 
e5b0: 20 20 20 20 20 20 20 20 20 20 20 66 61 69 6c 28             fail(
e5c0: 22 45 78 70 65 63 74 65 64 20 49 6c 6c 65 67 61  "Expected Illega
e5d0: 6c 53 74 61 74 65 45 78 63 65 70 74 69 6f 6e 22  lStateException"
e5e0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 63 61 74  );.        } cat
e5f0: 63 68 20 28 49 6c 6c 65 67 61 6c 53 74 61 74 65  ch (IllegalState
e600: 45 78 63 65 70 74 69 6f 6e 20 65 78 29 20 7b 0a  Exception ex) {.
e610: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 65              // e
e620: 78 70 65 63 74 65 64 0a 20 20 20 20 20 20 20 20  xpected.        
e630: 7d 0a 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  }..        asser
e640: 74 54 72 75 65 28 6d 44 61 74 61 62 61 73 65 2e  tTrue(mDatabase.
e650: 69 73 57 72 69 74 65 41 68 65 61 64 4c 6f 67 67  isWriteAheadLogg
e660: 69 6e 67 45 6e 61 62 6c 65 64 28 29 29 3b 0a 20  ingEnabled());. 
e670: 20 20 20 20 20 20 20 61 73 73 65 72 74 54 72 75         assertTru
e680: 65 28 44 61 74 61 62 61 73 65 55 74 69 6c 73 2e  e(DatabaseUtils.
e690: 73 74 72 69 6e 67 46 6f 72 51 75 65 72 79 28 6d  stringForQuery(m
e6a0: 44 61 74 61 62 61 73 65 2c 20 22 50 52 41 47 4d  Database, "PRAGM
e6b0: 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 22 2c  A journal_mode",
e6c0: 20 6e 75 6c 6c 29 0a 20 20 20 20 20 20 20 20 20   null).         
e6d0: 20 20 20 20 20 20 20 2e 65 71 75 61 6c 73 49 67         .equalsIg
e6e0: 6e 6f 72 65 43 61 73 65 28 22 57 41 4c 22 29 29  noreCase("WAL"))
e6f0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 75 62  ;.    }..    pub
e700: 6c 69 63 20 76 6f 69 64 20 74 65 73 74 45 6e 61  lic void testEna
e710: 62 6c 65 41 6e 64 44 69 73 61 62 6c 65 46 6f 72  bleAndDisableFor
e720: 65 69 67 6e 4b 65 79 73 28 29 20 7b 0a 20 20 20  eignKeys() {.   
e730: 20 20 20 20 20 2f 2f 20 49 6e 69 74 69 61 6c 6c       // Initiall
e740: 79 20 6f 66 66 2e 0a 20 20 20 20 20 20 20 20 61  y off..        a
e750: 73 73 65 72 74 45 71 75 61 6c 73 28 30 2c 20 44  ssertEquals(0, D
e760: 61 74 61 62 61 73 65 55 74 69 6c 73 2e 6c 6f 6e  atabaseUtils.lon
e770: 67 46 6f 72 51 75 65 72 79 28 6d 44 61 74 61 62  gForQuery(mDatab
e780: 61 73 65 2c 20 22 50 52 41 47 4d 41 20 66 6f 72  ase, "PRAGMA for
e790: 65 69 67 6e 5f 6b 65 79 73 22 2c 20 6e 75 6c 6c  eign_keys", null
e7a0: 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20  ));..        // 
e7b0: 45 6e 61 62 6c 65 20 66 6f 72 65 69 67 6e 20 6b  Enable foreign k
e7c0: 65 79 73 2e 0a 20 20 20 20 20 20 20 20 6d 44 61  eys..        mDa
e7d0: 74 61 62 61 73 65 2e 73 65 74 46 6f 72 65 69 67  tabase.setForeig
e7e0: 6e 4b 65 79 43 6f 6e 73 74 72 61 69 6e 74 73 45  nKeyConstraintsE
e7f0: 6e 61 62 6c 65 64 28 74 72 75 65 29 3b 0a 20 20  nabled(true);.  
e800: 20 20 20 20 20 20 61 73 73 65 72 74 45 71 75 61        assertEqua
e810: 6c 73 28 31 2c 20 44 61 74 61 62 61 73 65 55 74  ls(1, DatabaseUt
e820: 69 6c 73 2e 6c 6f 6e 67 46 6f 72 51 75 65 72 79  ils.longForQuery
e830: 28 6d 44 61 74 61 62 61 73 65 2c 20 22 50 52 41  (mDatabase, "PRA
e840: 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b 65 79 73  GMA foreign_keys
e850: 22 2c 20 6e 75 6c 6c 29 29 3b 0a 0a 20 20 20 20  ", null));..    
e860: 20 20 20 20 2f 2f 20 44 69 73 61 62 6c 65 20 66      // Disable f
e870: 6f 72 65 69 67 6e 20 6b 65 79 73 2e 0a 20 20 20  oreign keys..   
e880: 20 20 20 20 20 6d 44 61 74 61 62 61 73 65 2e 73       mDatabase.s
e890: 65 74 46 6f 72 65 69 67 6e 4b 65 79 43 6f 6e 73  etForeignKeyCons
e8a0: 74 72 61 69 6e 74 73 45 6e 61 62 6c 65 64 28 66  traintsEnabled(f
e8b0: 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 20 20 61  alse);.        a
e8c0: 73 73 65 72 74 45 71 75 61 6c 73 28 30 2c 20 44  ssertEquals(0, D
e8d0: 61 74 61 62 61 73 65 55 74 69 6c 73 2e 6c 6f 6e  atabaseUtils.lon
e8e0: 67 46 6f 72 51 75 65 72 79 28 6d 44 61 74 61 62  gForQuery(mDatab
e8f0: 61 73 65 2c 20 22 50 52 41 47 4d 41 20 66 6f 72  ase, "PRAGMA for
e900: 65 69 67 6e 5f 6b 65 79 73 22 2c 20 6e 75 6c 6c  eign_keys", null
e910: 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20  ));..        // 
e920: 43 61 6e 6e 6f 74 20 63 6f 6e 66 69 67 75 72 65  Cannot configure
e930: 20 66 6f 72 65 69 67 6e 20 6b 65 79 73 20 69 66   foreign keys if
e940: 20 74 68 65 72 65 20 61 72 65 20 74 72 61 6e 73   there are trans
e950: 61 63 74 69 6f 6e 73 20 69 6e 20 70 72 6f 67 72  actions in progr
e960: 65 73 73 2e 0a 20 20 20 20 20 20 20 20 6d 44 61  ess..        mDa
e970: 74 61 62 61 73 65 2e 62 65 67 69 6e 54 72 61 6e  tabase.beginTran
e980: 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20 20 20 20  saction();.     
e990: 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20     try {.       
e9a0: 20 20 20 20 20 6d 44 61 74 61 62 61 73 65 2e 73       mDatabase.s
e9b0: 65 74 46 6f 72 65 69 67 6e 4b 65 79 43 6f 6e 73  etForeignKeyCons
e9c0: 74 72 61 69 6e 74 73 45 6e 61 62 6c 65 64 28 74  traintsEnabled(t
e9d0: 72 75 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  rue);.          
e9e0: 20 20 66 61 69 6c 28 22 45 78 70 65 63 74 65 64    fail("Expected
e9f0: 20 49 6c 6c 65 67 61 6c 53 74 61 74 65 45 78 63   IllegalStateExc
ea00: 65 70 74 69 6f 6e 22 29 3b 0a 20 20 20 20 20 20  eption");.      
ea10: 20 20 7d 20 63 61 74 63 68 20 28 49 6c 6c 65 67    } catch (Illeg
ea20: 61 6c 53 74 61 74 65 45 78 63 65 70 74 69 6f 6e  alStateException
ea30: 20 65 78 29 20 7b 0a 20 20 20 20 20 20 20 20 20   ex) {.         
ea40: 20 20 20 2f 2f 20 65 78 70 65 63 74 65 64 0a 20     // expected. 
ea50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
ea60: 20 61 73 73 65 72 74 45 71 75 61 6c 73 28 30 2c   assertEquals(0,
ea70: 20 44 61 74 61 62 61 73 65 55 74 69 6c 73 2e 6c   DatabaseUtils.l
ea80: 6f 6e 67 46 6f 72 51 75 65 72 79 28 6d 44 61 74  ongForQuery(mDat
ea90: 61 62 61 73 65 2c 20 22 50 52 41 47 4d 41 20 66  abase, "PRAGMA f
eaa0: 6f 72 65 69 67 6e 5f 6b 65 79 73 22 2c 20 6e 75  oreign_keys", nu
eab0: 6c 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 6d 44  ll));.        mD
eac0: 61 74 61 62 61 73 65 2e 65 6e 64 54 72 61 6e 73  atabase.endTrans
ead0: 61 63 74 69 6f 6e 28 29 3b 0a 0a 20 20 20 20 20  action();..     
eae0: 20 20 20 2f 2f 20 45 6e 61 62 6c 65 20 66 6f 72     // Enable for
eaf0: 65 69 67 6e 20 6b 65 79 73 20 73 68 6f 75 6c 64  eign keys should
eb00: 20 77 6f 72 6b 20 61 67 61 69 6e 20 61 66 74 65   work again afte
eb10: 72 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 63 6f  r transaction co
eb20: 6d 70 6c 65 74 65 2e 0a 20 20 20 20 20 20 20 20  mplete..        
eb30: 6d 44 61 74 61 62 61 73 65 2e 73 65 74 46 6f 72  mDatabase.setFor
eb40: 65 69 67 6e 4b 65 79 43 6f 6e 73 74 72 61 69 6e  eignKeyConstrain
eb50: 74 73 45 6e 61 62 6c 65 64 28 74 72 75 65 29 3b  tsEnabled(true);
eb60: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 45  .        assertE
eb70: 71 75 61 6c 73 28 31 2c 20 44 61 74 61 62 61 73  quals(1, Databas
eb80: 65 55 74 69 6c 73 2e 6c 6f 6e 67 46 6f 72 51 75  eUtils.longForQu
eb90: 65 72 79 28 6d 44 61 74 61 62 61 73 65 2c 20 22  ery(mDatabase, "
eba0: 50 52 41 47 4d 41 20 66 6f 72 65 69 67 6e 5f 6b  PRAGMA foreign_k
ebb0: 65 79 73 22 2c 20 6e 75 6c 6c 29 29 3b 0a 20 20  eys", null));.  
ebc0: 20 20 7d 0a 7d 0a                                  }.}.