SQLite Android Bindings
Hex Artifact Content
Not logged in

Artifact 7d301e00d8b1056090e0cfaa00e9afedd9145079:


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 36 20 54 68 65 20 41 6e 64  (C) 2006 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 2f 2a 0a 2a  icense.. */./*.*
0270: 2a 20 4d 6f 64 69 66 69 65 64 20 74 6f 20 73 75  * Modified to su
0280: 70 70 6f 72 74 20 53 51 4c 69 74 65 20 65 78 74  pport SQLite ext
0290: 65 6e 73 69 6f 6e 73 20 62 79 20 74 68 65 20 53  ensions by the S
02a0: 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73  QLite developers
02b0: 3a 20 0a 2a 2a 20 73 71 6c 69 74 65 2d 64 65 76  : .** sqlite-dev
02c0: 40 73 71 6c 69 74 65 2e 6f 72 67 2e 0a 2a 2f 0a  @sqlite.org..*/.
02d0: 0a 70 61 63 6b 61 67 65 20 6f 72 67 2e 73 71 6c  .package org.sql
02e0: 69 74 65 2e 64 61 74 61 62 61 73 65 2e 73 71 6c  ite.database.sql
02f0: 69 74 65 3b 0a 0a 69 6d 70 6f 72 74 20 61 6e 64  ite;..import and
0300: 72 6f 69 64 2e 63 6f 6e 74 65 6e 74 2e 43 6f 6e  roid.content.Con
0310: 74 65 6e 74 56 61 6c 75 65 73 3b 0a 69 6d 70 6f  tentValues;.impo
0320: 72 74 20 61 6e 64 72 6f 69 64 2e 64 61 74 61 62  rt android.datab
0330: 61 73 65 2e 43 75 72 73 6f 72 3b 0a 69 6d 70 6f  ase.Cursor;.impo
0340: 72 74 20 6f 72 67 2e 73 71 6c 69 74 65 2e 64 61  rt org.sqlite.da
0350: 74 61 62 61 73 65 2e 44 61 74 61 62 61 73 65 45  tabase.DatabaseE
0360: 72 72 6f 72 48 61 6e 64 6c 65 72 3b 0a 69 6d 70  rrorHandler;.imp
0370: 6f 72 74 20 6f 72 67 2e 73 71 6c 69 74 65 2e 64  ort org.sqlite.d
0380: 61 74 61 62 61 73 65 2e 44 61 74 61 62 61 73 65  atabase.Database
0390: 55 74 69 6c 73 3b 0a 69 6d 70 6f 72 74 20 6f 72  Utils;.import or
03a0: 67 2e 73 71 6c 69 74 65 2e 64 61 74 61 62 61 73  g.sqlite.databas
03b0: 65 2e 44 65 66 61 75 6c 74 44 61 74 61 62 61 73  e.DefaultDatabas
03c0: 65 45 72 72 6f 72 48 61 6e 64 6c 65 72 3b 0a 69  eErrorHandler;.i
03d0: 6d 70 6f 72 74 20 6f 72 67 2e 73 71 6c 69 74 65  mport org.sqlite
03e0: 2e 64 61 74 61 62 61 73 65 2e 53 51 4c 45 78 63  .database.SQLExc
03f0: 65 70 74 69 6f 6e 3b 0a 69 6d 70 6f 72 74 20 6f  eption;.import o
0400: 72 67 2e 73 71 6c 69 74 65 2e 64 61 74 61 62 61  rg.sqlite.databa
0410: 73 65 2e 73 71 6c 69 74 65 2e 53 51 4c 69 74 65  se.sqlite.SQLite
0420: 44 65 62 75 67 2e 44 62 53 74 61 74 73 3b 0a 69  Debug.DbStats;.i
0430: 6d 70 6f 72 74 20 61 6e 64 72 6f 69 64 2e 6f 73  mport android.os
0440: 2e 43 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67  .CancellationSig
0450: 6e 61 6c 3b 0a 69 6d 70 6f 72 74 20 61 6e 64 72  nal;.import andr
0460: 6f 69 64 2e 6f 73 2e 4c 6f 6f 70 65 72 3b 0a 69  oid.os.Looper;.i
0470: 6d 70 6f 72 74 20 61 6e 64 72 6f 69 64 2e 6f 73  mport android.os
0480: 2e 4f 70 65 72 61 74 69 6f 6e 43 61 6e 63 65 6c  .OperationCancel
0490: 65 64 45 78 63 65 70 74 69 6f 6e 3b 0a 69 6d 70  edException;.imp
04a0: 6f 72 74 20 61 6e 64 72 6f 69 64 2e 74 65 78 74  ort android.text
04b0: 2e 54 65 78 74 55 74 69 6c 73 3b 0a 69 6d 70 6f  .TextUtils;.impo
04c0: 72 74 20 61 6e 64 72 6f 69 64 2e 75 74 69 6c 2e  rt android.util.
04d0: 45 76 65 6e 74 4c 6f 67 3b 0a 69 6d 70 6f 72 74  EventLog;.import
04e0: 20 61 6e 64 72 6f 69 64 2e 75 74 69 6c 2e 4c 6f   android.util.Lo
04f0: 67 3b 0a 69 6d 70 6f 72 74 20 61 6e 64 72 6f 69  g;.import androi
0500: 64 2e 75 74 69 6c 2e 50 61 69 72 3b 0a 69 6d 70  d.util.Pair;.imp
0510: 6f 72 74 20 61 6e 64 72 6f 69 64 2e 75 74 69 6c  ort android.util
0520: 2e 50 72 69 6e 74 65 72 3b 0a 0a 69 6d 70 6f 72  .Printer;..impor
0530: 74 20 6f 72 67 2e 73 71 6c 69 74 65 2e 64 61 74  t org.sqlite.dat
0540: 61 62 61 73 65 2e 73 71 6c 69 74 65 2e 43 6c 6f  abase.sqlite.Clo
0550: 73 65 47 75 61 72 64 3b 0a 0a 69 6d 70 6f 72 74  seGuard;..import
0560: 20 6a 61 76 61 2e 69 6f 2e 46 69 6c 65 3b 0a 69   java.io.File;.i
0570: 6d 70 6f 72 74 20 6a 61 76 61 2e 69 6f 2e 46 69  mport java.io.Fi
0580: 6c 65 46 69 6c 74 65 72 3b 0a 69 6d 70 6f 72 74  leFilter;.import
0590: 20 6a 61 76 61 2e 75 74 69 6c 2e 41 72 72 61 79   java.util.Array
05a0: 4c 69 73 74 3b 0a 69 6d 70 6f 72 74 20 6a 61 76  List;.import jav
05b0: 61 2e 75 74 69 6c 2e 48 61 73 68 4d 61 70 3b 0a  a.util.HashMap;.
05c0: 69 6d 70 6f 72 74 20 6a 61 76 61 2e 75 74 69 6c  import java.util
05d0: 2e 4c 69 73 74 3b 0a 69 6d 70 6f 72 74 20 6a 61  .List;.import ja
05e0: 76 61 2e 75 74 69 6c 2e 4c 6f 63 61 6c 65 3b 0a  va.util.Locale;.
05f0: 69 6d 70 6f 72 74 20 6a 61 76 61 2e 75 74 69 6c  import java.util
0600: 2e 4d 61 70 3b 0a 69 6d 70 6f 72 74 20 6a 61 76  .Map;.import jav
0610: 61 2e 75 74 69 6c 2e 57 65 61 6b 48 61 73 68 4d  a.util.WeakHashM
0620: 61 70 3b 0a 0a 2f 2a 2a 0a 20 2a 20 45 78 70 6f  ap;../**. * Expo
0630: 73 65 73 20 6d 65 74 68 6f 64 73 20 74 6f 20 6d  ses methods to m
0640: 61 6e 61 67 65 20 61 20 53 51 4c 69 74 65 20 64  anage a SQLite d
0650: 61 74 61 62 61 73 65 2e 0a 20 2a 0a 20 2a 20 3c  atabase.. *. * <
0660: 70 3e 0a 20 2a 20 53 51 4c 69 74 65 44 61 74 61  p>. * SQLiteData
0670: 62 61 73 65 20 68 61 73 20 6d 65 74 68 6f 64 73  base has methods
0680: 20 74 6f 20 63 72 65 61 74 65 2c 20 64 65 6c 65   to create, dele
0690: 74 65 2c 20 65 78 65 63 75 74 65 20 53 51 4c 20  te, execute SQL 
06a0: 63 6f 6d 6d 61 6e 64 73 2c 20 61 6e 64 0a 20 2a  commands, and. *
06b0: 20 70 65 72 66 6f 72 6d 20 6f 74 68 65 72 20 63   perform other c
06c0: 6f 6d 6d 6f 6e 20 64 61 74 61 62 61 73 65 20 6d  ommon database m
06d0: 61 6e 61 67 65 6d 65 6e 74 20 74 61 73 6b 73 2e  anagement tasks.
06e0: 0a 20 2a 20 3c 2f 70 3e 3c 70 3e 0a 20 2a 20 53  . * </p><p>. * S
06f0: 65 65 20 74 68 65 20 4e 6f 74 65 70 61 64 20 73  ee the Notepad s
0700: 61 6d 70 6c 65 20 61 70 70 6c 69 63 61 74 69 6f  ample applicatio
0710: 6e 20 69 6e 20 74 68 65 20 53 44 4b 20 66 6f 72  n in the SDK for
0720: 20 61 6e 20 65 78 61 6d 70 6c 65 20 6f 66 20 63   an example of c
0730: 72 65 61 74 69 6e 67 0a 20 2a 20 61 6e 64 20 6d  reating. * and m
0740: 61 6e 61 67 69 6e 67 20 61 20 64 61 74 61 62 61  anaging a databa
0750: 73 65 2e 0a 20 2a 20 3c 2f 70 3e 3c 70 3e 0a 20  se.. * </p><p>. 
0760: 2a 20 44 61 74 61 62 61 73 65 20 6e 61 6d 65 73  * Database names
0770: 20 6d 75 73 74 20 62 65 20 75 6e 69 71 75 65 20   must be unique 
0780: 77 69 74 68 69 6e 20 61 6e 20 61 70 70 6c 69 63  within an applic
0790: 61 74 69 6f 6e 2c 20 6e 6f 74 20 61 63 72 6f 73  ation, not acros
07a0: 73 20 61 6c 6c 20 61 70 70 6c 69 63 61 74 69 6f  s all applicatio
07b0: 6e 73 2e 0a 20 2a 20 3c 2f 70 3e 0a 20 2a 0a 20  ns.. * </p>. *. 
07c0: 2a 20 3c 68 33 3e 4c 6f 63 61 6c 69 7a 65 64 20  * <h3>Localized 
07d0: 43 6f 6c 6c 61 74 69 6f 6e 20 2d 20 4f 52 44 45  Collation - ORDE
07e0: 52 20 42 59 3c 2f 68 33 3e 0a 20 2a 20 3c 70 3e  R BY</h3>. * <p>
07f0: 0a 20 2a 20 49 6e 20 61 64 64 69 74 69 6f 6e 20  . * In addition 
0800: 74 6f 20 53 51 4c 69 74 65 27 73 20 64 65 66 61  to SQLite's defa
0810: 75 6c 74 20 3c 63 6f 64 65 3e 42 49 4e 41 52 59  ult <code>BINARY
0820: 3c 2f 63 6f 64 65 3e 20 63 6f 6c 6c 61 74 6f 72  </code> collator
0830: 2c 20 41 6e 64 72 6f 69 64 20 73 75 70 70 6c 69  , Android suppli
0840: 65 73 0a 20 2a 20 74 77 6f 20 6d 6f 72 65 2c 20  es. * two more, 
0850: 3c 63 6f 64 65 3e 4c 4f 43 41 4c 49 5a 45 44 3c  <code>LOCALIZED<
0860: 2f 63 6f 64 65 3e 2c 20 77 68 69 63 68 20 63 68  /code>, which ch
0870: 61 6e 67 65 73 20 77 69 74 68 20 74 68 65 20 73  anges with the s
0880: 79 73 74 65 6d 27 73 20 63 75 72 72 65 6e 74 20  ystem's current 
0890: 6c 6f 63 61 6c 65 2c 0a 20 2a 20 61 6e 64 20 3c  locale,. * and <
08a0: 63 6f 64 65 3e 55 4e 49 43 4f 44 45 3c 2f 63 6f  code>UNICODE</co
08b0: 64 65 3e 2c 20 77 68 69 63 68 20 69 73 20 74 68  de>, which is th
08c0: 65 20 55 6e 69 63 6f 64 65 20 43 6f 6c 6c 61 74  e Unicode Collat
08d0: 69 6f 6e 20 41 6c 67 6f 72 69 74 68 6d 20 61 6e  ion Algorithm an
08e0: 64 20 6e 6f 74 20 74 61 69 6c 6f 72 65 64 0a 20  d not tailored. 
08f0: 2a 20 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  * to the current
0900: 20 6c 6f 63 61 6c 65 2e 0a 20 2a 20 3c 2f 70 3e   locale.. * </p>
0910: 0a 20 2a 2f 0a 70 75 62 6c 69 63 20 66 69 6e 61  . */.public fina
0920: 6c 20 63 6c 61 73 73 20 53 51 4c 69 74 65 44 61  l class SQLiteDa
0930: 74 61 62 61 73 65 20 65 78 74 65 6e 64 73 20 53  tabase extends S
0940: 51 4c 69 74 65 43 6c 6f 73 61 62 6c 65 20 7b 0a  QLiteClosable {.
0950: 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74      private stat
0960: 69 63 20 66 69 6e 61 6c 20 53 74 72 69 6e 67 20  ic final String 
0970: 54 41 47 20 3d 20 22 53 51 4c 69 74 65 44 61 74  TAG = "SQLiteDat
0980: 61 62 61 73 65 22 3b 0a 0a 20 20 20 20 70 72 69  abase";..    pri
0990: 76 61 74 65 20 73 74 61 74 69 63 20 66 69 6e 61  vate static fina
09a0: 6c 20 69 6e 74 20 45 56 45 4e 54 5f 44 42 5f 43  l int EVENT_DB_C
09b0: 4f 52 52 55 50 54 20 3d 20 37 35 30 30 34 3b 0a  ORRUPT = 75004;.
09c0: 0a 20 20 20 20 2f 2f 20 53 74 6f 72 65 73 20 72  .    // Stores r
09d0: 65 66 65 72 65 6e 63 65 20 74 6f 20 61 6c 6c 20  eference to all 
09e0: 64 61 74 61 62 61 73 65 73 20 6f 70 65 6e 65 64  databases opened
09f0: 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74 20   in the current 
0a00: 70 72 6f 63 65 73 73 2e 0a 20 20 20 20 2f 2f 20  process..    // 
0a10: 28 54 68 65 20 72 65 66 65 72 65 6e 74 20 4f 62  (The referent Ob
0a20: 6a 65 63 74 20 69 73 20 6e 6f 74 20 75 73 65 64  ject is not used
0a30: 20 61 74 20 74 68 69 73 20 74 69 6d 65 2e 29 0a   at this time.).
0a40: 20 20 20 20 2f 2f 20 49 4e 56 41 52 49 41 4e 54      // INVARIANT
0a50: 3a 20 47 75 61 72 64 65 64 20 62 79 20 73 41 63  : Guarded by sAc
0a60: 74 69 76 65 44 61 74 61 62 61 73 65 73 2e 0a 20  tiveDatabases.. 
0a70: 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69     private stati
0a80: 63 20 57 65 61 6b 48 61 73 68 4d 61 70 3c 53 51  c WeakHashMap<SQ
0a90: 4c 69 74 65 44 61 74 61 62 61 73 65 2c 20 4f 62  LiteDatabase, Ob
0aa0: 6a 65 63 74 3e 20 73 41 63 74 69 76 65 44 61 74  ject> sActiveDat
0ab0: 61 62 61 73 65 73 20 3d 0a 20 20 20 20 20 20 20  abases =.       
0ac0: 20 20 20 20 20 6e 65 77 20 57 65 61 6b 48 61 73       new WeakHas
0ad0: 68 4d 61 70 3c 53 51 4c 69 74 65 44 61 74 61 62  hMap<SQLiteDatab
0ae0: 61 73 65 2c 20 4f 62 6a 65 63 74 3e 28 29 3b 0a  ase, Object>();.
0af0: 0a 20 20 20 20 2f 2f 20 54 68 72 65 61 64 2d 6c  .    // Thread-l
0b00: 6f 63 61 6c 20 66 6f 72 20 64 61 74 61 62 61 73  ocal for databas
0b10: 65 20 73 65 73 73 69 6f 6e 73 20 74 68 61 74 20  e sessions that 
0b20: 62 65 6c 6f 6e 67 20 74 6f 20 74 68 69 73 20 64  belong to this d
0b30: 61 74 61 62 61 73 65 2e 0a 20 20 20 20 2f 2f 20  atabase..    // 
0b40: 45 61 63 68 20 74 68 72 65 61 64 20 68 61 73 20  Each thread has 
0b50: 69 74 73 20 6f 77 6e 20 64 61 74 61 62 61 73 65  its own database
0b60: 20 73 65 73 73 69 6f 6e 2e 0a 20 20 20 20 2f 2f   session..    //
0b70: 20 49 4e 56 41 52 49 41 4e 54 3a 20 49 6d 6d 75   INVARIANT: Immu
0b80: 74 61 62 6c 65 2e 0a 20 20 20 20 70 72 69 76 61  table..    priva
0b90: 74 65 20 66 69 6e 61 6c 20 54 68 72 65 61 64 4c  te final ThreadL
0ba0: 6f 63 61 6c 3c 53 51 4c 69 74 65 53 65 73 73 69  ocal<SQLiteSessi
0bb0: 6f 6e 3e 20 6d 54 68 72 65 61 64 53 65 73 73 69  on> mThreadSessi
0bc0: 6f 6e 20 3d 20 6e 65 77 20 54 68 72 65 61 64 4c  on = new ThreadL
0bd0: 6f 63 61 6c 3c 53 51 4c 69 74 65 53 65 73 73 69  ocal<SQLiteSessi
0be0: 6f 6e 3e 28 29 20 7b 0a 20 20 20 20 20 20 20 20  on>() {.        
0bf0: 40 4f 76 65 72 72 69 64 65 0a 20 20 20 20 20 20  @Override.      
0c00: 20 20 70 72 6f 74 65 63 74 65 64 20 53 51 4c 69    protected SQLi
0c10: 74 65 53 65 73 73 69 6f 6e 20 69 6e 69 74 69 61  teSession initia
0c20: 6c 56 61 6c 75 65 28 29 20 7b 0a 20 20 20 20 20  lValue() {.     
0c30: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 63 72         return cr
0c40: 65 61 74 65 53 65 73 73 69 6f 6e 28 29 3b 0a 20  eateSession();. 
0c50: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 3b 0a         }.    };.
0c60: 0a 20 20 20 20 2f 2f 20 54 68 65 20 6f 70 74 69  .    // The opti
0c70: 6f 6e 61 6c 20 66 61 63 74 6f 72 79 20 74 6f 20  onal factory to 
0c80: 75 73 65 20 77 68 65 6e 20 63 72 65 61 74 69 6e  use when creatin
0c90: 67 20 6e 65 77 20 43 75 72 73 6f 72 73 2e 20 20  g new Cursors.  
0ca0: 4d 61 79 20 62 65 20 6e 75 6c 6c 2e 0a 20 20 20  May be null..   
0cb0: 20 2f 2f 20 49 4e 56 41 52 49 41 4e 54 3a 20 49   // INVARIANT: I
0cc0: 6d 6d 75 74 61 62 6c 65 2e 0a 20 20 20 20 70 72  mmutable..    pr
0cd0: 69 76 61 74 65 20 66 69 6e 61 6c 20 43 75 72 73  ivate final Curs
0ce0: 6f 72 46 61 63 74 6f 72 79 20 6d 43 75 72 73 6f  orFactory mCurso
0cf0: 72 46 61 63 74 6f 72 79 3b 0a 0a 20 20 20 20 2f  rFactory;..    /
0d00: 2f 20 45 72 72 6f 72 20 68 61 6e 64 6c 65 72 20  / Error handler 
0d10: 74 6f 20 62 65 20 75 73 65 64 20 77 68 65 6e 20  to be used when 
0d20: 53 51 4c 69 74 65 20 72 65 74 75 72 6e 73 20 63  SQLite returns c
0d30: 6f 72 72 75 70 74 69 6f 6e 20 65 72 72 6f 72 73  orruption errors
0d40: 2e 0a 20 20 20 20 2f 2f 20 49 4e 56 41 52 49 41  ..    // INVARIA
0d50: 4e 54 3a 20 49 6d 6d 75 74 61 62 6c 65 2e 0a 20  NT: Immutable.. 
0d60: 20 20 20 70 72 69 76 61 74 65 20 66 69 6e 61 6c     private final
0d70: 20 44 61 74 61 62 61 73 65 45 72 72 6f 72 48 61   DatabaseErrorHa
0d80: 6e 64 6c 65 72 20 6d 45 72 72 6f 72 48 61 6e 64  ndler mErrorHand
0d90: 6c 65 72 3b 0a 0a 20 20 20 20 2f 2f 20 53 68 61  ler;..    // Sha
0da0: 72 65 64 20 64 61 74 61 62 61 73 65 20 73 74 61  red database sta
0db0: 74 65 20 6c 6f 63 6b 2e 0a 20 20 20 20 2f 2f 20  te lock..    // 
0dc0: 54 68 69 73 20 6c 6f 63 6b 20 67 75 61 72 64 73  This lock guards
0dd0: 20 61 6c 6c 20 6f 66 20 74 68 65 20 73 68 61 72   all of the shar
0de0: 65 64 20 73 74 61 74 65 20 6f 66 20 74 68 65 20  ed state of the 
0df0: 64 61 74 61 62 61 73 65 2c 20 73 75 63 68 20 61  database, such a
0e00: 73 20 69 74 73 0a 20 20 20 20 2f 2f 20 63 6f 6e  s its.    // con
0e10: 66 69 67 75 72 61 74 69 6f 6e 2c 20 77 68 65 74  figuration, whet
0e20: 68 65 72 20 69 74 20 69 73 20 6f 70 65 6e 20 6f  her it is open o
0e30: 72 20 63 6c 6f 73 65 64 2c 20 61 6e 64 20 73 6f  r closed, and so
0e40: 20 6f 6e 2e 20 20 54 68 69 73 20 6c 6f 63 6b 20   on.  This lock 
0e50: 73 68 6f 75 6c 64 0a 20 20 20 20 2f 2f 20 62 65  should.    // be
0e60: 20 68 65 6c 64 20 66 6f 72 20 61 73 20 6c 69 74   held for as lit
0e70: 74 6c 65 20 74 69 6d 65 20 61 73 20 70 6f 73 73  tle time as poss
0e80: 69 62 6c 65 2e 0a 20 20 20 20 2f 2f 0a 20 20 20  ible..    //.   
0e90: 20 2f 2f 20 54 68 65 20 6c 6f 63 6b 20 4d 55 53   // The lock MUS
0ea0: 54 20 4e 4f 54 20 62 65 20 68 65 6c 64 20 77 68  T NOT be held wh
0eb0: 69 6c 65 20 61 74 74 65 6d 70 74 69 6e 67 20 74  ile attempting t
0ec0: 6f 20 61 63 71 75 69 72 65 20 64 61 74 61 62 61  o acquire databa
0ed0: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 6f  se connections o
0ee0: 72 0a 20 20 20 20 2f 2f 20 77 68 69 6c 65 20 65  r.    // while e
0ef0: 78 65 63 75 74 69 6e 67 20 53 51 4c 20 73 74 61  xecuting SQL sta
0f00: 74 65 6d 65 6e 74 73 20 6f 6e 20 62 65 68 61 6c  tements on behal
0f10: 66 20 6f 66 20 74 68 65 20 63 6c 69 65 6e 74 20  f of the client 
0f20: 61 73 20 69 74 20 63 61 6e 20 6c 65 61 64 20 74  as it can lead t
0f30: 6f 20 64 65 61 64 6c 6f 63 6b 2e 0a 20 20 20 20  o deadlock..    
0f40: 2f 2f 0a 20 20 20 20 2f 2f 20 49 74 20 69 73 20  //.    // It is 
0f50: 6f 6b 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6c  ok to hold the l
0f60: 6f 63 6b 20 77 68 69 6c 65 20 72 65 63 6f 6e 66  ock while reconf
0f70: 69 67 75 72 69 6e 67 20 74 68 65 20 63 6f 6e 6e  iguring the conn
0f80: 65 63 74 69 6f 6e 20 70 6f 6f 6c 20 6f 72 20 64  ection pool or d
0f90: 75 6d 70 69 6e 67 0a 20 20 20 20 2f 2f 20 73 74  umping.    // st
0fa0: 61 74 69 73 74 69 63 73 20 62 65 63 61 75 73 65  atistics because
0fb0: 20 74 68 6f 73 65 20 6f 70 65 72 61 74 69 6f 6e   those operation
0fc0: 73 20 61 72 65 20 6e 6f 6e 2d 72 65 65 6e 74 72  s are non-reentr
0fd0: 61 6e 74 20 61 6e 64 20 64 6f 20 6e 6f 74 20 74  ant and do not t
0fe0: 72 79 20 74 6f 20 61 63 71 75 69 72 65 0a 20 20  ry to acquire.  
0ff0: 20 20 2f 2f 20 63 6f 6e 6e 65 63 74 69 6f 6e 73    // connections
1000: 20 74 68 61 74 20 6d 69 67 68 74 20 62 65 20 68   that might be h
1010: 65 6c 64 20 62 79 20 6f 74 68 65 72 20 74 68 72  eld by other thr
1020: 65 61 64 73 2e 0a 20 20 20 20 2f 2f 0a 20 20 20  eads..    //.   
1030: 20 2f 2f 20 42 61 73 69 63 20 72 75 6c 65 3a 20   // Basic rule: 
1040: 67 72 61 62 20 74 68 65 20 6c 6f 63 6b 2c 20 61  grab the lock, a
1050: 63 63 65 73 73 20 6f 72 20 6d 6f 64 69 66 79 20  ccess or modify 
1060: 67 6c 6f 62 61 6c 20 73 74 61 74 65 2c 20 72 65  global state, re
1070: 6c 65 61 73 65 20 74 68 65 20 6c 6f 63 6b 2c 20  lease the lock, 
1080: 74 68 65 6e 0a 20 20 20 20 2f 2f 20 64 6f 20 74  then.    // do t
1090: 68 65 20 72 65 71 75 69 72 65 64 20 53 51 4c 20  he required SQL 
10a0: 77 6f 72 6b 2e 0a 20 20 20 20 70 72 69 76 61 74  work..    privat
10b0: 65 20 66 69 6e 61 6c 20 4f 62 6a 65 63 74 20 6d  e final Object m
10c0: 4c 6f 63 6b 20 3d 20 6e 65 77 20 4f 62 6a 65 63  Lock = new Objec
10d0: 74 28 29 3b 0a 0a 20 20 20 20 2f 2f 20 57 61 72  t();..    // War
10e0: 6e 73 20 69 66 20 74 68 65 20 64 61 74 61 62 61  ns if the databa
10f0: 73 65 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 20  se is finalized 
1100: 77 69 74 68 6f 75 74 20 62 65 69 6e 67 20 63 6c  without being cl
1110: 6f 73 65 64 20 70 72 6f 70 65 72 6c 79 2e 0a 20  osed properly.. 
1120: 20 20 20 2f 2f 20 49 4e 56 41 52 49 41 4e 54 3a     // INVARIANT:
1130: 20 47 75 61 72 64 65 64 20 62 79 20 6d 4c 6f 63   Guarded by mLoc
1140: 6b 2e 0a 20 20 20 20 70 72 69 76 61 74 65 20 66  k..    private f
1150: 69 6e 61 6c 20 43 6c 6f 73 65 47 75 61 72 64 20  inal CloseGuard 
1160: 6d 43 6c 6f 73 65 47 75 61 72 64 4c 6f 63 6b 65  mCloseGuardLocke
1170: 64 20 3d 20 43 6c 6f 73 65 47 75 61 72 64 2e 67  d = CloseGuard.g
1180: 65 74 28 29 3b 0a 0a 20 20 20 20 2f 2f 20 54 68  et();..    // Th
1190: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 66 69  e database confi
11a0: 67 75 72 61 74 69 6f 6e 2e 0a 20 20 20 20 2f 2f  guration..    //
11b0: 20 49 4e 56 41 52 49 41 4e 54 3a 20 47 75 61 72   INVARIANT: Guar
11c0: 64 65 64 20 62 79 20 6d 4c 6f 63 6b 2e 0a 20 20  ded by mLock..  
11d0: 20 20 70 72 69 76 61 74 65 20 66 69 6e 61 6c 20    private final 
11e0: 53 51 4c 69 74 65 44 61 74 61 62 61 73 65 43 6f  SQLiteDatabaseCo
11f0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6d 43 6f 6e  nfiguration mCon
1200: 66 69 67 75 72 61 74 69 6f 6e 4c 6f 63 6b 65 64  figurationLocked
1210: 3b 0a 0a 20 20 20 20 2f 2f 20 54 68 65 20 63 6f  ;..    // The co
1220: 6e 6e 65 63 74 69 6f 6e 20 70 6f 6f 6c 20 66 6f  nnection pool fo
1230: 72 20 74 68 65 20 64 61 74 61 62 61 73 65 2c 20  r the database, 
1240: 6e 75 6c 6c 20 77 68 65 6e 20 63 6c 6f 73 65 64  null when closed
1250: 2e 0a 20 20 20 20 2f 2f 20 54 68 65 20 70 6f 6f  ..    // The poo
1260: 6c 20 69 74 73 65 6c 66 20 69 73 20 74 68 72 65  l itself is thre
1270: 61 64 2d 73 61 66 65 2c 20 62 75 74 20 74 68 65  ad-safe, but the
1280: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74   reference to it
1290: 20 63 61 6e 20 6f 6e 6c 79 20 62 65 20 61 63 71   can only be acq
12a0: 75 69 72 65 64 0a 20 20 20 20 2f 2f 20 77 68 65  uired.    // whe
12b0: 6e 20 74 68 65 20 6c 6f 63 6b 20 69 73 20 68 65  n the lock is he
12c0: 6c 64 2e 0a 20 20 20 20 2f 2f 20 49 4e 56 41 52  ld..    // INVAR
12d0: 49 41 4e 54 3a 20 47 75 61 72 64 65 64 20 62 79  IANT: Guarded by
12e0: 20 6d 4c 6f 63 6b 2e 0a 20 20 20 20 70 72 69 76   mLock..    priv
12f0: 61 74 65 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63  ate SQLiteConnec
1300: 74 69 6f 6e 50 6f 6f 6c 20 6d 43 6f 6e 6e 65 63  tionPool mConnec
1310: 74 69 6f 6e 50 6f 6f 6c 4c 6f 63 6b 65 64 3b 0a  tionPoolLocked;.
1320: 0a 20 20 20 20 2f 2f 20 54 72 75 65 20 69 66 20  .    // True if 
1330: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61 73  the database has
1340: 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
1350: 73 65 73 2e 0a 20 20 20 20 2f 2f 20 49 4e 56 41  ses..    // INVA
1360: 52 49 41 4e 54 3a 20 47 75 61 72 64 65 64 20 62  RIANT: Guarded b
1370: 79 20 6d 4c 6f 63 6b 2e 0a 20 20 20 20 70 72 69  y mLock..    pri
1380: 76 61 74 65 20 62 6f 6f 6c 65 61 6e 20 6d 48 61  vate boolean mHa
1390: 73 41 74 74 61 63 68 65 64 44 62 73 4c 6f 63 6b  sAttachedDbsLock
13a0: 65 64 3b 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20  ed;..    /**.   
13b0: 20 20 2a 20 57 68 65 6e 20 61 20 63 6f 6e 73 74    * When a const
13c0: 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 20  raint violation 
13d0: 6f 63 63 75 72 73 2c 20 61 6e 20 69 6d 6d 65 64  occurs, an immed
13e0: 69 61 74 65 20 52 4f 4c 4c 42 41 43 4b 20 6f 63  iate ROLLBACK oc
13f0: 63 75 72 73 2c 0a 20 20 20 20 20 2a 20 74 68 75  curs,.     * thu
1400: 73 20 65 6e 64 69 6e 67 20 74 68 65 20 63 75 72  s ending the cur
1410: 72 65 6e 74 20 74 72 61 6e 73 61 63 74 69 6f 6e  rent transaction
1420: 2c 20 61 6e 64 20 74 68 65 20 63 6f 6d 6d 61 6e  , and the comman
1430: 64 20 61 62 6f 72 74 73 20 77 69 74 68 20 61 0a  d aborts with a.
1440: 20 20 20 20 20 2a 20 72 65 74 75 72 6e 20 63 6f       * return co
1450: 64 65 20 6f 66 20 53 51 4c 49 54 45 5f 43 4f 4e  de of SQLITE_CON
1460: 53 54 52 41 49 4e 54 2e 20 49 66 20 6e 6f 20 74  STRAINT. If no t
1470: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 63  ransaction is ac
1480: 74 69 76 65 0a 20 20 20 20 20 2a 20 28 6f 74 68  tive.     * (oth
1490: 65 72 20 74 68 61 6e 20 74 68 65 20 69 6d 70 6c  er than the impl
14a0: 69 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ied transaction 
14b0: 74 68 61 74 20 69 73 20 63 72 65 61 74 65 64 20  that is created 
14c0: 6f 6e 20 65 76 65 72 79 20 63 6f 6d 6d 61 6e 64  on every command
14d0: 29 0a 20 20 20 20 20 2a 20 74 68 65 6e 20 74 68  ).     * then th
14e0: 69 73 20 61 6c 67 6f 72 69 74 68 6d 20 77 6f 72  is algorithm wor
14f0: 6b 73 20 74 68 65 20 73 61 6d 65 20 61 73 20 41  ks the same as A
1500: 42 4f 52 54 2e 0a 20 20 20 20 20 2a 2f 0a 20 20  BORT..     */.  
1510: 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20    public static 
1520: 66 69 6e 61 6c 20 69 6e 74 20 43 4f 4e 46 4c 49  final int CONFLI
1530: 43 54 5f 52 4f 4c 4c 42 41 43 4b 20 3d 20 31 3b  CT_ROLLBACK = 1;
1540: 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a  ..    /**.     *
1550: 20 57 68 65 6e 20 61 20 63 6f 6e 73 74 72 61 69   When a constrai
1560: 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 20 6f 63 63  nt violation occ
1570: 75 72 73 2c 6e 6f 20 52 4f 4c 4c 42 41 43 4b 20  urs,no ROLLBACK 
1580: 69 73 20 65 78 65 63 75 74 65 64 0a 20 20 20 20  is executed.    
1590: 20 2a 20 73 6f 20 63 68 61 6e 67 65 73 20 66 72   * so changes fr
15a0: 6f 6d 20 70 72 69 6f 72 20 63 6f 6d 6d 61 6e 64  om prior command
15b0: 73 20 77 69 74 68 69 6e 20 74 68 65 20 73 61 6d  s within the sam
15c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 0a 20 20  e transaction.  
15d0: 20 20 20 2a 20 61 72 65 20 70 72 65 73 65 72 76     * are preserv
15e0: 65 64 2e 20 54 68 69 73 20 69 73 20 74 68 65 20  ed. This is the 
15f0: 64 65 66 61 75 6c 74 20 62 65 68 61 76 69 6f 72  default behavior
1600: 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 75  ..     */.    pu
1610: 62 6c 69 63 20 73 74 61 74 69 63 20 66 69 6e 61  blic static fina
1620: 6c 20 69 6e 74 20 43 4f 4e 46 4c 49 43 54 5f 41  l int CONFLICT_A
1630: 42 4f 52 54 20 3d 20 32 3b 0a 0a 20 20 20 20 2f  BORT = 2;..    /
1640: 2a 2a 0a 20 20 20 20 20 2a 20 57 68 65 6e 20 61  **.     * When a
1650: 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c   constraint viol
1660: 61 74 69 6f 6e 20 6f 63 63 75 72 73 2c 20 74 68  ation occurs, th
1670: 65 20 63 6f 6d 6d 61 6e 64 20 61 62 6f 72 74 73  e command aborts
1680: 20 77 69 74 68 20 61 20 72 65 74 75 72 6e 0a 20   with a return. 
1690: 20 20 20 20 2a 20 63 6f 64 65 20 53 51 4c 49 54      * code SQLIT
16a0: 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2e 20 42 75  E_CONSTRAINT. Bu
16b0: 74 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f  t any changes to
16c0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 74 68   the database th
16d0: 61 74 0a 20 20 20 20 20 2a 20 74 68 65 20 63 6f  at.     * the co
16e0: 6d 6d 61 6e 64 20 6d 61 64 65 20 70 72 69 6f 72  mmand made prior
16f0: 20 74 6f 20 65 6e 63 6f 75 6e 74 65 72 69 6e 67   to encountering
1700: 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e 74 20   the constraint 
1710: 76 69 6f 6c 61 74 69 6f 6e 0a 20 20 20 20 20 2a  violation.     *
1720: 20 61 72 65 20 70 72 65 73 65 72 76 65 64 20 61   are preserved a
1730: 6e 64 20 61 72 65 20 6e 6f 74 20 62 61 63 6b 65  nd are not backe
1740: 64 20 6f 75 74 2e 0a 20 20 20 20 20 2a 2f 0a 20  d out..     */. 
1750: 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63     public static
1760: 20 66 69 6e 61 6c 20 69 6e 74 20 43 4f 4e 46 4c   final int CONFL
1770: 49 43 54 5f 46 41 49 4c 20 3d 20 33 3b 0a 0a 20  ICT_FAIL = 3;.. 
1780: 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 57 68     /**.     * Wh
1790: 65 6e 20 61 20 63 6f 6e 73 74 72 61 69 6e 74 20  en a constraint 
17a0: 76 69 6f 6c 61 74 69 6f 6e 20 6f 63 63 75 72 73  violation occurs
17b0: 2c 20 74 68 65 20 6f 6e 65 20 72 6f 77 20 74 68  , the one row th
17c0: 61 74 20 63 6f 6e 74 61 69 6e 73 0a 20 20 20 20  at contains.    
17d0: 20 2a 20 74 68 65 20 63 6f 6e 73 74 72 61 69 6e   * the constrain
17e0: 74 20 76 69 6f 6c 61 74 69 6f 6e 20 69 73 20 6e  t violation is n
17f0: 6f 74 20 69 6e 73 65 72 74 65 64 20 6f 72 20 63  ot inserted or c
1800: 68 61 6e 67 65 64 2e 0a 20 20 20 20 20 2a 20 42  hanged..     * B
1810: 75 74 20 74 68 65 20 63 6f 6d 6d 61 6e 64 20 63  ut the command c
1820: 6f 6e 74 69 6e 75 65 73 20 65 78 65 63 75 74 69  ontinues executi
1830: 6e 67 20 6e 6f 72 6d 61 6c 6c 79 2e 20 4f 74 68  ng normally. Oth
1840: 65 72 20 72 6f 77 73 20 62 65 66 6f 72 65 20 61  er rows before a
1850: 6e 64 0a 20 20 20 20 20 2a 20 61 66 74 65 72 20  nd.     * after 
1860: 74 68 65 20 72 6f 77 20 74 68 61 74 20 63 6f 6e  the row that con
1870: 74 61 69 6e 65 64 20 74 68 65 20 63 6f 6e 73 74  tained the const
1880: 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f 6e 20  raint violation 
1890: 63 6f 6e 74 69 6e 75 65 20 74 6f 20 62 65 0a 20  continue to be. 
18a0: 20 20 20 20 2a 20 69 6e 73 65 72 74 65 64 20 6f      * inserted o
18b0: 72 20 75 70 64 61 74 65 64 20 6e 6f 72 6d 61 6c  r updated normal
18c0: 6c 79 2e 20 4e 6f 20 65 72 72 6f 72 20 69 73 20  ly. No error is 
18d0: 72 65 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 2a  returned..     *
18e0: 2f 0a 20 20 20 20 70 75 62 6c 69 63 20 73 74 61  /.    public sta
18f0: 74 69 63 20 66 69 6e 61 6c 20 69 6e 74 20 43 4f  tic final int CO
1900: 4e 46 4c 49 43 54 5f 49 47 4e 4f 52 45 20 3d 20  NFLICT_IGNORE = 
1910: 34 3b 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20  4;..    /**.    
1920: 20 2a 20 57 68 65 6e 20 61 20 55 4e 49 51 55 45   * When a UNIQUE
1930: 20 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c   constraint viol
1940: 61 74 69 6f 6e 20 6f 63 63 75 72 73 2c 20 74 68  ation occurs, th
1950: 65 20 70 72 65 2d 65 78 69 73 74 69 6e 67 20 72  e pre-existing r
1960: 6f 77 73 20 74 68 61 74 0a 20 20 20 20 20 2a 20  ows that.     * 
1970: 61 72 65 20 63 61 75 73 69 6e 67 20 74 68 65 20  are causing the 
1980: 63 6f 6e 73 74 72 61 69 6e 74 20 76 69 6f 6c 61  constraint viola
1990: 74 69 6f 6e 20 61 72 65 20 72 65 6d 6f 76 65 64  tion are removed
19a0: 20 70 72 69 6f 72 20 74 6f 20 69 6e 73 65 72 74   prior to insert
19b0: 69 6e 67 0a 20 20 20 20 20 2a 20 6f 72 20 75 70  ing.     * or up
19c0: 64 61 74 69 6e 67 20 74 68 65 20 63 75 72 72 65  dating the curre
19d0: 6e 74 20 72 6f 77 2e 20 54 68 75 73 20 74 68 65  nt row. Thus the
19e0: 20 69 6e 73 65 72 74 20 6f 72 20 75 70 64 61 74   insert or updat
19f0: 65 20 61 6c 77 61 79 73 20 6f 63 63 75 72 73 2e  e always occurs.
1a00: 0a 20 20 20 20 20 2a 20 54 68 65 20 63 6f 6d 6d  .     * The comm
1a10: 61 6e 64 20 63 6f 6e 74 69 6e 75 65 73 20 65 78  and continues ex
1a20: 65 63 75 74 69 6e 67 20 6e 6f 72 6d 61 6c 6c 79  ecuting normally
1a30: 2e 20 4e 6f 20 65 72 72 6f 72 20 69 73 20 72 65  . No error is re
1a40: 74 75 72 6e 65 64 2e 0a 20 20 20 20 20 2a 20 49  turned..     * I
1a50: 66 20 61 20 4e 4f 54 20 4e 55 4c 4c 20 63 6f 6e  f a NOT NULL con
1a60: 73 74 72 61 69 6e 74 20 76 69 6f 6c 61 74 69 6f  straint violatio
1a70: 6e 20 6f 63 63 75 72 73 2c 20 74 68 65 20 4e 55  n occurs, the NU
1a80: 4c 4c 20 76 61 6c 75 65 20 69 73 20 72 65 70 6c  LL value is repl
1a90: 61 63 65 64 0a 20 20 20 20 20 2a 20 62 79 20 74  aced.     * by t
1aa0: 68 65 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65  he default value
1ab0: 20 66 6f 72 20 74 68 61 74 20 63 6f 6c 75 6d 6e   for that column
1ac0: 2e 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  . If the column 
1ad0: 68 61 73 20 6e 6f 20 64 65 66 61 75 6c 74 0a 20  has no default. 
1ae0: 20 20 20 20 2a 20 76 61 6c 75 65 2c 20 74 68 65      * value, the
1af0: 6e 20 74 68 65 20 41 42 4f 52 54 20 61 6c 67 6f  n the ABORT algo
1b00: 72 69 74 68 6d 20 69 73 20 75 73 65 64 2e 20 49  rithm is used. I
1b10: 66 20 61 20 43 48 45 43 4b 20 63 6f 6e 73 74 72  f a CHECK constr
1b20: 61 69 6e 74 0a 20 20 20 20 20 2a 20 76 69 6f 6c  aint.     * viol
1b30: 61 74 69 6f 6e 20 6f 63 63 75 72 73 20 74 68 65  ation occurs the
1b40: 6e 20 74 68 65 20 49 47 4e 4f 52 45 20 61 6c 67  n the IGNORE alg
1b50: 6f 72 69 74 68 6d 20 69 73 20 75 73 65 64 2e 20  orithm is used. 
1b60: 57 68 65 6e 20 74 68 69 73 20 63 6f 6e 66 6c 69  When this confli
1b70: 63 74 0a 20 20 20 20 20 2a 20 72 65 73 6f 6c 75  ct.     * resolu
1b80: 74 69 6f 6e 20 73 74 72 61 74 65 67 79 20 64 65  tion strategy de
1b90: 6c 65 74 65 73 20 72 6f 77 73 20 69 6e 20 6f 72  letes rows in or
1ba0: 64 65 72 20 74 6f 20 73 61 74 69 73 66 79 20 61  der to satisfy a
1bb0: 20 63 6f 6e 73 74 72 61 69 6e 74 2c 0a 20 20 20   constraint,.   
1bc0: 20 20 2a 20 69 74 20 64 6f 65 73 20 6e 6f 74 20    * it does not 
1bd0: 69 6e 76 6f 6b 65 20 64 65 6c 65 74 65 20 74 72  invoke delete tr
1be0: 69 67 67 65 72 73 20 6f 6e 20 74 68 6f 73 65 20  iggers on those 
1bf0: 72 6f 77 73 2e 0a 20 20 20 20 20 2a 20 54 68 69  rows..     * Thi
1c00: 73 20 62 65 68 61 76 69 6f 72 20 6d 69 67 68 74  s behavior might
1c10: 20 63 68 61 6e 67 65 20 69 6e 20 61 20 66 75 74   change in a fut
1c20: 75 72 65 20 72 65 6c 65 61 73 65 2e 0a 20 20 20  ure release..   
1c30: 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20    */.    public 
1c40: 73 74 61 74 69 63 20 66 69 6e 61 6c 20 69 6e 74  static final int
1c50: 20 43 4f 4e 46 4c 49 43 54 5f 52 45 50 4c 41 43   CONFLICT_REPLAC
1c60: 45 20 3d 20 35 3b 0a 0a 20 20 20 20 2f 2a 2a 0a  E = 5;..    /**.
1c70: 20 20 20 20 20 2a 20 55 73 65 20 74 68 65 20 66       * Use the f
1c80: 6f 6c 6c 6f 77 69 6e 67 20 77 68 65 6e 20 6e 6f  ollowing when no
1c90: 20 63 6f 6e 66 6c 69 63 74 20 61 63 74 69 6f 6e   conflict action
1ca0: 20 69 73 20 73 70 65 63 69 66 69 65 64 2e 0a 20   is specified.. 
1cb0: 20 20 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69      */.    publi
1cc0: 63 20 73 74 61 74 69 63 20 66 69 6e 61 6c 20 69  c static final i
1cd0: 6e 74 20 43 4f 4e 46 4c 49 43 54 5f 4e 4f 4e 45  nt CONFLICT_NONE
1ce0: 20 3d 20 30 3b 0a 0a 20 20 20 20 70 72 69 76 61   = 0;..    priva
1cf0: 74 65 20 73 74 61 74 69 63 20 66 69 6e 61 6c 20  te static final 
1d00: 53 74 72 69 6e 67 5b 5d 20 43 4f 4e 46 4c 49 43  String[] CONFLIC
1d10: 54 5f 56 41 4c 55 45 53 20 3d 20 6e 65 77 20 53  T_VALUES = new S
1d20: 74 72 69 6e 67 5b 5d 0a 20 20 20 20 20 20 20 20  tring[].        
1d30: 20 20 20 20 7b 22 22 2c 20 22 20 4f 52 20 52 4f      {"", " OR RO
1d40: 4c 4c 42 41 43 4b 20 22 2c 20 22 20 4f 52 20 41  LLBACK ", " OR A
1d50: 42 4f 52 54 20 22 2c 20 22 20 4f 52 20 46 41 49  BORT ", " OR FAI
1d60: 4c 20 22 2c 20 22 20 4f 52 20 49 47 4e 4f 52 45  L ", " OR IGNORE
1d70: 20 22 2c 20 22 20 4f 52 20 52 45 50 4c 41 43 45   ", " OR REPLACE
1d80: 20 22 7d 3b 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20   "};..    /**.  
1d90: 20 20 20 2a 20 4d 61 78 69 6d 75 6d 20 4c 65 6e     * Maximum Len
1da0: 67 74 68 20 4f 66 20 41 20 4c 49 4b 45 20 4f 72  gth Of A LIKE Or
1db0: 20 47 4c 4f 42 20 50 61 74 74 65 72 6e 0a 20 20   GLOB Pattern.  
1dc0: 20 20 20 2a 20 54 68 65 20 70 61 74 74 65 72 6e     * The pattern
1dd0: 20 6d 61 74 63 68 69 6e 67 20 61 6c 67 6f 72 69   matching algori
1de0: 74 68 6d 20 75 73 65 64 20 69 6e 20 74 68 65 20  thm used in the 
1df0: 64 65 66 61 75 6c 74 20 4c 49 4b 45 20 61 6e 64  default LIKE and
1e00: 20 47 4c 4f 42 20 69 6d 70 6c 65 6d 65 6e 74 61   GLOB implementa
1e10: 74 69 6f 6e 0a 20 20 20 20 20 2a 20 6f 66 20 53  tion.     * of S
1e20: 51 4c 69 74 65 20 63 61 6e 20 65 78 68 69 62 69  QLite can exhibi
1e30: 74 20 4f 28 4e 5e 32 29 20 70 65 72 66 6f 72 6d  t O(N^2) perform
1e40: 61 6e 63 65 20 28 77 68 65 72 65 20 4e 20 69 73  ance (where N is
1e50: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
1e60: 68 61 72 61 63 74 65 72 73 20 69 6e 0a 20 20 20  haracters in.   
1e70: 20 20 2a 20 74 68 65 20 70 61 74 74 65 72 6e 29    * the pattern)
1e80: 20 66 6f 72 20 63 65 72 74 61 69 6e 20 70 61 74   for certain pat
1e90: 68 6f 6c 6f 67 69 63 61 6c 20 63 61 73 65 73 2e  hological cases.
1ea0: 20 54 6f 20 61 76 6f 69 64 20 64 65 6e 69 61 6c   To avoid denial
1eb0: 2d 6f 66 2d 73 65 72 76 69 63 65 20 61 74 74 61  -of-service atta
1ec0: 63 6b 73 0a 20 20 20 20 20 2a 20 74 68 65 20 6c  cks.     * the l
1ed0: 65 6e 67 74 68 20 6f 66 20 74 68 65 20 4c 49 4b  ength of the LIK
1ee0: 45 20 6f 72 20 47 4c 4f 42 20 70 61 74 74 65 72  E or GLOB patter
1ef0: 6e 20 69 73 20 6c 69 6d 69 74 65 64 20 74 6f 20  n is limited to 
1f00: 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45 5f  SQLITE_MAX_LIKE_
1f10: 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20 62  PATTERN_LENGTH b
1f20: 79 74 65 73 2e 0a 20 20 20 20 20 2a 20 54 68 65  ytes..     * The
1f30: 20 64 65 66 61 75 6c 74 20 76 61 6c 75 65 20 6f   default value o
1f40: 66 20 74 68 69 73 20 6c 69 6d 69 74 20 69 73 20  f this limit is 
1f50: 35 30 30 30 30 2e 20 41 20 6d 6f 64 65 72 6e 20  50000. A modern 
1f60: 77 6f 72 6b 73 74 61 74 69 6f 6e 20 63 61 6e 20  workstation can 
1f70: 65 76 61 6c 75 61 74 65 0a 20 20 20 20 20 2a 20  evaluate.     * 
1f80: 65 76 65 6e 20 61 20 70 61 74 68 6f 6c 6f 67 69  even a pathologi
1f90: 63 61 6c 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42  cal LIKE or GLOB
1fa0: 20 70 61 74 74 65 72 6e 20 6f 66 20 35 30 30 30   pattern of 5000
1fb0: 30 20 62 79 74 65 73 20 72 65 6c 61 74 69 76 65  0 bytes relative
1fc0: 6c 79 20 71 75 69 63 6b 6c 79 2e 0a 20 20 20 20  ly quickly..    
1fd0: 20 2a 20 54 68 65 20 64 65 6e 69 61 6c 20 6f 66   * The denial of
1fe0: 20 73 65 72 76 69 63 65 20 70 72 6f 62 6c 65 6d   service problem
1ff0: 20 6f 6e 6c 79 20 63 6f 6d 65 73 20 69 6e 74 6f   only comes into
2000: 20 70 6c 61 79 20 77 68 65 6e 20 74 68 65 20 70   play when the p
2010: 61 74 74 65 72 6e 20 6c 65 6e 67 74 68 20 67 65  attern length ge
2020: 74 73 0a 20 20 20 20 20 2a 20 69 6e 74 6f 20 6d  ts.     * into m
2030: 69 6c 6c 69 6f 6e 73 20 6f 66 20 62 79 74 65 73  illions of bytes
2040: 2e 20 4e 65 76 65 72 74 68 65 6c 65 73 73 2c 20  . Nevertheless, 
2050: 73 69 6e 63 65 20 6d 6f 73 74 20 75 73 65 66 75  since most usefu
2060: 6c 20 4c 49 4b 45 20 6f 72 20 47 4c 4f 42 20 70  l LIKE or GLOB p
2070: 61 74 74 65 72 6e 73 0a 20 20 20 20 20 2a 20 61  atterns.     * a
2080: 72 65 20 61 74 20 6d 6f 73 74 20 61 20 66 65 77  re at most a few
2090: 20 64 6f 7a 65 6e 20 62 79 74 65 73 20 69 6e 20   dozen bytes in 
20a0: 6c 65 6e 67 74 68 2c 20 70 61 72 61 6e 6f 69 64  length, paranoid
20b0: 20 61 70 70 6c 69 63 61 74 69 6f 6e 20 64 65 76   application dev
20c0: 65 6c 6f 70 65 72 73 20 6d 61 79 0a 20 20 20 20  elopers may.    
20d0: 20 2a 20 77 61 6e 74 20 74 6f 20 72 65 64 75 63   * want to reduc
20e0: 65 20 74 68 69 73 20 70 61 72 61 6d 65 74 65 72  e this parameter
20f0: 20 74 6f 20 73 6f 6d 65 74 68 69 6e 67 20 69 6e   to something in
2100: 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 61 20   the range of a 
2110: 66 65 77 20 68 75 6e 64 72 65 64 0a 20 20 20 20  few hundred.    
2120: 20 2a 20 69 66 20 74 68 65 79 20 6b 6e 6f 77 20   * if they know 
2130: 74 68 61 74 20 65 78 74 65 72 6e 61 6c 20 75 73  that external us
2140: 65 72 73 20 61 72 65 20 61 62 6c 65 20 74 6f 20  ers are able to 
2150: 67 65 6e 65 72 61 74 65 20 61 72 62 69 74 72 61  generate arbitra
2160: 72 79 20 70 61 74 74 65 72 6e 73 2e 0a 20 20 20  ry patterns..   
2170: 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20    */.    public 
2180: 73 74 61 74 69 63 20 66 69 6e 61 6c 20 69 6e 74  static final int
2190: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 4c 49 4b 45   SQLITE_MAX_LIKE
21a0: 5f 50 41 54 54 45 52 4e 5f 4c 45 4e 47 54 48 20  _PATTERN_LENGTH 
21b0: 3d 20 35 30 30 30 30 3b 0a 0a 20 20 20 20 2f 2a  = 50000;..    /*
21c0: 2a 0a 20 20 20 20 20 2a 20 4f 70 65 6e 20 66 6c  *.     * Open fl
21d0: 61 67 3a 20 46 6c 61 67 20 66 6f 72 20 7b 40 6c  ag: Flag for {@l
21e0: 69 6e 6b 20 23 6f 70 65 6e 44 61 74 61 62 61 73  ink #openDatabas
21f0: 65 7d 20 74 6f 20 6f 70 65 6e 20 74 68 65 20 64  e} to open the d
2200: 61 74 61 62 61 73 65 20 66 6f 72 20 72 65 61 64  atabase for read
2210: 69 6e 67 20 61 6e 64 20 77 72 69 74 69 6e 67 2e  ing and writing.
2220: 0a 20 20 20 20 20 2a 20 49 66 20 74 68 65 20 64  .     * If the d
2230: 69 73 6b 20 69 73 20 66 75 6c 6c 2c 20 74 68 69  isk is full, thi
2240: 73 20 6d 61 79 20 66 61 69 6c 20 65 76 65 6e 20  s may fail even 
2250: 62 65 66 6f 72 65 20 79 6f 75 20 61 63 74 75 61  before you actua
2260: 6c 6c 79 20 77 72 69 74 65 20 61 6e 79 74 68 69  lly write anythi
2270: 6e 67 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20  ng..     *.     
2280: 2a 20 7b 40 6d 6f 72 65 7d 20 4e 6f 74 65 20 74  * {@more} Note t
2290: 68 61 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hat the value of
22a0: 20 74 68 69 73 20 66 6c 61 67 20 69 73 20 30 2c   this flag is 0,
22b0: 20 73 6f 20 69 74 20 69 73 20 74 68 65 20 64 65   so it is the de
22c0: 66 61 75 6c 74 2e 0a 20 20 20 20 20 2a 2f 0a 20  fault..     */. 
22d0: 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63     public static
22e0: 20 66 69 6e 61 6c 20 69 6e 74 20 4f 50 45 4e 5f   final int OPEN_
22f0: 52 45 41 44 57 52 49 54 45 20 3d 20 30 78 30 30  READWRITE = 0x00
2300: 30 30 30 30 30 30 3b 20 20 20 20 20 20 20 20 20  000000;         
2310: 20 2f 2f 20 75 70 64 61 74 65 20 6e 61 74 69 76   // update nativ
2320: 65 20 63 6f 64 65 20 69 66 20 63 68 61 6e 67 69  e code if changi
2330: 6e 67 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20  ng..    /**.    
2340: 20 2a 20 4f 70 65 6e 20 66 6c 61 67 3a 20 46 6c   * Open flag: Fl
2350: 61 67 20 66 6f 72 20 7b 40 6c 69 6e 6b 20 23 6f  ag for {@link #o
2360: 70 65 6e 44 61 74 61 62 61 73 65 7d 20 74 6f 20  penDatabase} to 
2370: 6f 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73  open the databas
2380: 65 20 66 6f 72 20 72 65 61 64 69 6e 67 20 6f 6e  e for reading on
2390: 6c 79 2e 0a 20 20 20 20 20 2a 20 54 68 69 73 20  ly..     * This 
23a0: 69 73 20 74 68 65 20 6f 6e 6c 79 20 72 65 6c 69  is the only reli
23b0: 61 62 6c 65 20 77 61 79 20 74 6f 20 6f 70 65 6e  able way to open
23c0: 20 61 20 64 61 74 61 62 61 73 65 20 69 66 20 74   a database if t
23d0: 68 65 20 64 69 73 6b 20 6d 61 79 20 62 65 20 66  he disk may be f
23e0: 75 6c 6c 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  ull..     */.   
23f0: 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20 66   public static f
2400: 69 6e 61 6c 20 69 6e 74 20 4f 50 45 4e 5f 52 45  inal int OPEN_RE
2410: 41 44 4f 4e 4c 59 20 3d 20 30 78 30 30 30 30 30  ADONLY = 0x00000
2420: 30 30 31 3b 20 20 20 20 20 20 20 20 20 20 20 2f  001;           /
2430: 2f 20 75 70 64 61 74 65 20 6e 61 74 69 76 65 20  / update native 
2440: 63 6f 64 65 20 69 66 20 63 68 61 6e 67 69 6e 67  code if changing
2450: 0a 0a 20 20 20 20 70 72 69 76 61 74 65 20 73 74  ..    private st
2460: 61 74 69 63 20 66 69 6e 61 6c 20 69 6e 74 20 4f  atic final int O
2470: 50 45 4e 5f 52 45 41 44 5f 4d 41 53 4b 20 3d 20  PEN_READ_MASK = 
2480: 30 78 30 30 30 30 30 30 30 31 3b 20 20 20 20 20  0x00000001;     
2490: 20 20 20 20 2f 2f 20 75 70 64 61 74 65 20 6e 61      // update na
24a0: 74 69 76 65 20 63 6f 64 65 20 69 66 20 63 68 61  tive code if cha
24b0: 6e 67 69 6e 67 0a 0a 20 20 20 20 2f 2a 2a 0a 20  nging..    /**. 
24c0: 20 20 20 20 2a 20 4f 70 65 6e 20 66 6c 61 67 3a      * Open flag:
24d0: 20 46 6c 61 67 20 66 6f 72 20 7b 40 6c 69 6e 6b   Flag for {@link
24e0: 20 23 6f 70 65 6e 44 61 74 61 62 61 73 65 7d 20   #openDatabase} 
24f0: 74 6f 20 6f 70 65 6e 20 74 68 65 20 64 61 74 61  to open the data
2500: 62 61 73 65 20 77 69 74 68 6f 75 74 20 73 75 70  base without sup
2510: 70 6f 72 74 20 66 6f 72 0a 20 20 20 20 20 2a 20  port for.     * 
2520: 6c 6f 63 61 6c 69 7a 65 64 20 63 6f 6c 6c 61 74  localized collat
2530: 6f 72 73 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20  ors..     *.    
2540: 20 2a 20 7b 40 6d 6f 72 65 7d 20 54 68 69 73 20   * {@more} This 
2550: 63 61 75 73 65 73 20 74 68 65 20 63 6f 6c 6c 61  causes the colla
2560: 74 6f 72 20 3c 63 6f 64 65 3e 4c 4f 43 41 4c 49  tor <code>LOCALI
2570: 5a 45 44 3c 2f 63 6f 64 65 3e 20 6e 6f 74 20 74  ZED</code> not t
2580: 6f 20 62 65 20 63 72 65 61 74 65 64 2e 0a 20 20  o be created..  
2590: 20 20 20 2a 20 59 6f 75 20 6d 75 73 74 20 62 65     * You must be
25a0: 20 63 6f 6e 73 69 73 74 65 6e 74 20 77 68 65 6e   consistent when
25b0: 20 75 73 69 6e 67 20 74 68 69 73 20 66 6c 61 67   using this flag
25c0: 20 74 6f 20 75 73 65 20 74 68 65 20 73 65 74 74   to use the sett
25d0: 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73 65  ing the database
25e0: 20 77 61 73 0a 20 20 20 20 20 2a 20 63 72 65 61   was.     * crea
25f0: 74 65 64 20 77 69 74 68 2e 20 20 49 66 20 74 68  ted with.  If th
2600: 69 73 20 69 73 20 73 65 74 2c 20 7b 40 6c 69 6e  is is set, {@lin
2610: 6b 20 23 73 65 74 4c 6f 63 61 6c 65 7d 20 77 69  k #setLocale} wi
2620: 6c 6c 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 20  ll do nothing.. 
2630: 20 20 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69      */.    publi
2640: 63 20 73 74 61 74 69 63 20 66 69 6e 61 6c 20 69  c static final i
2650: 6e 74 20 4e 4f 5f 4c 4f 43 41 4c 49 5a 45 44 5f  nt NO_LOCALIZED_
2660: 43 4f 4c 4c 41 54 4f 52 53 20 3d 20 30 78 30 30  COLLATORS = 0x00
2670: 30 30 30 30 31 30 3b 20 20 2f 2f 20 75 70 64 61  000010;  // upda
2680: 74 65 20 6e 61 74 69 76 65 20 63 6f 64 65 20 69  te native code i
2690: 66 20 63 68 61 6e 67 69 6e 67 0a 0a 20 20 20 20  f changing..    
26a0: 2f 2a 2a 0a 20 20 20 20 20 2a 20 4f 70 65 6e 20  /**.     * Open 
26b0: 66 6c 61 67 3a 20 46 6c 61 67 20 66 6f 72 20 7b  flag: Flag for {
26c0: 40 6c 69 6e 6b 20 23 6f 70 65 6e 44 61 74 61 62  @link #openDatab
26d0: 61 73 65 7d 20 74 6f 20 63 72 65 61 74 65 20 74  ase} to create t
26e0: 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
26f0: 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 0a   if it does not.
2700: 20 20 20 20 20 2a 20 61 6c 72 65 61 64 79 20 65       * already e
2710: 78 69 73 74 2e 0a 20 20 20 20 20 2a 2f 0a 20 20  xist..     */.  
2720: 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20    public static 
2730: 66 69 6e 61 6c 20 69 6e 74 20 43 52 45 41 54 45  final int CREATE
2740: 5f 49 46 5f 4e 45 43 45 53 53 41 52 59 20 3d 20  _IF_NECESSARY = 
2750: 30 78 31 30 30 30 30 30 30 30 3b 20 20 20 20 20  0x10000000;     
2760: 2f 2f 20 75 70 64 61 74 65 20 6e 61 74 69 76 65  // update native
2770: 20 63 6f 64 65 20 69 66 20 63 68 61 6e 67 69 6e   code if changin
2780: 67 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20  g..    /**.     
2790: 2a 20 4f 70 65 6e 20 66 6c 61 67 3a 20 46 6c 61  * Open flag: Fla
27a0: 67 20 66 6f 72 20 7b 40 6c 69 6e 6b 20 23 6f 70  g for {@link #op
27b0: 65 6e 44 61 74 61 62 61 73 65 7d 20 74 6f 20 6f  enDatabase} to o
27c0: 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
27d0: 20 66 69 6c 65 20 77 69 74 68 0a 20 20 20 20 20   file with.     
27e0: 2a 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  * write-ahead lo
27f0: 67 67 69 6e 67 20 65 6e 61 62 6c 65 64 20 62 79  gging enabled by
2800: 20 64 65 66 61 75 6c 74 2e 20 20 55 73 69 6e 67   default.  Using
2810: 20 74 68 69 73 20 66 6c 61 67 20 69 73 20 6d 6f   this flag is mo
2820: 72 65 20 65 66 66 69 63 69 65 6e 74 0a 20 20 20  re efficient.   
2830: 20 20 2a 20 74 68 61 6e 20 63 61 6c 6c 69 6e 67    * than calling
2840: 20 7b 40 6c 69 6e 6b 20 23 65 6e 61 62 6c 65 57   {@link #enableW
2850: 72 69 74 65 41 68 65 61 64 4c 6f 67 67 69 6e 67  riteAheadLogging
2860: 7d 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a  }..     *.     *
2870: 20 57 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   Write-ahead log
2880: 67 69 6e 67 20 63 61 6e 6e 6f 74 20 62 65 20 75  ging cannot be u
2890: 73 65 64 20 77 69 74 68 20 72 65 61 64 2d 6f 6e  sed with read-on
28a0: 6c 79 20 64 61 74 61 62 61 73 65 73 20 73 6f 20  ly databases so 
28b0: 74 68 65 20 76 61 6c 75 65 20 6f 66 0a 20 20 20  the value of.   
28c0: 20 20 2a 20 74 68 69 73 20 66 6c 61 67 20 69 73    * this flag is
28d0: 20 69 67 6e 6f 72 65 64 20 69 66 20 74 68 65 20   ignored if the 
28e0: 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
28f0: 65 64 20 72 65 61 64 2d 6f 6e 6c 79 2e 0a 20 20  ed read-only..  
2900: 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 73 65 65     *.     * @see
2910: 20 23 65 6e 61 62 6c 65 57 72 69 74 65 41 68 65   #enableWriteAhe
2920: 61 64 4c 6f 67 67 69 6e 67 0a 20 20 20 20 20 2a  adLogging.     *
2930: 2f 0a 20 20 20 20 70 75 62 6c 69 63 20 73 74 61  /.    public sta
2940: 74 69 63 20 66 69 6e 61 6c 20 69 6e 74 20 45 4e  tic final int EN
2950: 41 42 4c 45 5f 57 52 49 54 45 5f 41 48 45 41 44  ABLE_WRITE_AHEAD
2960: 5f 4c 4f 47 47 49 4e 47 20 3d 20 30 78 32 30 30  _LOGGING = 0x200
2970: 30 30 30 30 30 3b 0a 0a 20 20 20 20 2f 2a 2a 0a  00000;..    /**.
2980: 20 20 20 20 20 2a 20 41 62 73 6f 6c 75 74 65 20       * Absolute 
2990: 6d 61 78 20 76 61 6c 75 65 20 74 68 61 74 20 63  max value that c
29a0: 61 6e 20 62 65 20 73 65 74 20 62 79 20 7b 40 6c  an be set by {@l
29b0: 69 6e 6b 20 23 73 65 74 4d 61 78 53 71 6c 43 61  ink #setMaxSqlCa
29c0: 63 68 65 53 69 7a 65 28 69 6e 74 29 7d 2e 0a 20  cheSize(int)}.. 
29d0: 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 45 61 63      *.     * Eac
29e0: 68 20 70 72 65 70 61 72 65 64 2d 73 74 61 74 65  h prepared-state
29f0: 6d 65 6e 74 20 69 73 20 62 65 74 77 65 65 6e 20  ment is between 
2a00: 31 4b 20 2d 20 36 4b 2c 20 64 65 70 65 6e 64 69  1K - 6K, dependi
2a10: 6e 67 20 6f 6e 20 74 68 65 20 63 6f 6d 70 6c 65  ng on the comple
2a20: 78 69 74 79 20 6f 66 20 74 68 65 0a 20 20 20 20  xity of the.    
2a30: 20 2a 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74   * SQL statement
2a40: 20 26 20 73 63 68 65 6d 61 2e 20 20 41 20 6c 61   & schema.  A la
2a50: 72 67 65 20 53 51 4c 20 63 61 63 68 65 20 6d 61  rge SQL cache ma
2a60: 79 20 75 73 65 20 61 20 73 69 67 6e 69 66 69 63  y use a signific
2a70: 61 6e 74 20 61 6d 6f 75 6e 74 20 6f 66 20 6d 65  ant amount of me
2a80: 6d 6f 72 79 2e 0a 20 20 20 20 20 2a 2f 0a 20 20  mory..     */.  
2a90: 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20    public static 
2aa0: 66 69 6e 61 6c 20 69 6e 74 20 4d 41 58 5f 53 51  final int MAX_SQ
2ab0: 4c 5f 43 41 43 48 45 5f 53 49 5a 45 20 3d 20 31  L_CACHE_SIZE = 1
2ac0: 30 30 3b 0a 0a 20 20 20 20 70 72 69 76 61 74 65  00;..    private
2ad0: 20 53 51 4c 69 74 65 44 61 74 61 62 61 73 65 28   SQLiteDatabase(
2ae0: 53 74 72 69 6e 67 20 70 61 74 68 2c 20 69 6e 74  String path, int
2af0: 20 6f 70 65 6e 46 6c 61 67 73 2c 20 43 75 72 73   openFlags, Curs
2b00: 6f 72 46 61 63 74 6f 72 79 20 63 75 72 73 6f 72  orFactory cursor
2b10: 46 61 63 74 6f 72 79 2c 0a 20 20 20 20 20 20 20  Factory,.       
2b20: 20 20 20 20 20 44 61 74 61 62 61 73 65 45 72 72       DatabaseErr
2b30: 6f 72 48 61 6e 64 6c 65 72 20 65 72 72 6f 72 48  orHandler errorH
2b40: 61 6e 64 6c 65 72 29 20 7b 0a 20 20 20 20 20 20  andler) {.      
2b50: 20 20 6d 43 75 72 73 6f 72 46 61 63 74 6f 72 79    mCursorFactory
2b60: 20 3d 20 63 75 72 73 6f 72 46 61 63 74 6f 72 79   = cursorFactory
2b70: 3b 0a 20 20 20 20 20 20 20 20 6d 45 72 72 6f 72  ;.        mError
2b80: 48 61 6e 64 6c 65 72 20 3d 20 65 72 72 6f 72 48  Handler = errorH
2b90: 61 6e 64 6c 65 72 20 21 3d 20 6e 75 6c 6c 20 3f  andler != null ?
2ba0: 20 65 72 72 6f 72 48 61 6e 64 6c 65 72 20 3a 20   errorHandler : 
2bb0: 6e 65 77 20 44 65 66 61 75 6c 74 44 61 74 61 62  new DefaultDatab
2bc0: 61 73 65 45 72 72 6f 72 48 61 6e 64 6c 65 72 28  aseErrorHandler(
2bd0: 29 3b 0a 20 20 20 20 20 20 20 20 6d 43 6f 6e 66  );.        mConf
2be0: 69 67 75 72 61 74 69 6f 6e 4c 6f 63 6b 65 64 20  igurationLocked 
2bf0: 3d 20 6e 65 77 20 53 51 4c 69 74 65 44 61 74 61  = new SQLiteData
2c00: 62 61 73 65 43 6f 6e 66 69 67 75 72 61 74 69 6f  baseConfiguratio
2c10: 6e 28 70 61 74 68 2c 20 6f 70 65 6e 46 6c 61 67  n(path, openFlag
2c20: 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 40  s);.    }..    @
2c30: 4f 76 65 72 72 69 64 65 0a 20 20 20 20 70 72 6f  Override.    pro
2c40: 74 65 63 74 65 64 20 76 6f 69 64 20 66 69 6e 61  tected void fina
2c50: 6c 69 7a 65 28 29 20 74 68 72 6f 77 73 20 54 68  lize() throws Th
2c60: 72 6f 77 61 62 6c 65 20 7b 0a 20 20 20 20 20 20  rowable {.      
2c70: 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20    try {.        
2c80: 20 20 20 20 64 69 73 70 6f 73 65 28 74 72 75 65      dispose(true
2c90: 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 66 69 6e  );.        } fin
2ca0: 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20 20 20  ally {.         
2cb0: 20 20 20 73 75 70 65 72 2e 66 69 6e 61 6c 69 7a     super.finaliz
2cc0: 65 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  e();.        }. 
2cd0: 20 20 20 7d 0a 0a 20 20 20 20 40 4f 76 65 72 72     }..    @Overr
2ce0: 69 64 65 0a 20 20 20 20 70 72 6f 74 65 63 74 65  ide.    protecte
2cf0: 64 20 76 6f 69 64 20 6f 6e 41 6c 6c 52 65 66 65  d void onAllRefe
2d00: 72 65 6e 63 65 73 52 65 6c 65 61 73 65 64 28 29  rencesReleased()
2d10: 20 7b 0a 20 20 20 20 20 20 20 20 64 69 73 70 6f   {.        dispo
2d20: 73 65 28 66 61 6c 73 65 29 3b 0a 20 20 20 20 7d  se(false);.    }
2d30: 0a 0a 20 20 20 20 70 72 69 76 61 74 65 20 76 6f  ..    private vo
2d40: 69 64 20 64 69 73 70 6f 73 65 28 62 6f 6f 6c 65  id dispose(boole
2d50: 61 6e 20 66 69 6e 61 6c 69 7a 65 64 29 20 7b 0a  an finalized) {.
2d60: 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20 53 51          final SQ
2d70: 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 50 6f  LiteConnectionPo
2d80: 6f 6c 20 70 6f 6f 6c 3b 0a 20 20 20 20 20 20 20  ol pool;.       
2d90: 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 28 6d   synchronized (m
2da0: 4c 6f 63 6b 29 20 7b 0a 20 20 20 20 20 20 20 20  Lock) {.        
2db0: 20 20 20 20 69 66 20 28 6d 43 6c 6f 73 65 47 75      if (mCloseGu
2dc0: 61 72 64 4c 6f 63 6b 65 64 20 21 3d 20 6e 75 6c  ardLocked != nul
2dd0: 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l) {.           
2de0: 20 20 20 20 20 69 66 20 28 66 69 6e 61 6c 69 7a       if (finaliz
2df0: 65 64 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ed) {.          
2e00: 20 20 20 20 20 20 20 20 20 20 6d 43 6c 6f 73 65            mClose
2e10: 47 75 61 72 64 4c 6f 63 6b 65 64 2e 77 61 72 6e  GuardLocked.warn
2e20: 49 66 4f 70 65 6e 28 29 3b 0a 20 20 20 20 20 20  IfOpen();.      
2e30: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2e40: 20 20 20 20 20 20 20 20 20 20 20 20 6d 43 6c 6f              mClo
2e50: 73 65 47 75 61 72 64 4c 6f 63 6b 65 64 2e 63 6c  seGuardLocked.cl
2e60: 6f 73 65 28 29 3b 0a 20 20 20 20 20 20 20 20 20  ose();.         
2e70: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
2e80: 20 20 70 6f 6f 6c 20 3d 20 6d 43 6f 6e 6e 65 63    pool = mConnec
2e90: 74 69 6f 6e 50 6f 6f 6c 4c 6f 63 6b 65 64 3b 0a  tionPoolLocked;.
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 43 6f 6e              mCon
2eb0: 6e 65 63 74 69 6f 6e 50 6f 6f 6c 4c 6f 63 6b 65  nectionPoolLocke
2ec0: 64 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20 20 20  d = null;.      
2ed0: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66 20    }..        if 
2ee0: 28 21 66 69 6e 61 6c 69 7a 65 64 29 20 7b 0a 20  (!finalized) {. 
2ef0: 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 63 68             synch
2f00: 72 6f 6e 69 7a 65 64 20 28 73 41 63 74 69 76 65  ronized (sActive
2f10: 44 61 74 61 62 61 73 65 73 29 20 7b 0a 20 20 20  Databases) {.   
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 41 63               sAc
2f30: 74 69 76 65 44 61 74 61 62 61 73 65 73 2e 72 65  tiveDatabases.re
2f40: 6d 6f 76 65 28 74 68 69 73 29 3b 0a 20 20 20 20  move(this);.    
2f50: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
2f60: 20 20 20 20 20 20 20 69 66 20 28 70 6f 6f 6c 20         if (pool 
2f70: 21 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20  != null) {.     
2f80: 20 20 20 20 20 20 20 20 20 20 20 70 6f 6f 6c 2e             pool.
2f90: 63 6c 6f 73 65 28 29 3b 0a 20 20 20 20 20 20 20  close();.       
2fa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2fb0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a  .    }..    /**.
2fc0: 20 20 20 20 20 2a 20 41 74 74 65 6d 70 74 73 20       * Attempts 
2fd0: 74 6f 20 72 65 6c 65 61 73 65 20 6d 65 6d 6f 72  to release memor
2fe0: 79 20 74 68 61 74 20 53 51 4c 69 74 65 20 68 6f  y that SQLite ho
2ff0: 6c 64 73 20 62 75 74 20 64 6f 65 73 20 6e 6f 74  lds but does not
3000: 20 72 65 71 75 69 72 65 20 74 6f 0a 20 20 20 20   require to.    
3010: 20 2a 20 6f 70 65 72 61 74 65 20 70 72 6f 70 65   * operate prope
3020: 72 6c 79 2e 20 54 79 70 69 63 61 6c 6c 79 20 74  rly. Typically t
3030: 68 69 73 20 6d 65 6d 6f 72 79 20 77 69 6c 6c 20  his memory will 
3040: 63 6f 6d 65 20 66 72 6f 6d 20 74 68 65 20 70 61  come from the pa
3050: 67 65 20 63 61 63 68 65 2e 0a 20 20 20 20 20 2a  ge cache..     *
3060: 0a 20 20 20 20 20 2a 20 40 72 65 74 75 72 6e 20  .     * @return 
3070: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 79  the number of by
3080: 74 65 73 20 61 63 74 75 61 6c 6c 79 20 72 65 6c  tes actually rel
3090: 65 61 73 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20  eased.     */.  
30a0: 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20    public static 
30b0: 69 6e 74 20 72 65 6c 65 61 73 65 4d 65 6d 6f 72  int releaseMemor
30c0: 79 28 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65  y() {.        re
30d0: 74 75 72 6e 20 53 51 4c 69 74 65 47 6c 6f 62 61  turn SQLiteGloba
30e0: 6c 2e 72 65 6c 65 61 73 65 4d 65 6d 6f 72 79 28  l.releaseMemory(
30f0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
3100: 2a 0a 20 20 20 20 20 2a 20 43 6f 6e 74 72 6f 6c  *.     * Control
3110: 20 77 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20   whether or not 
3120: 74 68 65 20 53 51 4c 69 74 65 44 61 74 61 62 61  the SQLiteDataba
3130: 73 65 20 69 73 20 6d 61 64 65 20 74 68 72 65 61  se is made threa
3140: 64 2d 73 61 66 65 20 62 79 20 75 73 69 6e 67 20  d-safe by using 
3150: 6c 6f 63 6b 73 0a 20 20 20 20 20 2a 20 61 72 6f  locks.     * aro
3160: 75 6e 64 20 63 72 69 74 69 63 61 6c 20 73 65 63  und critical sec
3170: 74 69 6f 6e 73 2e 20 54 68 69 73 20 69 73 20 70  tions. This is p
3180: 72 65 74 74 79 20 65 78 70 65 6e 73 69 76 65 2c  retty expensive,
3190: 20 73 6f 20 69 66 20 79 6f 75 20 6b 6e 6f 77 20   so if you know 
31a0: 74 68 61 74 20 79 6f 75 72 0a 20 20 20 20 20 2a  that your.     *
31b0: 20 44 42 20 77 69 6c 6c 20 6f 6e 6c 79 20 62 65   DB will only be
31c0: 20 75 73 65 64 20 62 79 20 61 20 73 69 6e 67 6c   used by a singl
31d0: 65 20 74 68 72 65 61 64 20 74 68 65 6e 20 79 6f  e thread then yo
31e0: 75 20 73 68 6f 75 6c 64 20 73 65 74 20 74 68 69  u should set thi
31f0: 73 20 74 6f 20 66 61 6c 73 65 2e 0a 20 20 20 20  s to false..    
3200: 20 2a 20 54 68 65 20 64 65 66 61 75 6c 74 20 69   * The default i
3210: 73 20 74 72 75 65 2e 0a 20 20 20 20 20 2a 20 40  s true..     * @
3220: 70 61 72 61 6d 20 6c 6f 63 6b 69 6e 67 45 6e 61  param lockingEna
3230: 62 6c 65 64 20 73 65 74 20 74 6f 20 74 72 75 65  bled set to true
3240: 20 74 6f 20 65 6e 61 62 6c 65 20 6c 6f 63 6b 73   to enable locks
3250: 2c 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73  , false otherwis
3260: 65 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20  e.     *.     * 
3270: 40 64 65 70 72 65 63 61 74 65 64 20 54 68 69 73  @deprecated This
3280: 20 6d 65 74 68 6f 64 20 6e 6f 77 20 64 6f 65 73   method now does
3290: 20 6e 6f 74 68 69 6e 67 2e 20 20 44 6f 20 6e 6f   nothing.  Do no
32a0: 74 20 75 73 65 2e 0a 20 20 20 20 20 2a 2f 0a 20  t use..     */. 
32b0: 20 20 20 40 44 65 70 72 65 63 61 74 65 64 0a 20     @Deprecated. 
32c0: 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20 73     public void s
32d0: 65 74 4c 6f 63 6b 69 6e 67 45 6e 61 62 6c 65 64  etLockingEnabled
32e0: 28 62 6f 6f 6c 65 61 6e 20 6c 6f 63 6b 69 6e 67  (boolean locking
32f0: 45 6e 61 62 6c 65 64 29 20 7b 0a 20 20 20 20 7d  Enabled) {.    }
3300: 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a  ..    /**.     *
3310: 20 47 65 74 73 20 61 20 6c 61 62 65 6c 20 74 6f   Gets a label to
3320: 20 75 73 65 20 77 68 65 6e 20 64 65 73 63 72 69   use when descri
3330: 62 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  bing the databas
3340: 65 20 69 6e 20 6c 6f 67 20 6d 65 73 73 61 67 65  e in log message
3350: 73 2e 0a 20 20 20 20 20 2a 20 40 72 65 74 75 72  s..     * @retur
3360: 6e 20 54 68 65 20 6c 61 62 65 6c 2e 0a 20 20 20  n The label..   
3370: 20 20 2a 2f 0a 20 20 20 20 53 74 72 69 6e 67 20    */.    String 
3380: 67 65 74 4c 61 62 65 6c 28 29 20 7b 0a 20 20 20  getLabel() {.   
3390: 20 20 20 20 20 73 79 6e 63 68 72 6f 6e 69 7a 65       synchronize
33a0: 64 20 28 6d 4c 6f 63 6b 29 20 7b 0a 20 20 20 20  d (mLock) {.    
33b0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d          return m
33c0: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 4c 6f 63  ConfigurationLoc
33d0: 6b 65 64 2e 6c 61 62 65 6c 3b 0a 20 20 20 20 20  ked.label;.     
33e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
33f0: 2f 2a 2a 0a 20 20 20 20 20 2a 20 53 65 6e 64 73  /**.     * Sends
3400: 20 61 20 63 6f 72 72 75 70 74 69 6f 6e 20 6d 65   a corruption me
3410: 73 73 61 67 65 20 74 6f 20 74 68 65 20 64 61 74  ssage to the dat
3420: 61 62 61 73 65 20 65 72 72 6f 72 20 68 61 6e 64  abase error hand
3430: 6c 65 72 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  ler..     */.   
3440: 20 76 6f 69 64 20 6f 6e 43 6f 72 72 75 70 74 69   void onCorrupti
3450: 6f 6e 28 29 20 7b 0a 20 20 20 20 20 20 20 20 45  on() {.        E
3460: 76 65 6e 74 4c 6f 67 2e 77 72 69 74 65 45 76 65  ventLog.writeEve
3470: 6e 74 28 45 56 45 4e 54 5f 44 42 5f 43 4f 52 52  nt(EVENT_DB_CORR
3480: 55 50 54 2c 20 67 65 74 4c 61 62 65 6c 28 29 29  UPT, getLabel())
3490: 3b 0a 20 20 20 20 20 20 20 20 6d 45 72 72 6f 72  ;.        mError
34a0: 48 61 6e 64 6c 65 72 2e 6f 6e 43 6f 72 72 75 70  Handler.onCorrup
34b0: 74 69 6f 6e 28 74 68 69 73 29 3b 0a 20 20 20 20  tion(this);.    
34c0: 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20  }..    /**.     
34d0: 2a 20 47 65 74 73 20 74 68 65 20 7b 40 6c 69 6e  * Gets the {@lin
34e0: 6b 20 53 51 4c 69 74 65 53 65 73 73 69 6f 6e 7d  k SQLiteSession}
34f0: 20 74 68 61 74 20 62 65 6c 6f 6e 67 73 20 74 6f   that belongs to
3500: 20 74 68 69 73 20 74 68 72 65 61 64 20 66 6f 72   this thread for
3510: 20 74 68 69 73 20 64 61 74 61 62 61 73 65 2e 0a   this database..
3520: 20 20 20 20 20 2a 20 4f 6e 63 65 20 61 20 74 68       * Once a th
3530: 72 65 61 64 20 68 61 73 20 6f 62 74 61 69 6e 65  read has obtaine
3540: 64 20 61 20 73 65 73 73 69 6f 6e 2c 20 69 74 20  d a session, it 
3550: 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 74 6f  will continue to
3560: 20 6f 62 74 61 69 6e 20 74 68 65 20 73 61 6d 65   obtain the same
3570: 0a 20 20 20 20 20 2a 20 73 65 73 73 69 6f 6e 20  .     * session 
3580: 65 76 65 6e 20 61 66 74 65 72 20 74 68 65 20 64  even after the d
3590: 61 74 61 62 61 73 65 20 68 61 73 20 62 65 65 6e  atabase has been
35a0: 20 63 6c 6f 73 65 64 20 28 61 6c 74 68 6f 75 67   closed (althoug
35b0: 68 20 74 68 65 20 73 65 73 73 69 6f 6e 20 77 69  h the session wi
35c0: 6c 6c 20 6e 6f 74 0a 20 20 20 20 20 2a 20 62 65  ll not.     * be
35d0: 20 75 73 61 62 6c 65 29 2e 20 20 48 6f 77 65 76   usable).  Howev
35e0: 65 72 2c 20 61 20 74 68 72 65 61 64 20 74 68 61  er, a thread tha
35f0: 74 20 64 6f 65 73 20 6e 6f 74 20 61 6c 72 65 61  t does not alrea
3600: 64 79 20 68 61 76 65 20 61 20 73 65 73 73 69 6f  dy have a sessio
3610: 6e 20 63 61 6e 6e 6f 74 0a 20 20 20 20 20 2a 20  n cannot.     * 
3620: 6f 62 74 61 69 6e 20 6f 6e 65 20 61 66 74 65 72  obtain one after
3630: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68 61   the database ha
3640: 73 20 62 65 65 6e 20 63 6c 6f 73 65 64 2e 0a 20  s been closed.. 
3650: 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68 65      *.     * The
3660: 20 69 64 65 61 20 69 73 20 74 68 61 74 20 74 68   idea is that th
3670: 72 65 61 64 73 20 74 68 61 74 20 68 61 76 65 20  reads that have 
3680: 61 63 74 69 76 65 20 63 6f 6e 6e 65 63 74 69 6f  active connectio
3690: 6e 73 20 74 6f 20 74 68 65 20 64 61 74 61 62 61  ns to the databa
36a0: 73 65 20 6d 61 79 20 73 74 69 6c 6c 0a 20 20 20  se may still.   
36b0: 20 20 2a 20 68 61 76 65 20 77 6f 72 6b 20 74 6f    * have work to
36c0: 20 63 6f 6d 70 6c 65 74 65 20 65 76 65 6e 20 61   complete even a
36d0: 66 74 65 72 20 74 68 65 20 63 61 6c 6c 20 74 6f  fter the call to
36e0: 20 7b 40 6c 69 6e 6b 20 23 63 6c 6f 73 65 7d 2e   {@link #close}.
36f0: 20 20 41 63 74 69 76 65 20 64 61 74 61 62 61 73    Active databas
3700: 65 0a 20 20 20 20 20 2a 20 63 6f 6e 6e 65 63 74  e.     * connect
3710: 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20 61 63 74  ions are not act
3720: 75 61 6c 6c 79 20 64 69 73 70 6f 73 65 64 20 75  ually disposed u
3730: 6e 74 69 6c 20 74 68 65 79 20 61 72 65 20 72 65  ntil they are re
3740: 6c 65 61 73 65 64 20 62 79 20 74 68 65 20 74 68  leased by the th
3750: 72 65 61 64 73 0a 20 20 20 20 20 2a 20 74 68 61  reads.     * tha
3760: 74 20 6f 77 6e 20 74 68 65 6d 2e 0a 20 20 20 20  t own them..    
3770: 20 2a 0a 20 20 20 20 20 2a 20 40 72 65 74 75 72   *.     * @retur
3780: 6e 20 54 68 65 20 73 65 73 73 69 6f 6e 2c 20 6e  n The session, n
3790: 65 76 65 72 20 6e 75 6c 6c 2e 0a 20 20 20 20 20  ever null..     
37a0: 2a 0a 20 20 20 20 20 2a 20 40 74 68 72 6f 77 73  *.     * @throws
37b0: 20 49 6c 6c 65 67 61 6c 53 74 61 74 65 45 78 63   IllegalStateExc
37c0: 65 70 74 69 6f 6e 20 69 66 20 74 68 65 20 74 68  eption if the th
37d0: 72 65 61 64 20 64 6f 65 73 20 6e 6f 74 20 79 65  read does not ye
37e0: 74 20 68 61 76 65 20 61 20 73 65 73 73 69 6f 6e  t have a session
37f0: 20 61 6e 64 0a 20 20 20 20 20 2a 20 74 68 65 20   and.     * the 
3800: 64 61 74 61 62 61 73 65 20 69 73 20 6e 6f 74 20  database is not 
3810: 6f 70 65 6e 2e 0a 20 20 20 20 20 2a 2f 0a 20 20  open..     */.  
3820: 20 20 53 51 4c 69 74 65 53 65 73 73 69 6f 6e 20    SQLiteSession 
3830: 67 65 74 54 68 72 65 61 64 53 65 73 73 69 6f 6e  getThreadSession
3840: 28 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74  () {.        ret
3850: 75 72 6e 20 6d 54 68 72 65 61 64 53 65 73 73 69  urn mThreadSessi
3860: 6f 6e 2e 67 65 74 28 29 3b 20 2f 2f 20 69 6e 69  on.get(); // ini
3870: 74 69 61 6c 56 61 6c 75 65 28 29 20 74 68 72 6f  tialValue() thro
3880: 77 73 20 69 66 20 64 61 74 61 62 61 73 65 20 63  ws if database c
3890: 6c 6f 73 65 64 0a 20 20 20 20 7d 0a 0a 20 20 20  losed.    }..   
38a0: 20 53 51 4c 69 74 65 53 65 73 73 69 6f 6e 20 63   SQLiteSession c
38b0: 72 65 61 74 65 53 65 73 73 69 6f 6e 28 29 20 7b  reateSession() {
38c0: 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20 53  .        final S
38d0: 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 50  QLiteConnectionP
38e0: 6f 6f 6c 20 70 6f 6f 6c 3b 0a 20 20 20 20 20 20  ool pool;.      
38f0: 20 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 28    synchronized (
3900: 6d 4c 6f 63 6b 29 20 7b 0a 20 20 20 20 20 20 20  mLock) {.       
3910: 20 20 20 20 20 74 68 72 6f 77 49 66 4e 6f 74 4f       throwIfNotO
3920: 70 65 6e 4c 6f 63 6b 65 64 28 29 3b 0a 20 20 20  penLocked();.   
3930: 20 20 20 20 20 20 20 20 20 70 6f 6f 6c 20 3d 20           pool = 
3940: 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 6f 6f 6c 4c  mConnectionPoolL
3950: 6f 63 6b 65 64 3b 0a 20 20 20 20 20 20 20 20 7d  ocked;.        }
3960: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3970: 6e 65 77 20 53 51 4c 69 74 65 53 65 73 73 69 6f  new SQLiteSessio
3980: 6e 28 70 6f 6f 6c 29 3b 0a 20 20 20 20 7d 0a 0a  n(pool);.    }..
3990: 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 47      /**.     * G
39a0: 65 74 73 20 64 65 66 61 75 6c 74 20 63 6f 6e 6e  ets default conn
39b0: 65 63 74 69 6f 6e 20 66 6c 61 67 73 20 74 68 61  ection flags tha
39c0: 74 20 61 72 65 20 61 70 70 72 6f 70 72 69 61 74  t are appropriat
39d0: 65 20 66 6f 72 20 74 68 69 73 20 74 68 72 65 61  e for this threa
39e0: 64 2c 20 74 61 6b 69 6e 67 20 69 6e 74 6f 0a 20  d, taking into. 
39f0: 20 20 20 20 2a 20 61 63 63 6f 75 6e 74 20 77 68      * account wh
3a00: 65 74 68 65 72 20 74 68 65 20 74 68 72 65 61 64  ether the thread
3a10: 20 69 73 20 61 63 74 69 6e 67 20 6f 6e 20 62 65   is acting on be
3a20: 68 61 6c 66 20 6f 66 20 74 68 65 20 55 49 2e 0a  half of the UI..
3a30: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 70       *.     * @p
3a40: 61 72 61 6d 20 72 65 61 64 4f 6e 6c 79 20 54 72  aram readOnly Tr
3a50: 75 65 20 69 66 20 74 68 65 20 63 6f 6e 6e 65 63  ue if the connec
3a60: 74 69 6f 6e 20 73 68 6f 75 6c 64 20 62 65 20 72  tion should be r
3a70: 65 61 64 2d 6f 6e 6c 79 2e 0a 20 20 20 20 20 2a  ead-only..     *
3a80: 20 40 72 65 74 75 72 6e 20 54 68 65 20 63 6f 6e   @return The con
3a90: 6e 65 63 74 69 6f 6e 20 66 6c 61 67 73 2e 0a 20  nection flags.. 
3aa0: 20 20 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 67      */.    int g
3ab0: 65 74 54 68 72 65 61 64 44 65 66 61 75 6c 74 43  etThreadDefaultC
3ac0: 6f 6e 6e 65 63 74 69 6f 6e 46 6c 61 67 73 28 62  onnectionFlags(b
3ad0: 6f 6f 6c 65 61 6e 20 72 65 61 64 4f 6e 6c 79 29  oolean readOnly)
3ae0: 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 66   {.        int f
3af0: 6c 61 67 73 20 3d 20 72 65 61 64 4f 6e 6c 79 20  lags = readOnly 
3b00: 3f 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  ? SQLiteConnecti
3b10: 6f 6e 50 6f 6f 6c 2e 43 4f 4e 4e 45 43 54 49 4f  onPool.CONNECTIO
3b20: 4e 5f 46 4c 41 47 5f 52 45 41 44 5f 4f 4e 4c 59  N_FLAG_READ_ONLY
3b30: 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   :.             
3b40: 20 20 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74     SQLiteConnect
3b50: 69 6f 6e 50 6f 6f 6c 2e 43 4f 4e 4e 45 43 54 49  ionPool.CONNECTI
3b60: 4f 4e 5f 46 4c 41 47 5f 50 52 49 4d 41 52 59 5f  ON_FLAG_PRIMARY_
3b70: 43 4f 4e 4e 45 43 54 49 4f 4e 5f 41 46 46 49 4e  CONNECTION_AFFIN
3b80: 49 54 59 3b 0a 20 20 20 20 20 20 20 20 69 66 20  ITY;.        if 
3b90: 28 69 73 4d 61 69 6e 54 68 72 65 61 64 28 29 29  (isMainThread())
3ba0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66   {.            f
3bb0: 6c 61 67 73 20 7c 3d 20 53 51 4c 69 74 65 43 6f  lags |= SQLiteCo
3bc0: 6e 6e 65 63 74 69 6f 6e 50 6f 6f 6c 2e 43 4f 4e  nnectionPool.CON
3bd0: 4e 45 43 54 49 4f 4e 5f 46 4c 41 47 5f 49 4e 54  NECTION_FLAG_INT
3be0: 45 52 41 43 54 49 56 45 3b 0a 20 20 20 20 20 20  ERACTIVE;.      
3bf0: 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75    }.        retu
3c00: 72 6e 20 66 6c 61 67 73 3b 0a 20 20 20 20 7d 0a  rn flags;.    }.
3c10: 0a 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61  .    private sta
3c20: 74 69 63 20 62 6f 6f 6c 65 61 6e 20 69 73 4d 61  tic boolean isMa
3c30: 69 6e 54 68 72 65 61 64 28 29 20 7b 0a 20 20 20  inThread() {.   
3c40: 20 20 20 20 20 2f 2f 20 46 49 58 4d 45 3a 20 54       // FIXME: T
3c50: 68 65 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61  here should be a
3c60: 20 62 65 74 74 65 72 20 77 61 79 20 74 6f 20 64   better way to d
3c70: 6f 20 74 68 69 73 2e 0a 20 20 20 20 20 20 20 20  o this..        
3c80: 2f 2f 20 57 6f 75 6c 64 20 61 6c 73 6f 20 62 65  // Would also be
3c90: 20 6e 69 63 65 20 74 6f 20 68 61 76 65 20 73 6f   nice to have so
3ca0: 6d 65 74 68 69 6e 67 20 74 68 61 74 20 77 6f 75  mething that wou
3cb0: 6c 64 20 77 6f 72 6b 20 61 63 72 6f 73 73 20 42  ld work across B
3cc0: 69 6e 64 65 72 20 63 61 6c 6c 73 2e 0a 20 20 20  inder calls..   
3cd0: 20 20 20 20 20 4c 6f 6f 70 65 72 20 6c 6f 6f 70       Looper loop
3ce0: 65 72 20 3d 20 4c 6f 6f 70 65 72 2e 6d 79 4c 6f  er = Looper.myLo
3cf0: 6f 70 65 72 28 29 3b 0a 20 20 20 20 20 20 20 20  oper();.        
3d00: 72 65 74 75 72 6e 20 6c 6f 6f 70 65 72 20 21 3d  return looper !=
3d10: 20 6e 75 6c 6c 20 26 26 20 6c 6f 6f 70 65 72 20   null && looper 
3d20: 3d 3d 20 4c 6f 6f 70 65 72 2e 67 65 74 4d 61 69  == Looper.getMai
3d30: 6e 4c 6f 6f 70 65 72 28 29 3b 0a 20 20 20 20 7d  nLooper();.    }
3d40: 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a  ..    /**.     *
3d50: 20 42 65 67 69 6e 73 20 61 20 74 72 61 6e 73 61   Begins a transa
3d60: 63 74 69 6f 6e 20 69 6e 20 45 58 43 4c 55 53 49  ction in EXCLUSI
3d70: 56 45 20 6d 6f 64 65 2e 0a 20 20 20 20 20 2a 20  VE mode..     * 
3d80: 3c 70 3e 0a 20 20 20 20 20 2a 20 54 72 61 6e 73  <p>.     * Trans
3d90: 61 63 74 69 6f 6e 73 20 63 61 6e 20 62 65 20 6e  actions can be n
3da0: 65 73 74 65 64 2e 0a 20 20 20 20 20 2a 20 57 68  ested..     * Wh
3db0: 65 6e 20 74 68 65 20 6f 75 74 65 72 20 74 72 61  en the outer tra
3dc0: 6e 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65  nsaction is ende
3dd0: 64 20 61 6c 6c 20 6f 66 0a 20 20 20 20 20 2a 20  d all of.     * 
3de0: 74 68 65 20 77 6f 72 6b 20 64 6f 6e 65 20 69 6e  the work done in
3df0: 20 74 68 61 74 20 74 72 61 6e 73 61 63 74 69 6f   that transactio
3e00: 6e 20 61 6e 64 20 61 6c 6c 20 6f 66 20 74 68 65  n and all of the
3e10: 20 6e 65 73 74 65 64 20 74 72 61 6e 73 61 63 74   nested transact
3e20: 69 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f 6d  ions will be com
3e30: 6d 69 74 74 65 64 20 6f 72 0a 20 20 20 20 20 2a  mitted or.     *
3e40: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 2e 20 54 68   rolled back. Th
3e50: 65 20 63 68 61 6e 67 65 73 20 77 69 6c 6c 20 62  e changes will b
3e60: 65 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 66  e rolled back if
3e70: 20 61 6e 79 20 74 72 61 6e 73 61 63 74 69 6f 6e   any transaction
3e80: 20 69 73 20 65 6e 64 65 64 20 77 69 74 68 6f 75   is ended withou
3e90: 74 20 62 65 69 6e 67 0a 20 20 20 20 20 2a 20 6d  t being.     * m
3ea0: 61 72 6b 65 64 20 61 73 20 63 6c 65 61 6e 20 28  arked as clean (
3eb0: 62 79 20 63 61 6c 6c 69 6e 67 20 73 65 74 54 72  by calling setTr
3ec0: 61 6e 73 61 63 74 69 6f 6e 53 75 63 63 65 73 73  ansactionSuccess
3ed0: 66 75 6c 29 2e 20 4f 74 68 65 72 77 69 73 65 20  ful). Otherwise 
3ee0: 74 68 65 79 20 77 69 6c 6c 20 62 65 20 63 6f 6d  they will be com
3ef0: 6d 69 74 74 65 64 2e 0a 20 20 20 20 20 2a 20 3c  mitted..     * <
3f00: 2f 70 3e 0a 20 20 20 20 20 2a 20 3c 70 3e 48 65  /p>.     * <p>He
3f10: 72 65 20 69 73 20 74 68 65 20 73 74 61 6e 64 61  re is the standa
3f20: 72 64 20 69 64 69 6f 6d 20 66 6f 72 20 74 72 61  rd idiom for tra
3f30: 6e 73 61 63 74 69 6f 6e 73 3a 0a 20 20 20 20 20  nsactions:.     
3f40: 2a 0a 20 20 20 20 20 2a 20 3c 70 72 65 3e 0a 20  *.     * <pre>. 
3f50: 20 20 20 20 2a 20 20 20 64 62 2e 62 65 67 69 6e      *   db.begin
3f60: 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20  Transaction();. 
3f70: 20 20 20 20 2a 20 20 20 74 72 79 20 7b 0a 20 20      *   try {.  
3f80: 20 20 20 2a 20 20 20 20 20 2e 2e 2e 0a 20 20 20     *     ....   
3f90: 20 20 2a 20 20 20 20 20 64 62 2e 73 65 74 54 72    *     db.setTr
3fa0: 61 6e 73 61 63 74 69 6f 6e 53 75 63 63 65 73 73  ansactionSuccess
3fb0: 66 75 6c 28 29 3b 0a 20 20 20 20 20 2a 20 20 20  ful();.     *   
3fc0: 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a 20 20 20 20  } finally {.    
3fd0: 20 2a 20 20 20 20 20 64 62 2e 65 6e 64 54 72 61   *     db.endTra
3fe0: 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20 20 20  nsaction();.    
3ff0: 20 2a 20 20 20 7d 0a 20 20 20 20 20 2a 20 3c 2f   *   }.     * </
4000: 70 72 65 3e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  pre>.     */.   
4010: 20 70 75 62 6c 69 63 20 76 6f 69 64 20 62 65 67   public void beg
4020: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 29 20  inTransaction() 
4030: 7b 0a 20 20 20 20 20 20 20 20 62 65 67 69 6e 54  {.        beginT
4040: 72 61 6e 73 61 63 74 69 6f 6e 28 6e 75 6c 6c 20  ransaction(null 
4050: 2f 2a 20 74 72 61 6e 73 61 63 74 69 6f 6e 53 74  /* transactionSt
4060: 61 74 75 73 43 61 6c 6c 62 61 63 6b 20 2a 2f 2c  atusCallback */,
4070: 20 74 72 75 65 29 3b 0a 20 20 20 20 7d 0a 0a 20   true);.    }.. 
4080: 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 42 65     /**.     * Be
4090: 67 69 6e 73 20 61 20 74 72 61 6e 73 61 63 74 69  gins a transacti
40a0: 6f 6e 20 69 6e 20 49 4d 4d 45 44 49 41 54 45 20  on in IMMEDIATE 
40b0: 6d 6f 64 65 2e 20 54 72 61 6e 73 61 63 74 69 6f  mode. Transactio
40c0: 6e 73 20 63 61 6e 20 62 65 20 6e 65 73 74 65 64  ns can be nested
40d0: 2e 20 57 68 65 6e 0a 20 20 20 20 20 2a 20 74 68  . When.     * th
40e0: 65 20 6f 75 74 65 72 20 74 72 61 6e 73 61 63 74  e outer transact
40f0: 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 61 6c 6c  ion is ended all
4100: 20 6f 66 20 74 68 65 20 77 6f 72 6b 20 64 6f 6e   of the work don
4110: 65 20 69 6e 20 74 68 61 74 20 74 72 61 6e 73 61  e in that transa
4120: 63 74 69 6f 6e 0a 20 20 20 20 20 2a 20 61 6e 64  ction.     * and
4130: 20 61 6c 6c 20 6f 66 20 74 68 65 20 6e 65 73 74   all of the nest
4140: 65 64 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20  ed transactions 
4150: 77 69 6c 6c 20 62 65 20 63 6f 6d 6d 69 74 74 65  will be committe
4160: 64 20 6f 72 20 72 6f 6c 6c 65 64 20 62 61 63 6b  d or rolled back
4170: 2e 20 54 68 65 0a 20 20 20 20 20 2a 20 63 68 61  . The.     * cha
4180: 6e 67 65 73 20 77 69 6c 6c 20 62 65 20 72 6f 6c  nges will be rol
4190: 6c 65 64 20 62 61 63 6b 20 69 66 20 61 6e 79 20  led back if any 
41a0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 65  transaction is e
41b0: 6e 64 65 64 20 77 69 74 68 6f 75 74 20 62 65 69  nded without bei
41c0: 6e 67 0a 20 20 20 20 20 2a 20 6d 61 72 6b 65 64  ng.     * marked
41d0: 20 61 73 20 63 6c 65 61 6e 20 28 62 79 20 63 61   as clean (by ca
41e0: 6c 6c 69 6e 67 20 73 65 74 54 72 61 6e 73 61 63  lling setTransac
41f0: 74 69 6f 6e 53 75 63 63 65 73 73 66 75 6c 29 2e  tionSuccessful).
4200: 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 79 0a   Otherwise they.
4210: 20 20 20 20 20 2a 20 77 69 6c 6c 20 62 65 20 63       * will be c
4220: 6f 6d 6d 69 74 74 65 64 2e 0a 20 20 20 20 20 2a  ommitted..     *
4230: 20 3c 70 3e 0a 20 20 20 20 20 2a 20 48 65 72 65   <p>.     * Here
4240: 20 69 73 20 74 68 65 20 73 74 61 6e 64 61 72 64   is the standard
4250: 20 69 64 69 6f 6d 20 66 6f 72 20 74 72 61 6e 73   idiom for trans
4260: 61 63 74 69 6f 6e 73 3a 0a 20 20 20 20 20 2a 0a  actions:.     *.
4270: 20 20 20 20 20 2a 20 3c 70 72 65 3e 0a 20 20 20       * <pre>.   
4280: 20 20 2a 20 20 20 64 62 2e 62 65 67 69 6e 54 72    *   db.beginTr
4290: 61 6e 73 61 63 74 69 6f 6e 4e 6f 6e 45 78 63 6c  ansactionNonExcl
42a0: 75 73 69 76 65 28 29 3b 0a 20 20 20 20 20 2a 20  usive();.     * 
42b0: 20 20 74 72 79 20 7b 0a 20 20 20 20 20 2a 20 20    try {.     *  
42c0: 20 20 20 2e 2e 2e 0a 20 20 20 20 20 2a 20 20 20     ....     *   
42d0: 20 20 64 62 2e 73 65 74 54 72 61 6e 73 61 63 74    db.setTransact
42e0: 69 6f 6e 53 75 63 63 65 73 73 66 75 6c 28 29 3b  ionSuccessful();
42f0: 0a 20 20 20 20 20 2a 20 20 20 7d 20 66 69 6e 61  .     *   } fina
4300: 6c 6c 79 20 7b 0a 20 20 20 20 20 2a 20 20 20 20  lly {.     *    
4310: 20 64 62 2e 65 6e 64 54 72 61 6e 73 61 63 74 69   db.endTransacti
4320: 6f 6e 28 29 3b 0a 20 20 20 20 20 2a 20 20 20 7d  on();.     *   }
4330: 0a 20 20 20 20 20 2a 20 3c 2f 70 72 65 3e 0a 20  .     * </pre>. 
4340: 20 20 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69      */.    publi
4350: 63 20 76 6f 69 64 20 62 65 67 69 6e 54 72 61 6e  c void beginTran
4360: 73 61 63 74 69 6f 6e 4e 6f 6e 45 78 63 6c 75 73  sactionNonExclus
4370: 69 76 65 28 29 20 7b 0a 20 20 20 20 20 20 20 20  ive() {.        
4380: 62 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e  beginTransaction
4390: 28 6e 75 6c 6c 20 2f 2a 20 74 72 61 6e 73 61 63  (null /* transac
43a0: 74 69 6f 6e 53 74 61 74 75 73 43 61 6c 6c 62 61  tionStatusCallba
43b0: 63 6b 20 2a 2f 2c 20 66 61 6c 73 65 29 3b 0a 20  ck */, false);. 
43c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20     }..    /**.  
43d0: 20 20 20 2a 20 42 65 67 69 6e 73 20 61 20 74 72     * Begins a tr
43e0: 61 6e 73 61 63 74 69 6f 6e 20 69 6e 20 45 58 43  ansaction in EXC
43f0: 4c 55 53 49 56 45 20 6d 6f 64 65 2e 0a 20 20 20  LUSIVE mode..   
4400: 20 20 2a 20 3c 70 3e 0a 20 20 20 20 20 2a 20 54    * <p>.     * T
4410: 72 61 6e 73 61 63 74 69 6f 6e 73 20 63 61 6e 20  ransactions can 
4420: 62 65 20 6e 65 73 74 65 64 2e 0a 20 20 20 20 20  be nested..     
4430: 2a 20 57 68 65 6e 20 74 68 65 20 6f 75 74 65 72  * When the outer
4440: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
4450: 65 6e 64 65 64 20 61 6c 6c 20 6f 66 0a 20 20 20  ended all of.   
4460: 20 20 2a 20 74 68 65 20 77 6f 72 6b 20 64 6f 6e    * the work don
4470: 65 20 69 6e 20 74 68 61 74 20 74 72 61 6e 73 61  e in that transa
4480: 63 74 69 6f 6e 20 61 6e 64 20 61 6c 6c 20 6f 66  ction and all of
4490: 20 74 68 65 20 6e 65 73 74 65 64 20 74 72 61 6e   the nested tran
44a0: 73 61 63 74 69 6f 6e 73 20 77 69 6c 6c 20 62 65  sactions will be
44b0: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 72 0a 20 20   committed or.  
44c0: 20 20 20 2a 20 72 6f 6c 6c 65 64 20 62 61 63 6b     * rolled back
44d0: 2e 20 54 68 65 20 63 68 61 6e 67 65 73 20 77 69  . The changes wi
44e0: 6c 6c 20 62 65 20 72 6f 6c 6c 65 64 20 62 61 63  ll be rolled bac
44f0: 6b 20 69 66 20 61 6e 79 20 74 72 61 6e 73 61 63  k if any transac
4500: 74 69 6f 6e 20 69 73 20 65 6e 64 65 64 20 77 69  tion is ended wi
4510: 74 68 6f 75 74 20 62 65 69 6e 67 0a 20 20 20 20  thout being.    
4520: 20 2a 20 6d 61 72 6b 65 64 20 61 73 20 63 6c 65   * marked as cle
4530: 61 6e 20 28 62 79 20 63 61 6c 6c 69 6e 67 20 73  an (by calling s
4540: 65 74 54 72 61 6e 73 61 63 74 69 6f 6e 53 75 63  etTransactionSuc
4550: 63 65 73 73 66 75 6c 29 2e 20 4f 74 68 65 72 77  cessful). Otherw
4560: 69 73 65 20 74 68 65 79 20 77 69 6c 6c 20 62 65  ise they will be
4570: 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 20 20 20 20   committed..    
4580: 20 2a 20 3c 2f 70 3e 0a 20 20 20 20 20 2a 20 3c   * </p>.     * <
4590: 70 3e 48 65 72 65 20 69 73 20 74 68 65 20 73 74  p>Here is the st
45a0: 61 6e 64 61 72 64 20 69 64 69 6f 6d 20 66 6f 72  andard idiom for
45b0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 3a 0a 20   transactions:. 
45c0: 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 3c 70 72      *.     * <pr
45d0: 65 3e 0a 20 20 20 20 20 2a 20 20 20 64 62 2e 62  e>.     *   db.b
45e0: 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 57  eginTransactionW
45f0: 69 74 68 4c 69 73 74 65 6e 65 72 28 6c 69 73 74  ithListener(list
4600: 65 6e 65 72 29 3b 0a 20 20 20 20 20 2a 20 20 20  ener);.     *   
4610: 74 72 79 20 7b 0a 20 20 20 20 20 2a 20 20 20 20  try {.     *    
4620: 20 2e 2e 2e 0a 20 20 20 20 20 2a 20 20 20 20 20   ....     *     
4630: 64 62 2e 73 65 74 54 72 61 6e 73 61 63 74 69 6f  db.setTransactio
4640: 6e 53 75 63 63 65 73 73 66 75 6c 28 29 3b 0a 20  nSuccessful();. 
4650: 20 20 20 20 2a 20 20 20 7d 20 66 69 6e 61 6c 6c      *   } finall
4660: 79 20 7b 0a 20 20 20 20 20 2a 20 20 20 20 20 64  y {.     *     d
4670: 62 2e 65 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e  b.endTransaction
4680: 28 29 3b 0a 20 20 20 20 20 2a 20 20 20 7d 0a 20  ();.     *   }. 
4690: 20 20 20 20 2a 20 3c 2f 70 72 65 3e 0a 20 20 20      * </pre>.   
46a0: 20 20 2a 0a 20 20 20 20 20 2a 20 40 70 61 72 61    *.     * @para
46b0: 6d 20 74 72 61 6e 73 61 63 74 69 6f 6e 4c 69 73  m transactionLis
46c0: 74 65 6e 65 72 20 6c 69 73 74 65 6e 65 72 20 74  tener listener t
46d0: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 6e 6f  hat should be no
46e0: 74 69 66 69 65 64 20 77 68 65 6e 20 74 68 65 20  tified when the 
46f0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 62 65 67 69  transaction begi
4700: 6e 73 2c 0a 20 20 20 20 20 2a 20 63 6f 6d 6d 69  ns,.     * commi
4710: 74 73 2c 20 6f 72 20 69 73 20 72 6f 6c 6c 65 64  ts, or is rolled
4720: 20 62 61 63 6b 2c 20 65 69 74 68 65 72 20 65 78   back, either ex
4730: 70 6c 69 63 69 74 6c 79 20 6f 72 20 62 79 20 61  plicitly or by a
4740: 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20 2a 20   call to.     * 
4750: 7b 40 6c 69 6e 6b 20 23 79 69 65 6c 64 49 66 43  {@link #yieldIfC
4760: 6f 6e 74 65 6e 64 65 64 53 61 66 65 6c 79 7d 2e  ontendedSafely}.
4770: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 75 62  .     */.    pub
4780: 6c 69 63 20 76 6f 69 64 20 62 65 67 69 6e 54 72  lic void beginTr
4790: 61 6e 73 61 63 74 69 6f 6e 57 69 74 68 4c 69 73  ansactionWithLis
47a0: 74 65 6e 65 72 28 53 51 4c 69 74 65 54 72 61 6e  tener(SQLiteTran
47b0: 73 61 63 74 69 6f 6e 4c 69 73 74 65 6e 65 72 20  sactionListener 
47c0: 74 72 61 6e 73 61 63 74 69 6f 6e 4c 69 73 74 65  transactionListe
47d0: 6e 65 72 29 20 7b 0a 20 20 20 20 20 20 20 20 62  ner) {.        b
47e0: 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28  eginTransaction(
47f0: 74 72 61 6e 73 61 63 74 69 6f 6e 4c 69 73 74 65  transactionListe
4800: 6e 65 72 2c 20 74 72 75 65 29 3b 0a 20 20 20 20  ner, true);.    
4810: 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20  }..    /**.     
4820: 2a 20 42 65 67 69 6e 73 20 61 20 74 72 61 6e 73  * Begins a trans
4830: 61 63 74 69 6f 6e 20 69 6e 20 49 4d 4d 45 44 49  action in IMMEDI
4840: 41 54 45 20 6d 6f 64 65 2e 20 54 72 61 6e 73 61  ATE mode. Transa
4850: 63 74 69 6f 6e 73 20 63 61 6e 20 62 65 20 6e 65  ctions can be ne
4860: 73 74 65 64 2e 20 57 68 65 6e 0a 20 20 20 20 20  sted. When.     
4870: 2a 20 74 68 65 20 6f 75 74 65 72 20 74 72 61 6e  * the outer tran
4880: 73 61 63 74 69 6f 6e 20 69 73 20 65 6e 64 65 64  saction is ended
4890: 20 61 6c 6c 20 6f 66 20 74 68 65 20 77 6f 72 6b   all of the work
48a0: 20 64 6f 6e 65 20 69 6e 20 74 68 61 74 20 74 72   done in that tr
48b0: 61 6e 73 61 63 74 69 6f 6e 0a 20 20 20 20 20 2a  ansaction.     *
48c0: 20 61 6e 64 20 61 6c 6c 20 6f 66 20 74 68 65 20   and all of the 
48d0: 6e 65 73 74 65 64 20 74 72 61 6e 73 61 63 74 69  nested transacti
48e0: 6f 6e 73 20 77 69 6c 6c 20 62 65 20 63 6f 6d 6d  ons will be comm
48f0: 69 74 74 65 64 20 6f 72 20 72 6f 6c 6c 65 64 20  itted or rolled 
4900: 62 61 63 6b 2e 20 54 68 65 0a 20 20 20 20 20 2a  back. The.     *
4910: 20 63 68 61 6e 67 65 73 20 77 69 6c 6c 20 62 65   changes will be
4920: 20 72 6f 6c 6c 65 64 20 62 61 63 6b 20 69 66 20   rolled back if 
4930: 61 6e 79 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  any transaction 
4940: 69 73 20 65 6e 64 65 64 20 77 69 74 68 6f 75 74  is ended without
4950: 20 62 65 69 6e 67 0a 20 20 20 20 20 2a 20 6d 61   being.     * ma
4960: 72 6b 65 64 20 61 73 20 63 6c 65 61 6e 20 28 62  rked as clean (b
4970: 79 20 63 61 6c 6c 69 6e 67 20 73 65 74 54 72 61  y calling setTra
4980: 6e 73 61 63 74 69 6f 6e 53 75 63 63 65 73 73 66  nsactionSuccessf
4990: 75 6c 29 2e 20 4f 74 68 65 72 77 69 73 65 20 74  ul). Otherwise t
49a0: 68 65 79 0a 20 20 20 20 20 2a 20 77 69 6c 6c 20  hey.     * will 
49b0: 62 65 20 63 6f 6d 6d 69 74 74 65 64 2e 0a 20 20  be committed..  
49c0: 20 20 20 2a 20 3c 70 3e 0a 20 20 20 20 20 2a 20     * <p>.     * 
49d0: 48 65 72 65 20 69 73 20 74 68 65 20 73 74 61 6e  Here is the stan
49e0: 64 61 72 64 20 69 64 69 6f 6d 20 66 6f 72 20 74  dard idiom for t
49f0: 72 61 6e 73 61 63 74 69 6f 6e 73 3a 0a 20 20 20  ransactions:.   
4a00: 20 20 2a 0a 20 20 20 20 20 2a 20 3c 70 72 65 3e    *.     * <pre>
4a10: 0a 20 20 20 20 20 2a 20 20 20 64 62 2e 62 65 67  .     *   db.beg
4a20: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 57 69 74  inTransactionWit
4a30: 68 4c 69 73 74 65 6e 65 72 4e 6f 6e 45 78 63 6c  hListenerNonExcl
4a40: 75 73 69 76 65 28 6c 69 73 74 65 6e 65 72 29 3b  usive(listener);
4a50: 0a 20 20 20 20 20 2a 20 20 20 74 72 79 20 7b 0a  .     *   try {.
4a60: 20 20 20 20 20 2a 20 20 20 20 20 2e 2e 2e 0a 20       *     .... 
4a70: 20 20 20 20 2a 20 20 20 20 20 64 62 2e 73 65 74      *     db.set
4a80: 54 72 61 6e 73 61 63 74 69 6f 6e 53 75 63 63 65  TransactionSucce
4a90: 73 73 66 75 6c 28 29 3b 0a 20 20 20 20 20 2a 20  ssful();.     * 
4aa0: 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a 20 20    } finally {.  
4ab0: 20 20 20 2a 20 20 20 20 20 64 62 2e 65 6e 64 54     *     db.endT
4ac0: 72 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20  ransaction();.  
4ad0: 20 20 20 2a 20 20 20 7d 0a 20 20 20 20 20 2a 20     *   }.     * 
4ae0: 3c 2f 70 72 65 3e 0a 20 20 20 20 20 2a 0a 20 20  </pre>.     *.  
4af0: 20 20 20 2a 20 40 70 61 72 61 6d 20 74 72 61 6e     * @param tran
4b00: 73 61 63 74 69 6f 6e 4c 69 73 74 65 6e 65 72 20  sactionListener 
4b10: 6c 69 73 74 65 6e 65 72 20 74 68 61 74 20 73 68  listener that sh
4b20: 6f 75 6c 64 20 62 65 20 6e 6f 74 69 66 69 65 64  ould be notified
4b30: 20 77 68 65 6e 20 74 68 65 0a 20 20 20 20 20 2a   when the.     *
4b40: 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61 6e              tran
4b50: 73 61 63 74 69 6f 6e 20 62 65 67 69 6e 73 2c 20  saction begins, 
4b60: 63 6f 6d 6d 69 74 73 2c 20 6f 72 20 69 73 20 72  commits, or is r
4b70: 6f 6c 6c 65 64 20 62 61 63 6b 2c 20 65 69 74 68  olled back, eith
4b80: 65 72 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20  er.     *       
4b90: 20 20 20 20 20 65 78 70 6c 69 63 69 74 6c 79 20       explicitly 
4ba0: 6f 72 20 62 79 20 61 20 63 61 6c 6c 20 74 6f 20  or by a call to 
4bb0: 7b 40 6c 69 6e 6b 20 23 79 69 65 6c 64 49 66 43  {@link #yieldIfC
4bc0: 6f 6e 74 65 6e 64 65 64 53 61 66 65 6c 79 7d 2e  ontendedSafely}.
4bd0: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 75 62  .     */.    pub
4be0: 6c 69 63 20 76 6f 69 64 20 62 65 67 69 6e 54 72  lic void beginTr
4bf0: 61 6e 73 61 63 74 69 6f 6e 57 69 74 68 4c 69 73  ansactionWithLis
4c00: 74 65 6e 65 72 4e 6f 6e 45 78 63 6c 75 73 69 76  tenerNonExclusiv
4c10: 65 28 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  e(.            S
4c20: 51 4c 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e  QLiteTransaction
4c30: 4c 69 73 74 65 6e 65 72 20 74 72 61 6e 73 61 63  Listener transac
4c40: 74 69 6f 6e 4c 69 73 74 65 6e 65 72 29 20 7b 0a  tionListener) {.
4c50: 20 20 20 20 20 20 20 20 62 65 67 69 6e 54 72 61          beginTra
4c60: 6e 73 61 63 74 69 6f 6e 28 74 72 61 6e 73 61 63  nsaction(transac
4c70: 74 69 6f 6e 4c 69 73 74 65 6e 65 72 2c 20 66 61  tionListener, fa
4c80: 6c 73 65 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  lse);.    }..   
4c90: 20 70 72 69 76 61 74 65 20 76 6f 69 64 20 62 65   private void be
4ca0: 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 28 53  ginTransaction(S
4cb0: 51 4c 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e  QLiteTransaction
4cc0: 4c 69 73 74 65 6e 65 72 20 74 72 61 6e 73 61 63  Listener transac
4cd0: 74 69 6f 6e 4c 69 73 74 65 6e 65 72 2c 0a 20 20  tionListener,.  
4ce0: 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 65 61            boolea
4cf0: 6e 20 65 78 63 6c 75 73 69 76 65 29 20 7b 0a 20  n exclusive) {. 
4d00: 20 20 20 20 20 20 20 61 63 71 75 69 72 65 52 65         acquireRe
4d10: 66 65 72 65 6e 63 65 28 29 3b 0a 20 20 20 20 20  ference();.     
4d20: 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20     try {.       
4d30: 20 20 20 20 20 67 65 74 54 68 72 65 61 64 53 65       getThreadSe
4d40: 73 73 69 6f 6e 28 29 2e 62 65 67 69 6e 54 72 61  ssion().beginTra
4d50: 6e 73 61 63 74 69 6f 6e 28 0a 20 20 20 20 20 20  nsaction(.      
4d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 78                ex
4d70: 63 6c 75 73 69 76 65 20 3f 20 53 51 4c 69 74 65  clusive ? SQLite
4d80: 53 65 73 73 69 6f 6e 2e 54 52 41 4e 53 41 43 54  Session.TRANSACT
4d90: 49 4f 4e 5f 4d 4f 44 45 5f 45 58 43 4c 55 53 49  ION_MODE_EXCLUSI
4da0: 56 45 20 3a 0a 20 20 20 20 20 20 20 20 20 20 20  VE :.           
4db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4dc0: 20 53 51 4c 69 74 65 53 65 73 73 69 6f 6e 2e 54   SQLiteSession.T
4dd0: 52 41 4e 53 41 43 54 49 4f 4e 5f 4d 4f 44 45 5f  RANSACTION_MODE_
4de0: 49 4d 4d 45 44 49 41 54 45 2c 0a 20 20 20 20 20  IMMEDIATE,.     
4df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
4e00: 72 61 6e 73 61 63 74 69 6f 6e 4c 69 73 74 65 6e  ransactionListen
4e10: 65 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  er,.            
4e20: 20 20 20 20 20 20 20 20 67 65 74 54 68 72 65 61          getThrea
4e30: 64 44 65 66 61 75 6c 74 43 6f 6e 6e 65 63 74 69  dDefaultConnecti
4e40: 6f 6e 46 6c 61 67 73 28 66 61 6c 73 65 20 2f 2a  onFlags(false /*
4e50: 72 65 61 64 4f 6e 6c 79 2a 2f 29 2c 20 6e 75 6c  readOnly*/), nul
4e60: 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 66 69  l);.        } fi
4e70: 6e 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20 20  nally {.        
4e80: 20 20 20 20 72 65 6c 65 61 73 65 52 65 66 65 72      releaseRefer
4e90: 65 6e 63 65 28 29 3b 0a 20 20 20 20 20 20 20 20  ence();.        
4ea0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a  }.    }..    /**
4eb0: 0a 20 20 20 20 20 2a 20 45 6e 64 20 61 20 74 72  .     * End a tr
4ec0: 61 6e 73 61 63 74 69 6f 6e 2e 20 53 65 65 20 62  ansaction. See b
4ed0: 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20  eginTransaction 
4ee0: 66 6f 72 20 6e 6f 74 65 73 20 61 62 6f 75 74 20  for notes about 
4ef0: 68 6f 77 20 74 6f 20 75 73 65 20 74 68 69 73 20  how to use this 
4f00: 61 6e 64 20 77 68 65 6e 20 74 72 61 6e 73 61 63  and when transac
4f10: 74 69 6f 6e 73 0a 20 20 20 20 20 2a 20 61 72 65  tions.     * are
4f20: 20 63 6f 6d 6d 69 74 74 65 64 20 61 6e 64 20 72   committed and r
4f30: 6f 6c 6c 65 64 20 62 61 63 6b 2e 0a 20 20 20 20  olled back..    
4f40: 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20 76   */.    public v
4f50: 6f 69 64 20 65 6e 64 54 72 61 6e 73 61 63 74 69  oid endTransacti
4f60: 6f 6e 28 29 20 7b 0a 20 20 20 20 20 20 20 20 61  on() {.        a
4f70: 63 71 75 69 72 65 52 65 66 65 72 65 6e 63 65 28  cquireReference(
4f80: 29 3b 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b  );.        try {
4f90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 67 65 74  .            get
4fa0: 54 68 72 65 61 64 53 65 73 73 69 6f 6e 28 29 2e  ThreadSession().
4fb0: 65 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28 6e  endTransaction(n
4fc0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 20  ull);.        } 
4fd0: 66 69 6e 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20  finally {.      
4fe0: 20 20 20 20 20 20 72 65 6c 65 61 73 65 52 65 66        releaseRef
4ff0: 65 72 65 6e 63 65 28 29 3b 0a 20 20 20 20 20 20  erence();.      
5000: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
5010: 2a 2a 0a 20 20 20 20 20 2a 20 4d 61 72 6b 73 20  **.     * Marks 
5020: 74 68 65 20 63 75 72 72 65 6e 74 20 74 72 61 6e  the current tran
5030: 73 61 63 74 69 6f 6e 20 61 73 20 73 75 63 63 65  saction as succe
5040: 73 73 66 75 6c 2e 20 44 6f 20 6e 6f 74 20 64 6f  ssful. Do not do
5050: 20 61 6e 79 20 6d 6f 72 65 20 64 61 74 61 62 61   any more databa
5060: 73 65 20 77 6f 72 6b 20 62 65 74 77 65 65 6e 0a  se work between.
5070: 20 20 20 20 20 2a 20 63 61 6c 6c 69 6e 67 20 74       * calling t
5080: 68 69 73 20 61 6e 64 20 63 61 6c 6c 69 6e 67 20  his and calling 
5090: 65 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 2e 20  endTransaction. 
50a0: 44 6f 20 61 73 20 6c 69 74 74 6c 65 20 6e 6f 6e  Do as little non
50b0: 2d 64 61 74 61 62 61 73 65 20 77 6f 72 6b 20 61  -database work a
50c0: 73 20 70 6f 73 73 69 62 6c 65 20 69 6e 20 74 68  s possible in th
50d0: 61 74 0a 20 20 20 20 20 2a 20 73 69 74 75 61 74  at.     * situat
50e0: 69 6f 6e 20 74 6f 6f 2e 20 49 66 20 61 6e 79 20  ion too. If any 
50f0: 65 72 72 6f 72 73 20 61 72 65 20 65 6e 63 6f 75  errors are encou
5100: 6e 74 65 72 65 64 20 62 65 74 77 65 65 6e 20 74  ntered between t
5110: 68 69 73 20 61 6e 64 20 65 6e 64 54 72 61 6e 73  his and endTrans
5120: 61 63 74 69 6f 6e 20 74 68 65 20 74 72 61 6e 73  action the trans
5130: 61 63 74 69 6f 6e 0a 20 20 20 20 20 2a 20 77 69  action.     * wi
5140: 6c 6c 20 73 74 69 6c 6c 20 62 65 20 63 6f 6d 6d  ll still be comm
5150: 69 74 74 65 64 2e 0a 20 20 20 20 20 2a 0a 20 20  itted..     *.  
5160: 20 20 20 2a 20 40 74 68 72 6f 77 73 20 49 6c 6c     * @throws Ill
5170: 65 67 61 6c 53 74 61 74 65 45 78 63 65 70 74 69  egalStateExcepti
5180: 6f 6e 20 69 66 20 74 68 65 20 63 75 72 72 65 6e  on if the curren
5190: 74 20 74 68 72 65 61 64 20 69 73 20 6e 6f 74 20  t thread is not 
51a0: 69 6e 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  in a transaction
51b0: 20 6f 72 20 74 68 65 0a 20 20 20 20 20 2a 20 74   or the.     * t
51c0: 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20 61 6c  ransaction is al
51d0: 72 65 61 64 79 20 6d 61 72 6b 65 64 20 61 73 20  ready marked as 
51e0: 73 75 63 63 65 73 73 66 75 6c 2e 0a 20 20 20 20  successful..    
51f0: 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20 76   */.    public v
5200: 6f 69 64 20 73 65 74 54 72 61 6e 73 61 63 74 69  oid setTransacti
5210: 6f 6e 53 75 63 63 65 73 73 66 75 6c 28 29 20 7b  onSuccessful() {
5220: 0a 20 20 20 20 20 20 20 20 61 63 71 75 69 72 65  .        acquire
5230: 52 65 66 65 72 65 6e 63 65 28 29 3b 0a 20 20 20  Reference();.   
5240: 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20       try {.     
5250: 20 20 20 20 20 20 20 67 65 74 54 68 72 65 61 64         getThread
5260: 53 65 73 73 69 6f 6e 28 29 2e 73 65 74 54 72 61  Session().setTra
5270: 6e 73 61 63 74 69 6f 6e 53 75 63 63 65 73 73 66  nsactionSuccessf
5280: 75 6c 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 20  ul();.        } 
5290: 66 69 6e 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20  finally {.      
52a0: 20 20 20 20 20 20 72 65 6c 65 61 73 65 52 65 66        releaseRef
52b0: 65 72 65 6e 63 65 28 29 3b 0a 20 20 20 20 20 20  erence();.      
52c0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
52d0: 2a 2a 0a 20 20 20 20 20 2a 20 52 65 74 75 72 6e  **.     * Return
52e0: 73 20 74 72 75 65 20 69 66 20 74 68 65 20 63 75  s true if the cu
52f0: 72 72 65 6e 74 20 74 68 72 65 61 64 20 68 61 73  rrent thread has
5300: 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 70   a transaction p
5310: 65 6e 64 69 6e 67 2e 0a 20 20 20 20 20 2a 0a 20  ending..     *. 
5320: 20 20 20 20 2a 20 40 72 65 74 75 72 6e 20 54 72      * @return Tr
5330: 75 65 20 69 66 20 74 68 65 20 63 75 72 72 65 6e  ue if the curren
5340: 74 20 74 68 72 65 61 64 20 69 73 20 69 6e 20 61  t thread is in a
5350: 20 74 72 61 6e 73 61 63 74 69 6f 6e 2e 0a 20 20   transaction..  
5360: 20 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63     */.    public
5370: 20 62 6f 6f 6c 65 61 6e 20 69 6e 54 72 61 6e 73   boolean inTrans
5380: 61 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20 20  action() {.     
5390: 20 20 20 61 63 71 75 69 72 65 52 65 66 65 72 65     acquireRefere
53a0: 6e 63 65 28 29 3b 0a 20 20 20 20 20 20 20 20 74  nce();.        t
53b0: 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ry {.           
53c0: 20 72 65 74 75 72 6e 20 67 65 74 54 68 72 65 61   return getThrea
53d0: 64 53 65 73 73 69 6f 6e 28 29 2e 68 61 73 54 72  dSession().hasTr
53e0: 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20 20  ansaction();.   
53f0: 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b       } finally {
5400: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 6c  .            rel
5410: 65 61 73 65 52 65 66 65 72 65 6e 63 65 28 29 3b  easeReference();
5420: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
5430: 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a  ..    /**.     *
5440: 20 52 65 74 75 72 6e 73 20 74 72 75 65 20 69 66   Returns true if
5450: 20 74 68 65 20 63 75 72 72 65 6e 74 20 74 68 72   the current thr
5460: 65 61 64 20 69 73 20 68 6f 6c 64 69 6e 67 20 61  ead is holding a
5470: 6e 20 61 63 74 69 76 65 20 63 6f 6e 6e 65 63 74  n active connect
5480: 69 6f 6e 20 74 6f 20 74 68 65 20 64 61 74 61 62  ion to the datab
5490: 61 73 65 2e 0a 20 20 20 20 20 2a 20 3c 70 3e 0a  ase..     * <p>.
54a0: 20 20 20 20 20 2a 20 54 68 65 20 6e 61 6d 65 20       * The name 
54b0: 6f 66 20 74 68 69 73 20 6d 65 74 68 6f 64 20 63  of this method c
54c0: 6f 6d 65 73 20 66 72 6f 6d 20 61 20 74 69 6d 65  omes from a time
54d0: 20 77 68 65 6e 20 68 61 76 69 6e 67 20 61 6e 20   when having an 
54e0: 61 63 74 69 76 65 20 63 6f 6e 6e 65 63 74 69 6f  active connectio
54f0: 6e 0a 20 20 20 20 20 2a 20 74 6f 20 74 68 65 20  n.     * to the 
5500: 64 61 74 61 62 61 73 65 20 6d 65 61 6e 74 20 74  database meant t
5510: 68 61 74 20 74 68 65 20 74 68 72 65 61 64 20 77  hat the thread w
5520: 61 73 20 68 6f 6c 64 69 6e 67 20 61 6e 20 61 63  as holding an ac
5530: 74 75 61 6c 20 6c 6f 63 6b 20 6f 6e 20 74 68 65  tual lock on the
5540: 0a 20 20 20 20 20 2a 20 64 61 74 61 62 61 73 65  .     * database
5550: 2e 20 20 4e 6f 77 61 64 61 79 73 2c 20 74 68 65  .  Nowadays, the
5560: 72 65 20 69 73 20 6e 6f 20 6c 6f 6e 67 65 72 20  re is no longer 
5570: 61 20 74 72 75 65 20 22 64 61 74 61 62 61 73 65  a true "database
5580: 20 6c 6f 63 6b 22 20 61 6c 74 68 6f 75 67 68 20   lock" although 
5590: 74 68 72 65 61 64 73 0a 20 20 20 20 20 2a 20 6d  threads.     * m
55a0: 61 79 20 62 6c 6f 63 6b 20 69 66 20 74 68 65 79  ay block if they
55b0: 20 63 61 6e 6e 6f 74 20 61 63 71 75 69 72 65 20   cannot acquire 
55c0: 61 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  a database conne
55d0: 63 74 69 6f 6e 20 74 6f 20 70 65 72 66 6f 72 6d  ction to perform
55e0: 20 61 0a 20 20 20 20 20 2a 20 70 61 72 74 69 63   a.     * partic
55f0: 75 6c 61 72 20 6f 70 65 72 61 74 69 6f 6e 2e 0a  ular operation..
5600: 20 20 20 20 20 2a 20 3c 2f 70 3e 0a 20 20 20 20       * </p>.    
5610: 20 2a 0a 20 20 20 20 20 2a 20 40 72 65 74 75 72   *.     * @retur
5620: 6e 20 54 72 75 65 20 69 66 20 74 68 65 20 63 75  n True if the cu
5630: 72 72 65 6e 74 20 74 68 72 65 61 64 20 69 73 20  rrent thread is 
5640: 68 6f 6c 64 69 6e 67 20 61 6e 20 61 63 74 69 76  holding an activ
5650: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 74 6f 20  e connection to 
5660: 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20  the database..  
5670: 20 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63     */.    public
5680: 20 62 6f 6f 6c 65 61 6e 20 69 73 44 62 4c 6f 63   boolean isDbLoc
5690: 6b 65 64 42 79 43 75 72 72 65 6e 74 54 68 72 65  kedByCurrentThre
56a0: 61 64 28 29 20 7b 0a 20 20 20 20 20 20 20 20 61  ad() {.        a
56b0: 63 71 75 69 72 65 52 65 66 65 72 65 6e 63 65 28  cquireReference(
56c0: 29 3b 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b  );.        try {
56d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
56e0: 75 72 6e 20 67 65 74 54 68 72 65 61 64 53 65 73  urn getThreadSes
56f0: 73 69 6f 6e 28 29 2e 68 61 73 43 6f 6e 6e 65 63  sion().hasConnec
5700: 74 69 6f 6e 28 29 3b 0a 20 20 20 20 20 20 20 20  tion();.        
5710: 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a 20 20 20 20  } finally {.    
5720: 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 52          releaseR
5730: 65 66 65 72 65 6e 63 65 28 29 3b 0a 20 20 20 20  eference();.    
5740: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
5750: 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 41 6c 77 61   /**.     * Alwa
5760: 79 73 20 72 65 74 75 72 6e 73 20 66 61 6c 73 65  ys returns false
5770: 2e 0a 20 20 20 20 20 2a 20 3c 70 3e 0a 20 20 20  ..     * <p>.   
5780: 20 20 2a 20 54 68 65 72 65 20 69 73 20 6e 6f 20    * There is no 
5790: 6c 6f 6e 67 65 72 20 74 68 65 20 63 6f 6e 63 65  longer the conce
57a0: 70 74 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  pt of a database
57b0: 20 6c 6f 63 6b 2c 20 73 6f 20 74 68 69 73 20 6d   lock, so this m
57c0: 65 74 68 6f 64 20 61 6c 77 61 79 73 20 72 65 74  ethod always ret
57d0: 75 72 6e 73 20 66 61 6c 73 65 2e 0a 20 20 20 20  urns false..    
57e0: 20 2a 20 3c 2f 70 3e 0a 20 20 20 20 20 2a 0a 20   * </p>.     *. 
57f0: 20 20 20 20 2a 20 40 72 65 74 75 72 6e 20 46 61      * @return Fa
5800: 6c 73 65 2e 0a 20 20 20 20 20 2a 20 40 64 65 70  lse..     * @dep
5810: 72 65 63 61 74 65 64 20 41 6c 77 61 79 73 20 72  recated Always r
5820: 65 74 75 72 6e 73 20 66 61 6c 73 65 2e 20 20 44  eturns false.  D
5830: 6f 20 6e 6f 74 20 75 73 65 20 74 68 69 73 20 6d  o not use this m
5840: 65 74 68 6f 64 2e 0a 20 20 20 20 20 2a 2f 0a 20  ethod..     */. 
5850: 20 20 20 40 44 65 70 72 65 63 61 74 65 64 0a 20     @Deprecated. 
5860: 20 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c 65 61     public boolea
5870: 6e 20 69 73 44 62 4c 6f 63 6b 65 64 42 79 4f 74  n isDbLockedByOt
5880: 68 65 72 54 68 72 65 61 64 73 28 29 20 7b 0a 20  herThreads() {. 
5890: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
58a0: 6c 73 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  lse;.    }..    
58b0: 2f 2a 2a 0a 20 20 20 20 20 2a 20 54 65 6d 70 6f  /**.     * Tempo
58c0: 72 61 72 69 6c 79 20 65 6e 64 20 74 68 65 20 74  rarily end the t
58d0: 72 61 6e 73 61 63 74 69 6f 6e 20 74 6f 20 6c 65  ransaction to le
58e0: 74 20 6f 74 68 65 72 20 74 68 72 65 61 64 73 20  t other threads 
58f0: 72 75 6e 2e 20 54 68 65 20 74 72 61 6e 73 61 63  run. The transac
5900: 74 69 6f 6e 20 69 73 20 61 73 73 75 6d 65 64 20  tion is assumed 
5910: 74 6f 20 62 65 0a 20 20 20 20 20 2a 20 73 75 63  to be.     * suc
5920: 63 65 73 73 66 75 6c 20 73 6f 20 66 61 72 2e 20  cessful so far. 
5930: 44 6f 20 6e 6f 74 20 63 61 6c 6c 20 73 65 74 54  Do not call setT
5940: 72 61 6e 73 61 63 74 69 6f 6e 53 75 63 63 65 73  ransactionSucces
5950: 73 66 75 6c 20 62 65 66 6f 72 65 20 63 61 6c 6c  sful before call
5960: 69 6e 67 20 74 68 69 73 2e 20 57 68 65 6e 20 74  ing this. When t
5970: 68 69 73 0a 20 20 20 20 20 2a 20 72 65 74 75 72  his.     * retur
5980: 6e 73 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63  ns a new transac
5990: 74 69 6f 6e 20 77 69 6c 6c 20 68 61 76 65 20 62  tion will have b
59a0: 65 65 6e 20 63 72 65 61 74 65 64 20 62 75 74 20  een created but 
59b0: 6e 6f 74 20 6d 61 72 6b 65 64 20 61 73 20 73 75  not marked as su
59c0: 63 63 65 73 73 66 75 6c 2e 0a 20 20 20 20 20 2a  ccessful..     *
59d0: 20 40 72 65 74 75 72 6e 20 74 72 75 65 20 69 66   @return true if
59e0: 20 74 68 65 20 74 72 61 6e 73 61 63 74 69 6f 6e   the transaction
59f0: 20 77 61 73 20 79 69 65 6c 64 65 64 0a 20 20 20   was yielded.   
5a00: 20 20 2a 20 40 64 65 70 72 65 63 61 74 65 64 20    * @deprecated 
5a10: 69 66 20 74 68 65 20 64 62 20 69 73 20 6c 6f 63  if the db is loc
5a20: 6b 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ked more than on
5a30: 63 65 20 28 62 65 63 75 61 73 65 20 6f 66 20 6e  ce (becuase of n
5a40: 65 73 74 65 64 20 74 72 61 6e 73 61 63 74 69 6f  ested transactio
5a50: 6e 73 29 20 74 68 65 6e 20 74 68 65 20 6c 6f 63  ns) then the loc
5a60: 6b 0a 20 20 20 20 20 2a 20 20 20 77 69 6c 6c 20  k.     *   will 
5a70: 6e 6f 74 20 62 65 20 79 69 65 6c 64 65 64 2e 20  not be yielded. 
5a80: 55 73 65 20 79 69 65 6c 64 49 66 43 6f 6e 74 65  Use yieldIfConte
5a90: 6e 64 65 64 53 61 66 65 6c 79 20 69 6e 73 74 65  ndedSafely inste
5aa0: 61 64 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  ad..     */.    
5ab0: 40 44 65 70 72 65 63 61 74 65 64 0a 20 20 20 20  @Deprecated.    
5ac0: 70 75 62 6c 69 63 20 62 6f 6f 6c 65 61 6e 20 79  public boolean y
5ad0: 69 65 6c 64 49 66 43 6f 6e 74 65 6e 64 65 64 28  ieldIfContended(
5ae0: 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ) {.        retu
5af0: 72 6e 20 79 69 65 6c 64 49 66 43 6f 6e 74 65 6e  rn yieldIfConten
5b00: 64 65 64 48 65 6c 70 65 72 28 66 61 6c 73 65 20  dedHelper(false 
5b10: 2f 2a 20 64 6f 20 6e 6f 74 20 63 68 65 63 6b 20  /* do not check 
5b20: 79 69 65 6c 64 69 6e 67 20 2a 2f 2c 0a 20 20 20  yielding */,.   
5b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 31 20               -1 
5b40: 2f 2a 20 73 6c 65 65 70 41 66 74 65 72 59 69 65  /* sleepAfterYie
5b50: 6c 64 44 65 6c 61 79 20 2a 2f 29 3b 0a 20 20 20  ldDelay */);.   
5b60: 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20   }..    /**.    
5b70: 20 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20 65   * Temporarily e
5b80: 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74 69  nd the transacti
5b90: 6f 6e 20 74 6f 20 6c 65 74 20 6f 74 68 65 72 20  on to let other 
5ba0: 74 68 72 65 61 64 73 20 72 75 6e 2e 20 54 68 65  threads run. The
5bb0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73 20   transaction is 
5bc0: 61 73 73 75 6d 65 64 20 74 6f 20 62 65 0a 20 20  assumed to be.  
5bd0: 20 20 20 2a 20 73 75 63 63 65 73 73 66 75 6c 20     * successful 
5be0: 73 6f 20 66 61 72 2e 20 44 6f 20 6e 6f 74 20 63  so far. Do not c
5bf0: 61 6c 6c 20 73 65 74 54 72 61 6e 73 61 63 74 69  all setTransacti
5c00: 6f 6e 53 75 63 63 65 73 73 66 75 6c 20 62 65 66  onSuccessful bef
5c10: 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69 73  ore calling this
5c20: 2e 20 57 68 65 6e 20 74 68 69 73 0a 20 20 20 20  . When this.    
5c30: 20 2a 20 72 65 74 75 72 6e 73 20 61 20 6e 65 77   * returns a new
5c40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69 6c   transaction wil
5c50: 6c 20 68 61 76 65 20 62 65 65 6e 20 63 72 65 61  l have been crea
5c60: 74 65 64 20 62 75 74 20 6e 6f 74 20 6d 61 72 6b  ted but not mark
5c70: 65 64 20 61 73 20 73 75 63 63 65 73 73 66 75 6c  ed as successful
5c80: 2e 20 54 68 69 73 20 61 73 73 75 6d 65 73 0a 20  . This assumes. 
5c90: 20 20 20 20 2a 20 74 68 61 74 20 74 68 65 72 65      * that there
5ca0: 20 61 72 65 20 6e 6f 20 6e 65 73 74 65 64 20 74   are no nested t
5cb0: 72 61 6e 73 61 63 74 69 6f 6e 73 20 28 62 65 67  ransactions (beg
5cc0: 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 68 61  inTransaction ha
5cd0: 73 20 6f 6e 6c 79 20 62 65 65 6e 20 63 61 6c 6c  s only been call
5ce0: 65 64 20 6f 6e 63 65 29 20 61 6e 64 20 77 69 6c  ed once) and wil
5cf0: 6c 0a 20 20 20 20 20 2a 20 74 68 72 6f 77 20 61  l.     * throw a
5d00: 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20 74  n exception if t
5d10: 68 61 74 20 69 73 20 6e 6f 74 20 74 68 65 20 63  hat is not the c
5d20: 61 73 65 2e 0a 20 20 20 20 20 2a 20 40 72 65 74  ase..     * @ret
5d30: 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65 20  urn true if the 
5d40: 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73 20  transaction was 
5d50: 79 69 65 6c 64 65 64 0a 20 20 20 20 20 2a 2f 0a  yielded.     */.
5d60: 20 20 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c 65      public boole
5d70: 61 6e 20 79 69 65 6c 64 49 66 43 6f 6e 74 65 6e  an yieldIfConten
5d80: 64 65 64 53 61 66 65 6c 79 28 29 20 7b 0a 20 20  dedSafely() {.  
5d90: 20 20 20 20 20 20 72 65 74 75 72 6e 20 79 69 65        return yie
5da0: 6c 64 49 66 43 6f 6e 74 65 6e 64 65 64 48 65 6c  ldIfContendedHel
5db0: 70 65 72 28 74 72 75 65 20 2f 2a 20 63 68 65 63  per(true /* chec
5dc0: 6b 20 79 69 65 6c 64 69 6e 67 20 2a 2f 2c 20 2d  k yielding */, -
5dd0: 31 20 2f 2a 20 73 6c 65 65 70 41 66 74 65 72 59  1 /* sleepAfterY
5de0: 69 65 6c 64 44 65 6c 61 79 2a 2f 29 3b 0a 20 20  ieldDelay*/);.  
5df0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20    }..    /**.   
5e00: 20 20 2a 20 54 65 6d 70 6f 72 61 72 69 6c 79 20    * Temporarily 
5e10: 65 6e 64 20 74 68 65 20 74 72 61 6e 73 61 63 74  end the transact
5e20: 69 6f 6e 20 74 6f 20 6c 65 74 20 6f 74 68 65 72  ion to let other
5e30: 20 74 68 72 65 61 64 73 20 72 75 6e 2e 20 54 68   threads run. Th
5e40: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 69 73  e transaction is
5e50: 20 61 73 73 75 6d 65 64 20 74 6f 20 62 65 0a 20   assumed to be. 
5e60: 20 20 20 20 2a 20 73 75 63 63 65 73 73 66 75 6c      * successful
5e70: 20 73 6f 20 66 61 72 2e 20 44 6f 20 6e 6f 74 20   so far. Do not 
5e80: 63 61 6c 6c 20 73 65 74 54 72 61 6e 73 61 63 74  call setTransact
5e90: 69 6f 6e 53 75 63 63 65 73 73 66 75 6c 20 62 65  ionSuccessful be
5ea0: 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 74 68 69  fore calling thi
5eb0: 73 2e 20 57 68 65 6e 20 74 68 69 73 0a 20 20 20  s. When this.   
5ec0: 20 20 2a 20 72 65 74 75 72 6e 73 20 61 20 6e 65    * returns a ne
5ed0: 77 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 69  w transaction wi
5ee0: 6c 6c 20 68 61 76 65 20 62 65 65 6e 20 63 72 65  ll have been cre
5ef0: 61 74 65 64 20 62 75 74 20 6e 6f 74 20 6d 61 72  ated but not mar
5f00: 6b 65 64 20 61 73 20 73 75 63 63 65 73 73 66 75  ked as successfu
5f10: 6c 2e 20 54 68 69 73 20 61 73 73 75 6d 65 73 0a  l. This assumes.
5f20: 20 20 20 20 20 2a 20 74 68 61 74 20 74 68 65 72       * that ther
5f30: 65 20 61 72 65 20 6e 6f 20 6e 65 73 74 65 64 20  e are no nested 
5f40: 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 28 62 65  transactions (be
5f50: 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 20 68  ginTransaction h
5f60: 61 73 20 6f 6e 6c 79 20 62 65 65 6e 20 63 61 6c  as only been cal
5f70: 6c 65 64 20 6f 6e 63 65 29 20 61 6e 64 20 77 69  led once) and wi
5f80: 6c 6c 0a 20 20 20 20 20 2a 20 74 68 72 6f 77 20  ll.     * throw 
5f90: 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 69 66 20  an exception if 
5fa0: 74 68 61 74 20 69 73 20 6e 6f 74 20 74 68 65 20  that is not the 
5fb0: 63 61 73 65 2e 0a 20 20 20 20 20 2a 20 40 70 61  case..     * @pa
5fc0: 72 61 6d 20 73 6c 65 65 70 41 66 74 65 72 59 69  ram sleepAfterYi
5fd0: 65 6c 64 44 65 6c 61 79 20 69 66 20 3e 20 30 2c  eldDelay if > 0,
5fe0: 20 73 6c 65 65 70 20 74 68 69 73 20 6c 6f 6e 67   sleep this long
5ff0: 20 62 65 66 6f 72 65 20 73 74 61 72 74 69 6e 67   before starting
6000: 20 61 20 6e 65 77 20 74 72 61 6e 73 61 63 74 69   a new transacti
6010: 6f 6e 20 69 66 0a 20 20 20 20 20 2a 20 20 20 74  on if.     *   t
6020: 68 65 20 6c 6f 63 6b 20 77 61 73 20 61 63 74 75  he lock was actu
6030: 61 6c 6c 79 20 79 69 65 6c 64 65 64 2e 20 54 68  ally yielded. Th
6040: 69 73 20 77 69 6c 6c 20 61 6c 6c 6f 77 20 6f 74  is will allow ot
6050: 68 65 72 20 62 61 63 6b 67 72 6f 75 6e 64 20 74  her background t
6060: 68 72 65 61 64 73 20 74 6f 20 6d 61 6b 65 20 73  hreads to make s
6070: 6f 6d 65 0a 20 20 20 20 20 2a 20 20 20 6d 6f 72  ome.     *   mor
6080: 65 20 70 72 6f 67 72 65 73 73 20 74 68 61 6e 20  e progress than 
6090: 74 68 65 79 20 77 6f 75 6c 64 20 69 66 20 77 65  they would if we
60a0: 20 73 74 61 72 74 65 64 20 74 68 65 20 74 72 61   started the tra
60b0: 6e 73 61 63 74 69 6f 6e 20 69 6d 6d 65 64 69 61  nsaction immedia
60c0: 74 65 6c 79 2e 0a 20 20 20 20 20 2a 20 40 72 65  tely..     * @re
60d0: 74 75 72 6e 20 74 72 75 65 20 69 66 20 74 68 65  turn true if the
60e0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 77 61 73   transaction was
60f0: 20 79 69 65 6c 64 65 64 0a 20 20 20 20 20 2a 2f   yielded.     */
6100: 0a 20 20 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c  .    public bool
6110: 65 61 6e 20 79 69 65 6c 64 49 66 43 6f 6e 74 65  ean yieldIfConte
6120: 6e 64 65 64 53 61 66 65 6c 79 28 6c 6f 6e 67 20  ndedSafely(long 
6130: 73 6c 65 65 70 41 66 74 65 72 59 69 65 6c 64 44  sleepAfterYieldD
6140: 65 6c 61 79 29 20 7b 0a 20 20 20 20 20 20 20 20  elay) {.        
6150: 72 65 74 75 72 6e 20 79 69 65 6c 64 49 66 43 6f  return yieldIfCo
6160: 6e 74 65 6e 64 65 64 48 65 6c 70 65 72 28 74 72  ntendedHelper(tr
6170: 75 65 20 2f 2a 20 63 68 65 63 6b 20 79 69 65 6c  ue /* check yiel
6180: 64 69 6e 67 20 2a 2f 2c 20 73 6c 65 65 70 41 66  ding */, sleepAf
6190: 74 65 72 59 69 65 6c 64 44 65 6c 61 79 29 3b 0a  terYieldDelay);.
61a0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 69 76 61      }..    priva
61b0: 74 65 20 62 6f 6f 6c 65 61 6e 20 79 69 65 6c 64  te boolean yield
61c0: 49 66 43 6f 6e 74 65 6e 64 65 64 48 65 6c 70 65  IfContendedHelpe
61d0: 72 28 62 6f 6f 6c 65 61 6e 20 74 68 72 6f 77 49  r(boolean throwI
61e0: 66 55 6e 73 61 66 65 2c 20 6c 6f 6e 67 20 73 6c  fUnsafe, long sl
61f0: 65 65 70 41 66 74 65 72 59 69 65 6c 64 44 65 6c  eepAfterYieldDel
6200: 61 79 29 20 7b 0a 20 20 20 20 20 20 20 20 61 63  ay) {.        ac
6210: 71 75 69 72 65 52 65 66 65 72 65 6e 63 65 28 29  quireReference()
6220: 3b 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a  ;.        try {.
6230: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
6240: 72 6e 20 67 65 74 54 68 72 65 61 64 53 65 73 73  rn getThreadSess
6250: 69 6f 6e 28 29 2e 79 69 65 6c 64 54 72 61 6e 73  ion().yieldTrans
6260: 61 63 74 69 6f 6e 28 73 6c 65 65 70 41 66 74 65  action(sleepAfte
6270: 72 59 69 65 6c 64 44 65 6c 61 79 2c 20 74 68 72  rYieldDelay, thr
6280: 6f 77 49 66 55 6e 73 61 66 65 2c 20 6e 75 6c 6c  owIfUnsafe, null
6290: 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 66 69 6e  );.        } fin
62a0: 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20 20 20  ally {.         
62b0: 20 20 20 72 65 6c 65 61 73 65 52 65 66 65 72 65     releaseRefere
62c0: 6e 63 65 28 29 3b 0a 20 20 20 20 20 20 20 20 7d  nce();.        }
62d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a  .    }..    /**.
62e0: 20 20 20 20 20 2a 20 44 65 70 72 65 63 61 74 65       * Deprecate
62f0: 64 2e 0a 20 20 20 20 20 2a 20 40 64 65 70 72 65  d..     * @depre
6300: 63 61 74 65 64 20 54 68 69 73 20 6d 65 74 68 6f  cated This metho
6310: 64 20 6e 6f 20 6c 6f 6e 67 65 72 20 73 65 72 76  d no longer serv
6320: 65 73 20 61 6e 79 20 75 73 65 66 75 6c 20 70 75  es any useful pu
6330: 72 70 6f 73 65 20 61 6e 64 20 68 61 73 20 62 65  rpose and has be
6340: 65 6e 20 64 65 70 72 65 63 61 74 65 64 2e 0a 20  en deprecated.. 
6350: 20 20 20 20 2a 2f 0a 20 20 20 20 40 44 65 70 72      */.    @Depr
6360: 65 63 61 74 65 64 0a 20 20 20 20 70 75 62 6c 69  ecated.    publi
6370: 63 20 4d 61 70 3c 53 74 72 69 6e 67 2c 20 53 74  c Map<String, St
6380: 72 69 6e 67 3e 20 67 65 74 53 79 6e 63 65 64 54  ring> getSyncedT
6390: 61 62 6c 65 73 28 29 20 7b 0a 20 20 20 20 20 20  ables() {.      
63a0: 20 20 72 65 74 75 72 6e 20 6e 65 77 20 48 61 73    return new Has
63b0: 68 4d 61 70 3c 53 74 72 69 6e 67 2c 20 53 74 72  hMap<String, Str
63c0: 69 6e 67 3e 28 30 29 3b 0a 20 20 20 20 7d 0a 0a  ing>(0);.    }..
63d0: 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 4f      /**.     * O
63e0: 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
63f0: 20 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 74 68   according to th
6400: 65 20 66 6c 61 67 73 20 7b 40 6c 69 6e 6b 20 23  e flags {@link #
6410: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 7d 0a  OPEN_READWRITE}.
6420: 20 20 20 20 20 2a 20 7b 40 6c 69 6e 6b 20 23 4f       * {@link #O
6430: 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 7d 20 7b 40  PEN_READONLY} {@
6440: 6c 69 6e 6b 20 23 43 52 45 41 54 45 5f 49 46 5f  link #CREATE_IF_
6450: 4e 45 43 45 53 53 41 52 59 7d 20 61 6e 64 2f 6f  NECESSARY} and/o
6460: 72 20 7b 40 6c 69 6e 6b 20 23 4e 4f 5f 4c 4f 43  r {@link #NO_LOC
6470: 41 4c 49 5a 45 44 5f 43 4f 4c 4c 41 54 4f 52 53  ALIZED_COLLATORS
6480: 7d 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a  }..     *.     *
6490: 20 3c 70 3e 53 65 74 73 20 74 68 65 20 6c 6f 63   <p>Sets the loc
64a0: 61 6c 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ale of the datab
64b0: 61 73 65 20 74 6f 20 74 68 65 20 20 74 68 65 20  ase to the  the 
64c0: 73 79 73 74 65 6d 27 73 20 63 75 72 72 65 6e 74  system's current
64d0: 20 6c 6f 63 61 6c 65 2e 0a 20 20 20 20 20 2a 20   locale..     * 
64e0: 43 61 6c 6c 20 7b 40 6c 69 6e 6b 20 23 73 65 74  Call {@link #set
64f0: 4c 6f 63 61 6c 65 7d 20 69 66 20 79 6f 75 20 77  Locale} if you w
6500: 6f 75 6c 64 20 6c 69 6b 65 20 73 6f 6d 65 74 68  ould like someth
6510: 69 6e 67 20 65 6c 73 65 2e 3c 2f 70 3e 0a 20 20  ing else.</p>.  
6520: 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 70 61 72     *.     * @par
6530: 61 6d 20 70 61 74 68 20 74 6f 20 64 61 74 61 62  am path to datab
6540: 61 73 65 20 66 69 6c 65 20 74 6f 20 6f 70 65 6e  ase file to open
6550: 20 61 6e 64 2f 6f 72 20 63 72 65 61 74 65 0a 20   and/or create. 
6560: 20 20 20 20 2a 20 40 70 61 72 61 6d 20 66 61 63      * @param fac
6570: 74 6f 72 79 20 61 6e 20 6f 70 74 69 6f 6e 61 6c  tory an optional
6580: 20 66 61 63 74 6f 72 79 20 63 6c 61 73 73 20 74   factory class t
6590: 68 61 74 20 69 73 20 63 61 6c 6c 65 64 20 74 6f  hat is called to
65a0: 20 69 6e 73 74 61 6e 74 69 61 74 65 20 61 0a 20   instantiate a. 
65b0: 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20      *           
65c0: 20 63 75 72 73 6f 72 20 77 68 65 6e 20 71 75 65   cursor when que
65d0: 72 79 20 69 73 20 63 61 6c 6c 65 64 2c 20 6f 72  ry is called, or
65e0: 20 6e 75 6c 6c 20 66 6f 72 20 64 65 66 61 75 6c   null for defaul
65f0: 74 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20  t.     * @param 
6600: 66 6c 61 67 73 20 74 6f 20 63 6f 6e 74 72 6f 6c  flags to control
6610: 20 64 61 74 61 62 61 73 65 20 61 63 63 65 73 73   database access
6620: 20 6d 6f 64 65 0a 20 20 20 20 20 2a 20 40 72 65   mode.     * @re
6630: 74 75 72 6e 20 74 68 65 20 6e 65 77 6c 79 20 6f  turn the newly o
6640: 70 65 6e 65 64 20 64 61 74 61 62 61 73 65 0a 20  pened database. 
6650: 20 20 20 20 2a 20 40 74 68 72 6f 77 73 20 53 51      * @throws SQ
6660: 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 20 69 66  LiteException if
6670: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63 61   the database ca
6680: 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65 64 0a 20  nnot be opened. 
6690: 20 20 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69      */.    publi
66a0: 63 20 73 74 61 74 69 63 20 53 51 4c 69 74 65 44  c static SQLiteD
66b0: 61 74 61 62 61 73 65 20 6f 70 65 6e 44 61 74 61  atabase openData
66c0: 62 61 73 65 28 53 74 72 69 6e 67 20 70 61 74 68  base(String path
66d0: 2c 20 43 75 72 73 6f 72 46 61 63 74 6f 72 79 20  , CursorFactory 
66e0: 66 61 63 74 6f 72 79 2c 20 69 6e 74 20 66 6c 61  factory, int fla
66f0: 67 73 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65  gs) {.        re
6700: 74 75 72 6e 20 6f 70 65 6e 44 61 74 61 62 61 73  turn openDatabas
6710: 65 28 70 61 74 68 2c 20 66 61 63 74 6f 72 79 2c  e(path, factory,
6720: 20 66 6c 61 67 73 2c 20 6e 75 6c 6c 29 3b 0a 20   flags, null);. 
6730: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20     }..    /**.  
6740: 20 20 20 2a 20 4f 70 65 6e 20 74 68 65 20 64 61     * Open the da
6750: 74 61 62 61 73 65 20 61 63 63 6f 72 64 69 6e 67  tabase according
6760: 20 74 6f 20 74 68 65 20 66 6c 61 67 73 20 7b 40   to the flags {@
6770: 6c 69 6e 6b 20 23 4f 50 45 4e 5f 52 45 41 44 57  link #OPEN_READW
6780: 52 49 54 45 7d 0a 20 20 20 20 20 2a 20 7b 40 6c  RITE}.     * {@l
6790: 69 6e 6b 20 23 4f 50 45 4e 5f 52 45 41 44 4f 4e  ink #OPEN_READON
67a0: 4c 59 7d 20 7b 40 6c 69 6e 6b 20 23 43 52 45 41  LY} {@link #CREA
67b0: 54 45 5f 49 46 5f 4e 45 43 45 53 53 41 52 59 7d  TE_IF_NECESSARY}
67c0: 20 61 6e 64 2f 6f 72 20 7b 40 6c 69 6e 6b 20 23   and/or {@link #
67d0: 4e 4f 5f 4c 4f 43 41 4c 49 5a 45 44 5f 43 4f 4c  NO_LOCALIZED_COL
67e0: 4c 41 54 4f 52 53 7d 2e 0a 20 20 20 20 20 2a 0a  LATORS}..     *.
67f0: 20 20 20 20 20 2a 20 3c 70 3e 53 65 74 73 20 74       * <p>Sets t
6800: 68 65 20 6c 6f 63 61 6c 65 20 6f 66 20 74 68 65  he locale of the
6810: 20 64 61 74 61 62 61 73 65 20 74 6f 20 74 68 65   database to the
6820: 20 20 74 68 65 20 73 79 73 74 65 6d 27 73 20 63    the system's c
6830: 75 72 72 65 6e 74 20 6c 6f 63 61 6c 65 2e 0a 20  urrent locale.. 
6840: 20 20 20 20 2a 20 43 61 6c 6c 20 7b 40 6c 69 6e      * Call {@lin
6850: 6b 20 23 73 65 74 4c 6f 63 61 6c 65 7d 20 69 66  k #setLocale} if
6860: 20 79 6f 75 20 77 6f 75 6c 64 20 6c 69 6b 65 20   you would like 
6870: 73 6f 6d 65 74 68 69 6e 67 20 65 6c 73 65 2e 3c  something else.<
6880: 2f 70 3e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20  /p>.     *.     
6890: 2a 20 3c 70 3e 41 63 63 65 70 74 73 20 69 6e 70  * <p>Accepts inp
68a0: 75 74 20 70 61 72 61 6d 3a 20 61 20 63 6f 6e 63  ut param: a conc
68b0: 72 65 74 65 20 69 6e 73 74 61 6e 63 65 20 6f 66  rete instance of
68c0: 20 7b 40 6c 69 6e 6b 20 44 61 74 61 62 61 73 65   {@link Database
68d0: 45 72 72 6f 72 48 61 6e 64 6c 65 72 7d 20 74 6f  ErrorHandler} to
68e0: 20 62 65 0a 20 20 20 20 20 2a 20 75 73 65 64 20   be.     * used 
68f0: 74 6f 20 68 61 6e 64 6c 65 20 63 6f 72 72 75 70  to handle corrup
6900: 74 69 6f 6e 20 77 68 65 6e 20 73 71 6c 69 74 65  tion when sqlite
6910: 20 72 65 70 6f 72 74 73 20 64 61 74 61 62 61 73   reports databas
6920: 65 20 63 6f 72 72 75 70 74 69 6f 6e 2e 3c 2f 70  e corruption.</p
6930: 3e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20  >.     *.     * 
6940: 40 70 61 72 61 6d 20 70 61 74 68 20 74 6f 20 64  @param path to d
6950: 61 74 61 62 61 73 65 20 66 69 6c 65 20 74 6f 20  atabase file to 
6960: 6f 70 65 6e 20 61 6e 64 2f 6f 72 20 63 72 65 61  open and/or crea
6970: 74 65 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d  te.     * @param
6980: 20 66 61 63 74 6f 72 79 20 61 6e 20 6f 70 74 69   factory an opti
6990: 6f 6e 61 6c 20 66 61 63 74 6f 72 79 20 63 6c 61  onal factory cla
69a0: 73 73 20 74 68 61 74 20 69 73 20 63 61 6c 6c 65  ss that is calle
69b0: 64 20 74 6f 20 69 6e 73 74 61 6e 74 69 61 74 65  d to instantiate
69c0: 20 61 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20   a.     *       
69d0: 20 20 20 20 20 63 75 72 73 6f 72 20 77 68 65 6e       cursor when
69e0: 20 71 75 65 72 79 20 69 73 20 63 61 6c 6c 65 64   query is called
69f0: 2c 20 6f 72 20 6e 75 6c 6c 20 66 6f 72 20 64 65  , or null for de
6a00: 66 61 75 6c 74 0a 20 20 20 20 20 2a 20 40 70 61  fault.     * @pa
6a10: 72 61 6d 20 66 6c 61 67 73 20 74 6f 20 63 6f 6e  ram flags to con
6a20: 74 72 6f 6c 20 64 61 74 61 62 61 73 65 20 61 63  trol database ac
6a30: 63 65 73 73 20 6d 6f 64 65 0a 20 20 20 20 20 2a  cess mode.     *
6a40: 20 40 70 61 72 61 6d 20 65 72 72 6f 72 48 61 6e   @param errorHan
6a50: 64 6c 65 72 20 74 68 65 20 7b 40 6c 69 6e 6b 20  dler the {@link 
6a60: 44 61 74 61 62 61 73 65 45 72 72 6f 72 48 61 6e  DatabaseErrorHan
6a70: 64 6c 65 72 7d 20 6f 62 6a 20 74 6f 20 62 65 20  dler} obj to be 
6a80: 75 73 65 64 20 74 6f 20 68 61 6e 64 6c 65 20 63  used to handle c
6a90: 6f 72 72 75 70 74 69 6f 6e 0a 20 20 20 20 20 2a  orruption.     *
6aa0: 20 77 68 65 6e 20 73 71 6c 69 74 65 20 72 65 70   when sqlite rep
6ab0: 6f 72 74 73 20 64 61 74 61 62 61 73 65 20 63 6f  orts database co
6ac0: 72 72 75 70 74 69 6f 6e 0a 20 20 20 20 20 2a 20  rruption.     * 
6ad0: 40 72 65 74 75 72 6e 20 74 68 65 20 6e 65 77 6c  @return the newl
6ae0: 79 20 6f 70 65 6e 65 64 20 64 61 74 61 62 61 73  y opened databas
6af0: 65 0a 20 20 20 20 20 2a 20 40 74 68 72 6f 77 73  e.     * @throws
6b00: 20 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e   SQLiteException
6b10: 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
6b20: 20 63 61 6e 6e 6f 74 20 62 65 20 6f 70 65 6e 65   cannot be opene
6b30: 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 75  d.     */.    pu
6b40: 62 6c 69 63 20 73 74 61 74 69 63 20 53 51 4c 69  blic static SQLi
6b50: 74 65 44 61 74 61 62 61 73 65 20 6f 70 65 6e 44  teDatabase openD
6b60: 61 74 61 62 61 73 65 28 53 74 72 69 6e 67 20 70  atabase(String p
6b70: 61 74 68 2c 20 43 75 72 73 6f 72 46 61 63 74 6f  ath, CursorFacto
6b80: 72 79 20 66 61 63 74 6f 72 79 2c 20 69 6e 74 20  ry factory, int 
6b90: 66 6c 61 67 73 2c 0a 20 20 20 20 20 20 20 20 20  flags,.         
6ba0: 20 20 20 44 61 74 61 62 61 73 65 45 72 72 6f 72     DatabaseError
6bb0: 48 61 6e 64 6c 65 72 20 65 72 72 6f 72 48 61 6e  Handler errorHan
6bc0: 64 6c 65 72 29 20 7b 0a 20 20 20 20 20 20 20 20  dler) {.        
6bd0: 53 51 4c 69 74 65 44 61 74 61 62 61 73 65 20 64  SQLiteDatabase d
6be0: 62 20 3d 20 6e 65 77 20 53 51 4c 69 74 65 44 61  b = new SQLiteDa
6bf0: 74 61 62 61 73 65 28 70 61 74 68 2c 20 66 6c 61  tabase(path, fla
6c00: 67 73 2c 20 66 61 63 74 6f 72 79 2c 20 65 72 72  gs, factory, err
6c10: 6f 72 48 61 6e 64 6c 65 72 29 3b 0a 20 20 20 20  orHandler);.    
6c20: 20 20 20 20 64 62 2e 6f 70 65 6e 28 29 3b 0a 20      db.open();. 
6c30: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 64 62         return db
6c40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a  ;.    }..    /**
6c50: 0a 20 20 20 20 20 2a 20 45 71 75 69 76 61 6c 65  .     * Equivale
6c60: 6e 74 20 74 6f 20 6f 70 65 6e 44 61 74 61 62 61  nt to openDataba
6c70: 73 65 28 66 69 6c 65 2e 67 65 74 50 61 74 68 28  se(file.getPath(
6c80: 29 2c 20 66 61 63 74 6f 72 79 2c 20 43 52 45 41  ), factory, CREA
6c90: 54 45 5f 49 46 5f 4e 45 43 45 53 53 41 52 59 29  TE_IF_NECESSARY)
6ca0: 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 75  ..     */.    pu
6cb0: 62 6c 69 63 20 73 74 61 74 69 63 20 53 51 4c 69  blic static SQLi
6cc0: 74 65 44 61 74 61 62 61 73 65 20 6f 70 65 6e 4f  teDatabase openO
6cd0: 72 43 72 65 61 74 65 44 61 74 61 62 61 73 65 28  rCreateDatabase(
6ce0: 46 69 6c 65 20 66 69 6c 65 2c 20 43 75 72 73 6f  File file, Curso
6cf0: 72 46 61 63 74 6f 72 79 20 66 61 63 74 6f 72 79  rFactory factory
6d00: 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ) {.        retu
6d10: 72 6e 20 6f 70 65 6e 4f 72 43 72 65 61 74 65 44  rn openOrCreateD
6d20: 61 74 61 62 61 73 65 28 66 69 6c 65 2e 67 65 74  atabase(file.get
6d30: 50 61 74 68 28 29 2c 20 66 61 63 74 6f 72 79 29  Path(), factory)
6d40: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a  ;.    }..    /**
6d50: 0a 20 20 20 20 20 2a 20 45 71 75 69 76 61 6c 65  .     * Equivale
6d60: 6e 74 20 74 6f 20 6f 70 65 6e 44 61 74 61 62 61  nt to openDataba
6d70: 73 65 28 70 61 74 68 2c 20 66 61 63 74 6f 72 79  se(path, factory
6d80: 2c 20 43 52 45 41 54 45 5f 49 46 5f 4e 45 43 45  , CREATE_IF_NECE
6d90: 53 53 41 52 59 29 2e 0a 20 20 20 20 20 2a 2f 0a  SSARY)..     */.
6da0: 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69      public stati
6db0: 63 20 53 51 4c 69 74 65 44 61 74 61 62 61 73 65  c SQLiteDatabase
6dc0: 20 6f 70 65 6e 4f 72 43 72 65 61 74 65 44 61 74   openOrCreateDat
6dd0: 61 62 61 73 65 28 53 74 72 69 6e 67 20 70 61 74  abase(String pat
6de0: 68 2c 20 43 75 72 73 6f 72 46 61 63 74 6f 72 79  h, CursorFactory
6df0: 20 66 61 63 74 6f 72 79 29 20 7b 0a 20 20 20 20   factory) {.    
6e00: 20 20 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44      return openD
6e10: 61 74 61 62 61 73 65 28 70 61 74 68 2c 20 66 61  atabase(path, fa
6e20: 63 74 6f 72 79 2c 20 43 52 45 41 54 45 5f 49 46  ctory, CREATE_IF
6e30: 5f 4e 45 43 45 53 53 41 52 59 2c 20 6e 75 6c 6c  _NECESSARY, null
6e40: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
6e50: 2a 0a 20 20 20 20 20 2a 20 45 71 75 69 76 61 6c  *.     * Equival
6e60: 65 6e 74 20 74 6f 20 6f 70 65 6e 44 61 74 61 62  ent to openDatab
6e70: 61 73 65 28 70 61 74 68 2c 20 66 61 63 74 6f 72  ase(path, factor
6e80: 79 2c 20 43 52 45 41 54 45 5f 49 46 5f 4e 45 43  y, CREATE_IF_NEC
6e90: 45 53 53 41 52 59 2c 20 65 72 72 6f 72 48 61 6e  ESSARY, errorHan
6ea0: 64 6c 65 72 29 2e 0a 20 20 20 20 20 2a 2f 0a 20  dler)..     */. 
6eb0: 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63     public static
6ec0: 20 53 51 4c 69 74 65 44 61 74 61 62 61 73 65 20   SQLiteDatabase 
6ed0: 6f 70 65 6e 4f 72 43 72 65 61 74 65 44 61 74 61  openOrCreateData
6ee0: 62 61 73 65 28 53 74 72 69 6e 67 20 70 61 74 68  base(String path
6ef0: 2c 20 43 75 72 73 6f 72 46 61 63 74 6f 72 79 20  , CursorFactory 
6f00: 66 61 63 74 6f 72 79 2c 0a 20 20 20 20 20 20 20  factory,.       
6f10: 20 20 20 20 20 44 61 74 61 62 61 73 65 45 72 72       DatabaseErr
6f20: 6f 72 48 61 6e 64 6c 65 72 20 65 72 72 6f 72 48  orHandler errorH
6f30: 61 6e 64 6c 65 72 29 20 7b 0a 20 20 20 20 20 20  andler) {.      
6f40: 20 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74    return openDat
6f50: 61 62 61 73 65 28 70 61 74 68 2c 20 66 61 63 74  abase(path, fact
6f60: 6f 72 79 2c 20 43 52 45 41 54 45 5f 49 46 5f 4e  ory, CREATE_IF_N
6f70: 45 43 45 53 53 41 52 59 2c 20 65 72 72 6f 72 48  ECESSARY, errorH
6f80: 61 6e 64 6c 65 72 29 3b 0a 20 20 20 20 7d 0a 0a  andler);.    }..
6f90: 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 44      /**.     * D
6fa0: 65 6c 65 74 65 73 20 61 20 64 61 74 61 62 61 73  eletes a databas
6fb0: 65 20 69 6e 63 6c 75 64 69 6e 67 20 69 74 73 20  e including its 
6fc0: 6a 6f 75 72 6e 61 6c 20 66 69 6c 65 20 61 6e 64  journal file and
6fd0: 20 6f 74 68 65 72 20 61 75 78 69 6c 69 61 72 79   other auxiliary
6fe0: 20 66 69 6c 65 73 0a 20 20 20 20 20 2a 20 74 68   files.     * th
6ff0: 61 74 20 6d 61 79 20 68 61 76 65 20 62 65 65 6e  at may have been
7000: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
7010: 64 61 74 61 62 61 73 65 20 65 6e 67 69 6e 65 2e  database engine.
7020: 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40  .     *.     * @
7030: 70 61 72 61 6d 20 66 69 6c 65 20 54 68 65 20 64  param file The d
7040: 61 74 61 62 61 73 65 20 66 69 6c 65 20 70 61 74  atabase file pat
7050: 68 2e 0a 20 20 20 20 20 2a 20 40 72 65 74 75 72  h..     * @retur
7060: 6e 20 54 72 75 65 20 69 66 20 74 68 65 20 64 61  n True if the da
7070: 74 61 62 61 73 65 20 77 61 73 20 73 75 63 63 65  tabase was succe
7080: 73 73 66 75 6c 6c 79 20 64 65 6c 65 74 65 64 2e  ssfully deleted.
7090: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 75 62  .     */.    pub
70a0: 6c 69 63 20 73 74 61 74 69 63 20 62 6f 6f 6c 65  lic static boole
70b0: 61 6e 20 64 65 6c 65 74 65 44 61 74 61 62 61 73  an deleteDatabas
70c0: 65 28 46 69 6c 65 20 66 69 6c 65 29 20 7b 0a 20  e(File file) {. 
70d0: 20 20 20 20 20 20 20 69 66 20 28 66 69 6c 65 20         if (file 
70e0: 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20  == null) {.     
70f0: 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77         throw new
7100: 20 49 6c 6c 65 67 61 6c 41 72 67 75 6d 65 6e 74   IllegalArgument
7110: 45 78 63 65 70 74 69 6f 6e 28 22 66 69 6c 65 20  Exception("file 
7120: 6d 75 73 74 20 6e 6f 74 20 62 65 20 6e 75 6c 6c  must not be null
7130: 22 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  ");.        }.. 
7140: 20 20 20 20 20 20 20 62 6f 6f 6c 65 61 6e 20 64         boolean d
7150: 65 6c 65 74 65 64 20 3d 20 66 61 6c 73 65 3b 0a  eleted = false;.
7160: 20 20 20 20 20 20 20 20 64 65 6c 65 74 65 64 20          deleted 
7170: 7c 3d 20 66 69 6c 65 2e 64 65 6c 65 74 65 28 29  |= file.delete()
7180: 3b 0a 20 20 20 20 20 20 20 20 64 65 6c 65 74 65  ;.        delete
7190: 64 20 7c 3d 20 6e 65 77 20 46 69 6c 65 28 66 69  d |= new File(fi
71a0: 6c 65 2e 67 65 74 50 61 74 68 28 29 20 2b 20 22  le.getPath() + "
71b0: 2d 6a 6f 75 72 6e 61 6c 22 29 2e 64 65 6c 65 74  -journal").delet
71c0: 65 28 29 3b 0a 20 20 20 20 20 20 20 20 64 65 6c  e();.        del
71d0: 65 74 65 64 20 7c 3d 20 6e 65 77 20 46 69 6c 65  eted |= new File
71e0: 28 66 69 6c 65 2e 67 65 74 50 61 74 68 28 29 20  (file.getPath() 
71f0: 2b 20 22 2d 73 68 6d 22 29 2e 64 65 6c 65 74 65  + "-shm").delete
7200: 28 29 3b 0a 20 20 20 20 20 20 20 20 64 65 6c 65  ();.        dele
7210: 74 65 64 20 7c 3d 20 6e 65 77 20 46 69 6c 65 28  ted |= new File(
7220: 66 69 6c 65 2e 67 65 74 50 61 74 68 28 29 20 2b  file.getPath() +
7230: 20 22 2d 77 61 6c 22 29 2e 64 65 6c 65 74 65 28   "-wal").delete(
7240: 29 3b 0a 0a 20 20 20 20 20 20 20 20 46 69 6c 65  );..        File
7250: 20 64 69 72 20 3d 20 66 69 6c 65 2e 67 65 74 50   dir = file.getP
7260: 61 72 65 6e 74 46 69 6c 65 28 29 3b 0a 20 20 20  arentFile();.   
7270: 20 20 20 20 20 69 66 20 28 64 69 72 20 21 3d 20       if (dir != 
7280: 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20 20  null) {.        
7290: 20 20 20 20 66 69 6e 61 6c 20 53 74 72 69 6e 67      final String
72a0: 20 70 72 65 66 69 78 20 3d 20 66 69 6c 65 2e 67   prefix = file.g
72b0: 65 74 4e 61 6d 65 28 29 20 2b 20 22 2d 6d 6a 22  etName() + "-mj"
72c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 46 69  ;.            Fi
72d0: 6c 65 5b 5d 20 66 69 6c 65 73 20 3d 20 64 69 72  le[] files = dir
72e0: 2e 6c 69 73 74 46 69 6c 65 73 28 6e 65 77 20 46  .listFiles(new F
72f0: 69 6c 65 46 69 6c 74 65 72 28 29 20 7b 0a 20 20  ileFilter() {.  
7300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 40 4f                @O
7310: 76 65 72 72 69 64 65 0a 20 20 20 20 20 20 20 20  verride.        
7320: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 62          public b
7330: 6f 6f 6c 65 61 6e 20 61 63 63 65 70 74 28 46 69  oolean accept(Fi
7340: 6c 65 20 63 61 6e 64 69 64 61 74 65 29 20 7b 0a  le candidate) {.
7350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7360: 20 20 20 20 72 65 74 75 72 6e 20 63 61 6e 64 69      return candi
7370: 64 61 74 65 2e 67 65 74 4e 61 6d 65 28 29 2e 73  date.getName().s
7380: 74 61 72 74 73 57 69 74 68 28 70 72 65 66 69 78  tartsWith(prefix
7390: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
73a0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
73b0: 20 7d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   });.           
73c0: 20 69 66 20 28 66 69 6c 65 73 20 21 3d 20 6e 75   if (files != nu
73d0: 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ll) {.          
73e0: 20 20 20 20 20 20 66 6f 72 20 28 46 69 6c 65 20        for (File 
73f0: 6d 61 73 74 65 72 4a 6f 75 72 6e 61 6c 20 3a 20  masterJournal : 
7400: 66 69 6c 65 73 29 20 7b 0a 20 20 20 20 20 20 20  files) {.       
7410: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 65 6c               del
7420: 65 74 65 64 20 7c 3d 20 6d 61 73 74 65 72 4a 6f  eted |= masterJo
7430: 75 72 6e 61 6c 2e 64 65 6c 65 74 65 28 29 3b 0a  urnal.delete();.
7440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7450: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
7460: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7470: 20 20 72 65 74 75 72 6e 20 64 65 6c 65 74 65 64    return deleted
7480: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a  ;.    }..    /**
7490: 0a 20 20 20 20 20 2a 20 52 65 6f 70 65 6e 73 20  .     * Reopens 
74a0: 74 68 65 20 64 61 74 61 62 61 73 65 20 69 6e 20  the database in 
74b0: 72 65 61 64 2d 77 72 69 74 65 20 6d 6f 64 65 2e  read-write mode.
74c0: 0a 20 20 20 20 20 2a 20 49 66 20 74 68 65 20 64  .     * If the d
74d0: 61 74 61 62 61 73 65 20 69 73 20 61 6c 72 65 61  atabase is alrea
74e0: 64 79 20 72 65 61 64 2d 77 72 69 74 65 2c 20 64  dy read-write, d
74f0: 6f 65 73 20 6e 6f 74 68 69 6e 67 2e 0a 20 20 20  oes nothing..   
7500: 20 20 2a 0a 20 20 20 20 20 2a 20 40 74 68 72 6f    *.     * @thro
7510: 77 73 20 53 51 4c 69 74 65 45 78 63 65 70 74 69  ws SQLiteExcepti
7520: 6f 6e 20 69 66 20 74 68 65 20 64 61 74 61 62 61  on if the databa
7530: 73 65 20 63 6f 75 6c 64 20 6e 6f 74 20 62 65 20  se could not be 
7540: 72 65 6f 70 65 6e 65 64 20 61 73 20 72 65 71 75  reopened as requ
7550: 65 73 74 65 64 2c 20 69 6e 20 77 68 69 63 68 0a  ested, in which.
7560: 20 20 20 20 20 2a 20 63 61 73 65 20 69 74 20 72       * case it r
7570: 65 6d 61 69 6e 73 20 6f 70 65 6e 20 69 6e 20 72  emains open in r
7580: 65 61 64 20 6f 6e 6c 79 20 6d 6f 64 65 2e 0a 20  ead only mode.. 
7590: 20 20 20 20 2a 20 40 74 68 72 6f 77 73 20 49 6c      * @throws Il
75a0: 6c 65 67 61 6c 53 74 61 74 65 45 78 63 65 70 74  legalStateExcept
75b0: 69 6f 6e 20 69 66 20 74 68 65 20 64 61 74 61 62  ion if the datab
75c0: 61 73 65 20 69 73 20 6e 6f 74 20 6f 70 65 6e 2e  ase is not open.
75d0: 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40  .     *.     * @
75e0: 73 65 65 20 23 69 73 52 65 61 64 4f 6e 6c 79 28  see #isReadOnly(
75f0: 29 0a 20 20 20 20 20 2a 20 40 68 69 64 65 0a 20  ).     * @hide. 
7600: 20 20 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69      */.    publi
7610: 63 20 76 6f 69 64 20 72 65 6f 70 65 6e 52 65 61  c void reopenRea
7620: 64 57 72 69 74 65 28 29 20 7b 0a 20 20 20 20 20  dWrite() {.     
7630: 20 20 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20     synchronized 
7640: 28 6d 4c 6f 63 6b 29 20 7b 0a 20 20 20 20 20 20  (mLock) {.      
7650: 20 20 20 20 20 20 74 68 72 6f 77 49 66 4e 6f 74        throwIfNot
7660: 4f 70 65 6e 4c 6f 63 6b 65 64 28 29 3b 0a 0a 20  OpenLocked();.. 
7670: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 21             if (!
7680: 69 73 52 65 61 64 4f 6e 6c 79 4c 6f 63 6b 65 64  isReadOnlyLocked
7690: 28 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ()) {.          
76a0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 20 2f 2f        return; //
76b0: 20 6e 6f 74 68 69 6e 67 20 74 6f 20 64 6f 0a 20   nothing to do. 
76c0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20             }..  
76d0: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 52 65 6f            // Reo
76e0: 70 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  pen the database
76f0: 20 69 6e 20 72 65 61 64 2d 77 72 69 74 65 20 6d   in read-write m
7700: 6f 64 65 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ode..           
7710: 20 66 69 6e 61 6c 20 69 6e 74 20 6f 6c 64 4f 70   final int oldOp
7720: 65 6e 46 6c 61 67 73 20 3d 20 6d 43 6f 6e 66 69  enFlags = mConfi
7730: 67 75 72 61 74 69 6f 6e 4c 6f 63 6b 65 64 2e 6f  gurationLocked.o
7740: 70 65 6e 46 6c 61 67 73 3b 0a 20 20 20 20 20 20  penFlags;.      
7750: 20 20 20 20 20 20 6d 43 6f 6e 66 69 67 75 72 61        mConfigura
7760: 74 69 6f 6e 4c 6f 63 6b 65 64 2e 6f 70 65 6e 46  tionLocked.openF
7770: 6c 61 67 73 20 3d 20 28 6d 43 6f 6e 66 69 67 75  lags = (mConfigu
7780: 72 61 74 69 6f 6e 4c 6f 63 6b 65 64 2e 6f 70 65  rationLocked.ope
7790: 6e 46 6c 61 67 73 20 26 20 7e 4f 50 45 4e 5f 52  nFlags & ~OPEN_R
77a0: 45 41 44 5f 4d 41 53 4b 29 0a 20 20 20 20 20 20  EAD_MASK).      
77b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 20                | 
77c0: 4f 50 45 4e 5f 52 45 41 44 57 52 49 54 45 3b 0a  OPEN_READWRITE;.
77d0: 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 20              try 
77e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
77f0: 20 20 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 6f 6f    mConnectionPoo
7800: 6c 4c 6f 63 6b 65 64 2e 72 65 63 6f 6e 66 69 67  lLocked.reconfig
7810: 75 72 65 28 6d 43 6f 6e 66 69 67 75 72 61 74 69  ure(mConfigurati
7820: 6f 6e 4c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 20  onLocked);.     
7830: 20 20 20 20 20 20 20 7d 20 63 61 74 63 68 20 28         } catch (
7840: 52 75 6e 74 69 6d 65 45 78 63 65 70 74 69 6f 6e  RuntimeException
7850: 20 65 78 29 20 7b 0a 20 20 20 20 20 20 20 20 20   ex) {.         
7860: 20 20 20 20 20 20 20 6d 43 6f 6e 66 69 67 75 72         mConfigur
7870: 61 74 69 6f 6e 4c 6f 63 6b 65 64 2e 6f 70 65 6e  ationLocked.open
7880: 46 6c 61 67 73 20 3d 20 6f 6c 64 4f 70 65 6e 46  Flags = oldOpenF
7890: 6c 61 67 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lags;.          
78a0: 20 20 20 20 20 20 74 68 72 6f 77 20 65 78 3b 0a        throw ex;.
78b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
78c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
78d0: 20 20 20 70 72 69 76 61 74 65 20 76 6f 69 64 20     private void 
78e0: 6f 70 65 6e 28 29 20 7b 0a 20 20 20 20 20 20 20  open() {.       
78f0: 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20   try {.         
7900: 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20     try {.       
7910: 20 20 20 20 20 20 20 20 20 6f 70 65 6e 49 6e 6e           openInn
7920: 65 72 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  er();.          
7930: 20 20 7d 20 63 61 74 63 68 20 28 53 51 4c 69 74    } catch (SQLit
7940: 65 44 61 74 61 62 61 73 65 43 6f 72 72 75 70 74  eDatabaseCorrupt
7950: 45 78 63 65 70 74 69 6f 6e 20 65 78 29 20 7b 0a  Exception ex) {.
7960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7970: 6f 6e 43 6f 72 72 75 70 74 69 6f 6e 28 29 3b 0a  onCorruption();.
7980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7990: 6f 70 65 6e 49 6e 6e 65 72 28 29 3b 0a 20 20 20  openInner();.   
79a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
79b0: 20 20 20 7d 20 63 61 74 63 68 20 28 53 51 4c 69     } catch (SQLi
79c0: 74 65 45 78 63 65 70 74 69 6f 6e 20 65 78 29 20  teException ex) 
79d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 4c 6f  {.            Lo
79e0: 67 2e 65 28 54 41 47 2c 20 22 46 61 69 6c 65 64  g.e(TAG, "Failed
79f0: 20 74 6f 20 6f 70 65 6e 20 64 61 74 61 62 61 73   to open databas
7a00: 65 20 27 22 20 2b 20 67 65 74 4c 61 62 65 6c 28  e '" + getLabel(
7a10: 29 20 2b 20 22 27 2e 22 2c 20 65 78 29 3b 0a 20  ) + "'.", ex);. 
7a20: 20 20 20 20 20 20 20 20 20 20 20 63 6c 6f 73 65             close
7a30: 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ();.            
7a40: 74 68 72 6f 77 20 65 78 3b 0a 20 20 20 20 20 20  throw ex;.      
7a50: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70    }.    }..    p
7a60: 72 69 76 61 74 65 20 76 6f 69 64 20 6f 70 65 6e  rivate void open
7a70: 49 6e 6e 65 72 28 29 20 7b 0a 20 20 20 20 20 20  Inner() {.      
7a80: 20 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 28    synchronized (
7a90: 6d 4c 6f 63 6b 29 20 7b 0a 20 20 20 20 20 20 20  mLock) {.       
7aa0: 20 20 20 20 20 61 73 73 65 72 74 20 6d 43 6f 6e       assert mCon
7ab0: 6e 65 63 74 69 6f 6e 50 6f 6f 6c 4c 6f 63 6b 65  nectionPoolLocke
7ac0: 64 20 3d 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20 20  d == null;.     
7ad0: 20 20 20 20 20 20 20 6d 43 6f 6e 6e 65 63 74 69         mConnecti
7ae0: 6f 6e 50 6f 6f 6c 4c 6f 63 6b 65 64 20 3d 20 53  onPoolLocked = S
7af0: 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e 50  QLiteConnectionP
7b00: 6f 6f 6c 2e 6f 70 65 6e 28 6d 43 6f 6e 66 69 67  ool.open(mConfig
7b10: 75 72 61 74 69 6f 6e 4c 6f 63 6b 65 64 29 3b 0a  urationLocked);.
7b20: 20 20 20 20 20 20 20 20 20 20 20 20 6d 43 6c 6f              mClo
7b30: 73 65 47 75 61 72 64 4c 6f 63 6b 65 64 2e 6f 70  seGuardLocked.op
7b40: 65 6e 28 22 63 6c 6f 73 65 22 29 3b 0a 20 20 20  en("close");.   
7b50: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
7b60: 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 28 73 41  synchronized (sA
7b70: 63 74 69 76 65 44 61 74 61 62 61 73 65 73 29 20  ctiveDatabases) 
7b80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 41  {.            sA
7b90: 63 74 69 76 65 44 61 74 61 62 61 73 65 73 2e 70  ctiveDatabases.p
7ba0: 75 74 28 74 68 69 73 2c 20 6e 75 6c 6c 29 3b 0a  ut(this, null);.
7bb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
7bc0: 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20  .    /**.     * 
7bd0: 43 72 65 61 74 65 20 61 20 6d 65 6d 6f 72 79 20  Create a memory 
7be0: 62 61 63 6b 65 64 20 53 51 4c 69 74 65 20 64 61  backed SQLite da
7bf0: 74 61 62 61 73 65 2e 20 20 49 74 73 20 63 6f 6e  tabase.  Its con
7c00: 74 65 6e 74 73 20 77 69 6c 6c 20 62 65 20 64 65  tents will be de
7c10: 73 74 72 6f 79 65 64 0a 20 20 20 20 20 2a 20 77  stroyed.     * w
7c20: 68 65 6e 20 74 68 65 20 64 61 74 61 62 61 73 65  hen the database
7c30: 20 69 73 20 63 6c 6f 73 65 64 2e 0a 20 20 20 20   is closed..    
7c40: 20 2a 0a 20 20 20 20 20 2a 20 3c 70 3e 53 65 74   *.     * <p>Set
7c50: 73 20 74 68 65 20 6c 6f 63 61 6c 65 20 6f 66 20  s the locale of 
7c60: 74 68 65 20 64 61 74 61 62 61 73 65 20 74 6f 20  the database to 
7c70: 74 68 65 20 20 74 68 65 20 73 79 73 74 65 6d 27  the  the system'
7c80: 73 20 63 75 72 72 65 6e 74 20 6c 6f 63 61 6c 65  s current locale
7c90: 2e 0a 20 20 20 20 20 2a 20 43 61 6c 6c 20 7b 40  ..     * Call {@
7ca0: 6c 69 6e 6b 20 23 73 65 74 4c 6f 63 61 6c 65 7d  link #setLocale}
7cb0: 20 69 66 20 79 6f 75 20 77 6f 75 6c 64 20 6c 69   if you would li
7cc0: 6b 65 20 73 6f 6d 65 74 68 69 6e 67 20 65 6c 73  ke something els
7cd0: 65 2e 3c 2f 70 3e 0a 20 20 20 20 20 2a 0a 20 20  e.</p>.     *.  
7ce0: 20 20 20 2a 20 40 70 61 72 61 6d 20 66 61 63 74     * @param fact
7cf0: 6f 72 79 20 61 6e 20 6f 70 74 69 6f 6e 61 6c 20  ory an optional 
7d00: 66 61 63 74 6f 72 79 20 63 6c 61 73 73 20 74 68  factory class th
7d10: 61 74 20 69 73 20 63 61 6c 6c 65 64 20 74 6f 20  at is called to 
7d20: 69 6e 73 74 61 6e 74 69 61 74 65 20 61 0a 20 20  instantiate a.  
7d30: 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20 20     *            
7d40: 63 75 72 73 6f 72 20 77 68 65 6e 20 71 75 65 72  cursor when quer
7d50: 79 20 69 73 20 63 61 6c 6c 65 64 0a 20 20 20 20  y is called.    
7d60: 20 2a 20 40 72 65 74 75 72 6e 20 61 20 53 51 4c   * @return a SQL
7d70: 69 74 65 44 61 74 61 62 61 73 65 20 6f 62 6a 65  iteDatabase obje
7d80: 63 74 2c 20 6f 72 20 6e 75 6c 6c 20 69 66 20 74  ct, or null if t
7d90: 68 65 20 64 61 74 61 62 61 73 65 20 63 61 6e 27  he database can'
7da0: 74 20 62 65 20 63 72 65 61 74 65 64 0a 20 20 20  t be created.   
7db0: 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20    */.    public 
7dc0: 73 74 61 74 69 63 20 53 51 4c 69 74 65 44 61 74  static SQLiteDat
7dd0: 61 62 61 73 65 20 63 72 65 61 74 65 28 43 75 72  abase create(Cur
7de0: 73 6f 72 46 61 63 74 6f 72 79 20 66 61 63 74 6f  sorFactory facto
7df0: 72 79 29 20 7b 0a 20 20 20 20 20 20 20 20 2f 2f  ry) {.        //
7e00: 20 54 68 69 73 20 69 73 20 61 20 6d 61 67 69 63   This is a magic
7e10: 20 73 74 72 69 6e 67 20 77 69 74 68 20 73 70 65   string with spe
7e20: 63 69 61 6c 20 6d 65 61 6e 69 6e 67 20 66 6f 72  cial meaning for
7e30: 20 53 51 4c 69 74 65 2e 0a 20 20 20 20 20 20 20   SQLite..       
7e40: 20 72 65 74 75 72 6e 20 6f 70 65 6e 44 61 74 61   return openData
7e50: 62 61 73 65 28 53 51 4c 69 74 65 44 61 74 61 62  base(SQLiteDatab
7e60: 61 73 65 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  aseConfiguration
7e70: 2e 4d 45 4d 4f 52 59 5f 44 42 5f 50 41 54 48 2c  .MEMORY_DB_PATH,
7e80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7e90: 20 66 61 63 74 6f 72 79 2c 20 43 52 45 41 54 45   factory, CREATE
7ea0: 5f 49 46 5f 4e 45 43 45 53 53 41 52 59 29 3b 0a  _IF_NECESSARY);.
7eb0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20      }..    /**. 
7ec0: 20 20 20 20 2a 20 52 65 67 69 73 74 65 72 73 20      * Registers 
7ed0: 61 20 43 75 73 74 6f 6d 46 75 6e 63 74 69 6f 6e  a CustomFunction
7ee0: 20 63 61 6c 6c 62 61 63 6b 20 61 73 20 61 20 66   callback as a f
7ef0: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 63 61 6e  unction that can
7f00: 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f 6d 0a   be called from.
7f10: 20 20 20 20 20 2a 20 53 51 4c 69 74 65 20 64 61       * SQLite da
7f20: 74 61 62 61 73 65 20 74 72 69 67 67 65 72 73 2e  tabase triggers.
7f30: 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40  .     *.     * @
7f40: 70 61 72 61 6d 20 6e 61 6d 65 20 74 68 65 20 6e  param name the n
7f50: 61 6d 65 20 6f 66 20 74 68 65 20 73 71 6c 69 74  ame of the sqlit
7f60: 65 33 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20  e3 function.    
7f70: 20 2a 20 40 70 61 72 61 6d 20 6e 75 6d 41 72 67   * @param numArg
7f80: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
7f90: 61 72 67 75 6d 65 6e 74 73 20 66 6f 72 20 74 68  arguments for th
7fa0: 65 20 66 75 6e 63 74 69 6f 6e 0a 20 20 20 20 20  e function.     
7fb0: 2a 20 40 70 61 72 61 6d 20 66 75 6e 63 74 69 6f  * @param functio
7fc0: 6e 20 63 61 6c 6c 62 61 63 6b 20 74 6f 20 63 61  n callback to ca
7fd0: 6c 6c 20 77 68 65 6e 20 74 68 65 20 66 75 6e 63  ll when the func
7fe0: 74 69 6f 6e 20 69 73 20 65 78 65 63 75 74 65 64  tion is executed
7ff0: 0a 20 20 20 20 20 2a 20 40 68 69 64 65 0a 20 20  .     * @hide.  
8000: 20 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63     */.    public
8010: 20 76 6f 69 64 20 61 64 64 43 75 73 74 6f 6d 46   void addCustomF
8020: 75 6e 63 74 69 6f 6e 28 53 74 72 69 6e 67 20 6e  unction(String n
8030: 61 6d 65 2c 20 69 6e 74 20 6e 75 6d 41 72 67 73  ame, int numArgs
8040: 2c 20 43 75 73 74 6f 6d 46 75 6e 63 74 69 6f 6e  , CustomFunction
8050: 20 66 75 6e 63 74 69 6f 6e 29 20 7b 0a 20 20 20   function) {.   
8060: 20 20 20 20 20 2f 2f 20 43 72 65 61 74 65 20 77       // Create w
8070: 72 61 70 70 65 72 20 28 61 6c 73 6f 20 76 61 6c  rapper (also val
8080: 69 64 61 74 65 73 20 61 72 67 75 6d 65 6e 74 73  idates arguments
8090: 29 2e 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74  )..        SQLit
80a0: 65 43 75 73 74 6f 6d 46 75 6e 63 74 69 6f 6e 20  eCustomFunction 
80b0: 77 72 61 70 70 65 72 20 3d 20 6e 65 77 20 53 51  wrapper = new SQ
80c0: 4c 69 74 65 43 75 73 74 6f 6d 46 75 6e 63 74 69  LiteCustomFuncti
80d0: 6f 6e 28 6e 61 6d 65 2c 20 6e 75 6d 41 72 67 73  on(name, numArgs
80e0: 2c 20 66 75 6e 63 74 69 6f 6e 29 3b 0a 0a 20 20  , function);..  
80f0: 20 20 20 20 20 20 73 79 6e 63 68 72 6f 6e 69 7a        synchroniz
8100: 65 64 20 28 6d 4c 6f 63 6b 29 20 7b 0a 20 20 20  ed (mLock) {.   
8110: 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 49 66           throwIf
8120: 4e 6f 74 4f 70 65 6e 4c 6f 63 6b 65 64 28 29 3b  NotOpenLocked();
8130: 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 43  ..            mC
8140: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 4c 6f 63 6b  onfigurationLock
8150: 65 64 2e 63 75 73 74 6f 6d 46 75 6e 63 74 69 6f  ed.customFunctio
8160: 6e 73 2e 61 64 64 28 77 72 61 70 70 65 72 29 3b  ns.add(wrapper);
8170: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79  .            try
8180: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
8190: 20 20 20 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 6f     mConnectionPo
81a0: 6f 6c 4c 6f 63 6b 65 64 2e 72 65 63 6f 6e 66 69  olLocked.reconfi
81b0: 67 75 72 65 28 6d 43 6f 6e 66 69 67 75 72 61 74  gure(mConfigurat
81c0: 69 6f 6e 4c 6f 63 6b 65 64 29 3b 0a 20 20 20 20  ionLocked);.    
81d0: 20 20 20 20 20 20 20 20 7d 20 63 61 74 63 68 20          } catch 
81e0: 28 52 75 6e 74 69 6d 65 45 78 63 65 70 74 69 6f  (RuntimeExceptio
81f0: 6e 20 65 78 29 20 7b 0a 20 20 20 20 20 20 20 20  n ex) {.        
8200: 20 20 20 20 20 20 20 20 6d 43 6f 6e 66 69 67 75          mConfigu
8210: 72 61 74 69 6f 6e 4c 6f 63 6b 65 64 2e 63 75 73  rationLocked.cus
8220: 74 6f 6d 46 75 6e 63 74 69 6f 6e 73 2e 72 65 6d  tomFunctions.rem
8230: 6f 76 65 28 77 72 61 70 70 65 72 29 3b 0a 20 20  ove(wrapper);.  
8240: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
8250: 72 6f 77 20 65 78 3b 0a 20 20 20 20 20 20 20 20  row ex;.        
8260: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
8270: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20      }..    /**. 
8280: 20 20 20 20 2a 20 47 65 74 73 20 74 68 65 20 64      * Gets the d
8290: 61 74 61 62 61 73 65 20 76 65 72 73 69 6f 6e 2e  atabase version.
82a0: 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40  .     *.     * @
82b0: 72 65 74 75 72 6e 20 74 68 65 20 64 61 74 61 62  return the datab
82c0: 61 73 65 20 76 65 72 73 69 6f 6e 0a 20 20 20 20  ase version.    
82d0: 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20 69   */.    public i
82e0: 6e 74 20 67 65 74 56 65 72 73 69 6f 6e 28 29 20  nt getVersion() 
82f0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
8300: 20 28 28 4c 6f 6e 67 29 20 44 61 74 61 62 61 73   ((Long) Databas
8310: 65 55 74 69 6c 73 2e 6c 6f 6e 67 46 6f 72 51 75  eUtils.longForQu
8320: 65 72 79 28 74 68 69 73 2c 20 22 50 52 41 47 4d  ery(this, "PRAGM
8330: 41 20 75 73 65 72 5f 76 65 72 73 69 6f 6e 3b 22  A user_version;"
8340: 2c 20 6e 75 6c 6c 29 29 2e 69 6e 74 56 61 6c 75  , null)).intValu
8350: 65 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  e();.    }..    
8360: 2f 2a 2a 0a 20 20 20 20 20 2a 20 53 65 74 73 20  /**.     * Sets 
8370: 74 68 65 20 64 61 74 61 62 61 73 65 20 76 65 72  the database ver
8380: 73 69 6f 6e 2e 0a 20 20 20 20 20 2a 0a 20 20 20  sion..     *.   
8390: 20 20 2a 20 40 70 61 72 61 6d 20 76 65 72 73 69    * @param versi
83a0: 6f 6e 20 74 68 65 20 6e 65 77 20 64 61 74 61 62  on the new datab
83b0: 61 73 65 20 76 65 72 73 69 6f 6e 0a 20 20 20 20  ase version.    
83c0: 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20 76   */.    public v
83d0: 6f 69 64 20 73 65 74 56 65 72 73 69 6f 6e 28 69  oid setVersion(i
83e0: 6e 74 20 76 65 72 73 69 6f 6e 29 20 7b 0a 20 20  nt version) {.  
83f0: 20 20 20 20 20 20 65 78 65 63 53 51 4c 28 22 50        execSQL("P
8400: 52 41 47 4d 41 20 75 73 65 72 5f 76 65 72 73 69  RAGMA user_versi
8410: 6f 6e 20 3d 20 22 20 2b 20 76 65 72 73 69 6f 6e  on = " + version
8420: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
8430: 2a 0a 20 20 20 20 20 2a 20 52 65 74 75 72 6e 73  *.     * Returns
8440: 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 73 69 7a   the maximum siz
8450: 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20 6d  e the database m
8460: 61 79 20 67 72 6f 77 20 74 6f 2e 0a 20 20 20 20  ay grow to..    
8470: 20 2a 0a 20 20 20 20 20 2a 20 40 72 65 74 75 72   *.     * @retur
8480: 6e 20 74 68 65 20 6e 65 77 20 6d 61 78 69 6d 75  n the new maximu
8490: 6d 20 64 61 74 61 62 61 73 65 20 73 69 7a 65 0a  m database size.
84a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c       */.    publ
84b0: 69 63 20 6c 6f 6e 67 20 67 65 74 4d 61 78 69 6d  ic long getMaxim
84c0: 75 6d 53 69 7a 65 28 29 20 7b 0a 20 20 20 20 20  umSize() {.     
84d0: 20 20 20 6c 6f 6e 67 20 70 61 67 65 43 6f 75 6e     long pageCoun
84e0: 74 20 3d 20 44 61 74 61 62 61 73 65 55 74 69 6c  t = DatabaseUtil
84f0: 73 2e 6c 6f 6e 67 46 6f 72 51 75 65 72 79 28 74  s.longForQuery(t
8500: 68 69 73 2c 20 22 50 52 41 47 4d 41 20 6d 61 78  his, "PRAGMA max
8510: 5f 70 61 67 65 5f 63 6f 75 6e 74 3b 22 2c 20 6e  _page_count;", n
8520: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 72 65  ull);.        re
8530: 74 75 72 6e 20 70 61 67 65 43 6f 75 6e 74 20 2a  turn pageCount *
8540: 20 67 65 74 50 61 67 65 53 69 7a 65 28 29 3b 0a   getPageSize();.
8550: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20      }..    /**. 
8560: 20 20 20 20 2a 20 53 65 74 73 20 74 68 65 20 6d      * Sets the m
8570: 61 78 69 6d 75 6d 20 73 69 7a 65 20 74 68 65 20  aximum size the 
8580: 64 61 74 61 62 61 73 65 20 77 69 6c 6c 20 67 72  database will gr
8590: 6f 77 20 74 6f 2e 20 54 68 65 20 6d 61 78 69 6d  ow to. The maxim
85a0: 75 6d 20 73 69 7a 65 20 63 61 6e 6e 6f 74 0a 20  um size cannot. 
85b0: 20 20 20 20 2a 20 62 65 20 73 65 74 20 62 65 6c      * be set bel
85c0: 6f 77 20 74 68 65 20 63 75 72 72 65 6e 74 20 73  ow the current s
85d0: 69 7a 65 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20  ize..     *.    
85e0: 20 2a 20 40 70 61 72 61 6d 20 6e 75 6d 42 79 74   * @param numByt
85f0: 65 73 20 74 68 65 20 6d 61 78 69 6d 75 6d 20 64  es the maximum d
8600: 61 74 61 62 61 73 65 20 73 69 7a 65 2c 20 69 6e  atabase size, in
8610: 20 62 79 74 65 73 0a 20 20 20 20 20 2a 20 40 72   bytes.     * @r
8620: 65 74 75 72 6e 20 74 68 65 20 6e 65 77 20 6d 61  eturn the new ma
8630: 78 69 6d 75 6d 20 64 61 74 61 62 61 73 65 20 73  ximum database s
8640: 69 7a 65 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  ize.     */.    
8650: 70 75 62 6c 69 63 20 6c 6f 6e 67 20 73 65 74 4d  public long setM
8660: 61 78 69 6d 75 6d 53 69 7a 65 28 6c 6f 6e 67 20  aximumSize(long 
8670: 6e 75 6d 42 79 74 65 73 29 20 7b 0a 20 20 20 20  numBytes) {.    
8680: 20 20 20 20 6c 6f 6e 67 20 70 61 67 65 53 69 7a      long pageSiz
8690: 65 20 3d 20 67 65 74 50 61 67 65 53 69 7a 65 28  e = getPageSize(
86a0: 29 3b 0a 20 20 20 20 20 20 20 20 6c 6f 6e 67 20  );.        long 
86b0: 6e 75 6d 50 61 67 65 73 20 3d 20 6e 75 6d 42 79  numPages = numBy
86c0: 74 65 73 20 2f 20 70 61 67 65 53 69 7a 65 3b 0a  tes / pageSize;.
86d0: 20 20 20 20 20 20 20 20 2f 2f 20 49 66 20 6e 75          // If nu
86e0: 6d 42 79 74 65 73 20 69 73 6e 27 74 20 61 20 6d  mBytes isn't a m
86f0: 75 6c 74 69 70 6c 65 20 6f 66 20 70 61 67 65 53  ultiple of pageS
8700: 69 7a 65 2c 20 62 75 6d 70 20 75 70 20 61 20 70  ize, bump up a p
8710: 61 67 65 0a 20 20 20 20 20 20 20 20 69 66 20 28  age.        if (
8720: 28 6e 75 6d 42 79 74 65 73 20 25 20 70 61 67 65  (numBytes % page
8730: 53 69 7a 65 29 20 21 3d 20 30 29 20 7b 0a 20 20  Size) != 0) {.  
8740: 20 20 20 20 20 20 20 20 20 20 6e 75 6d 50 61 67            numPag
8750: 65 73 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  es++;.        }.
8760: 20 20 20 20 20 20 20 20 6c 6f 6e 67 20 6e 65 77          long new
8770: 50 61 67 65 43 6f 75 6e 74 20 3d 20 44 61 74 61  PageCount = Data
8780: 62 61 73 65 55 74 69 6c 73 2e 6c 6f 6e 67 46 6f  baseUtils.longFo
8790: 72 51 75 65 72 79 28 74 68 69 73 2c 20 22 50 52  rQuery(this, "PR
87a0: 41 47 4d 41 20 6d 61 78 5f 70 61 67 65 5f 63 6f  AGMA max_page_co
87b0: 75 6e 74 20 3d 20 22 20 2b 20 6e 75 6d 50 61 67  unt = " + numPag
87c0: 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  es,.            
87d0: 20 20 20 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20      null);.     
87e0: 20 20 20 72 65 74 75 72 6e 20 6e 65 77 50 61 67     return newPag
87f0: 65 43 6f 75 6e 74 20 2a 20 70 61 67 65 53 69 7a  eCount * pageSiz
8800: 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  e;.    }..    /*
8810: 2a 0a 20 20 20 20 20 2a 20 52 65 74 75 72 6e 73  *.     * Returns
8820: 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74   the current dat
8830: 61 62 61 73 65 20 70 61 67 65 20 73 69 7a 65 2c  abase page size,
8840: 20 69 6e 20 62 79 74 65 73 2e 0a 20 20 20 20 20   in bytes..     
8850: 2a 0a 20 20 20 20 20 2a 20 40 72 65 74 75 72 6e  *.     * @return
8860: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61   the database pa
8870: 67 65 20 73 69 7a 65 2c 20 69 6e 20 62 79 74 65  ge size, in byte
8880: 73 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 75  s.     */.    pu
8890: 62 6c 69 63 20 6c 6f 6e 67 20 67 65 74 50 61 67  blic long getPag
88a0: 65 53 69 7a 65 28 29 20 7b 0a 20 20 20 20 20 20  eSize() {.      
88b0: 20 20 72 65 74 75 72 6e 20 44 61 74 61 62 61 73    return Databas
88c0: 65 55 74 69 6c 73 2e 6c 6f 6e 67 46 6f 72 51 75  eUtils.longForQu
88d0: 65 72 79 28 74 68 69 73 2c 20 22 50 52 41 47 4d  ery(this, "PRAGM
88e0: 41 20 70 61 67 65 5f 73 69 7a 65 3b 22 2c 20 6e  A page_size;", n
88f0: 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  ull);.    }..   
8900: 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 53 65 74 73   /**.     * Sets
8910: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 70 61   the database pa
8920: 67 65 20 73 69 7a 65 2e 20 54 68 65 20 70 61 67  ge size. The pag
8930: 65 20 73 69 7a 65 20 6d 75 73 74 20 62 65 20 61  e size must be a
8940: 20 70 6f 77 65 72 20 6f 66 20 74 77 6f 2e 20 54   power of two. T
8950: 68 69 73 0a 20 20 20 20 20 2a 20 6d 65 74 68 6f  his.     * metho
8960: 64 20 64 6f 65 73 20 6e 6f 74 20 77 6f 72 6b 20  d does not work 
8970: 69 66 20 61 6e 79 20 64 61 74 61 20 68 61 73 20  if any data has 
8980: 62 65 65 6e 20 77 72 69 74 74 65 6e 20 74 6f 20  been written to 
8990: 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
89a0: 65 2c 0a 20 20 20 20 20 2a 20 61 6e 64 20 6d 75  e,.     * and mu
89b0: 73 74 20 62 65 20 63 61 6c 6c 65 64 20 72 69 67  st be called rig
89c0: 68 74 20 61 66 74 65 72 20 74 68 65 20 64 61 74  ht after the dat
89d0: 61 62 61 73 65 20 68 61 73 20 62 65 65 6e 20 63  abase has been c
89e0: 72 65 61 74 65 64 2e 0a 20 20 20 20 20 2a 0a 20  reated..     *. 
89f0: 20 20 20 20 2a 20 40 70 61 72 61 6d 20 6e 75 6d      * @param num
8a00: 42 79 74 65 73 20 74 68 65 20 64 61 74 61 62 61  Bytes the databa
8a10: 73 65 20 70 61 67 65 20 73 69 7a 65 2c 20 69 6e  se page size, in
8a20: 20 62 79 74 65 73 0a 20 20 20 20 20 2a 2f 0a 20   bytes.     */. 
8a30: 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20 73     public void s
8a40: 65 74 50 61 67 65 53 69 7a 65 28 6c 6f 6e 67 20  etPageSize(long 
8a50: 6e 75 6d 42 79 74 65 73 29 20 7b 0a 20 20 20 20  numBytes) {.    
8a60: 20 20 20 20 65 78 65 63 53 51 4c 28 22 50 52 41      execSQL("PRA
8a70: 47 4d 41 20 70 61 67 65 5f 73 69 7a 65 20 3d 20  GMA page_size = 
8a80: 22 20 2b 20 6e 75 6d 42 79 74 65 73 29 3b 0a 20  " + numBytes);. 
8a90: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20     }..    /**.  
8aa0: 20 20 20 2a 20 4d 61 72 6b 20 74 68 69 73 20 74     * Mark this t
8ab0: 61 62 6c 65 20 61 73 20 73 79 6e 63 61 62 6c 65  able as syncable
8ac0: 2e 20 57 68 65 6e 20 61 6e 20 75 70 64 61 74 65  . When an update
8ad0: 20 6f 63 63 75 72 73 20 69 6e 20 74 68 69 73 20   occurs in this 
8ae0: 74 61 62 6c 65 20 74 68 65 0a 20 20 20 20 20 2a  table the.     *
8af0: 20 5f 73 79 6e 63 5f 64 69 72 74 79 20 66 69 65   _sync_dirty fie
8b00: 6c 64 20 77 69 6c 6c 20 62 65 20 73 65 74 20 74  ld will be set t
8b10: 6f 20 65 6e 73 75 72 65 20 70 72 6f 70 65 72 20  o ensure proper 
8b20: 73 79 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f  syncing operatio
8b30: 6e 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a  n..     *.     *
8b40: 20 40 70 61 72 61 6d 20 74 61 62 6c 65 20 74 68   @param table th
8b50: 65 20 74 61 62 6c 65 20 74 6f 20 6d 61 72 6b 20  e table to mark 
8b60: 61 73 20 73 79 6e 63 61 62 6c 65 0a 20 20 20 20  as syncable.    
8b70: 20 2a 20 40 70 61 72 61 6d 20 64 65 6c 65 74 65   * @param delete
8b80: 64 54 61 62 6c 65 20 54 68 65 20 64 65 6c 65 74  dTable The delet
8b90: 65 64 20 74 61 62 6c 65 20 74 68 61 74 20 63 6f  ed table that co
8ba0: 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65  rresponds to the
8bb0: 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20  .     *         
8bc0: 20 73 79 6e 63 61 62 6c 65 20 74 61 62 6c 65 0a   syncable table.
8bd0: 20 20 20 20 20 2a 20 40 64 65 70 72 65 63 61 74       * @deprecat
8be0: 65 64 20 54 68 69 73 20 6d 65 74 68 6f 64 20 6e  ed This method n
8bf0: 6f 20 6c 6f 6e 67 65 72 20 73 65 72 76 65 73 20  o longer serves 
8c00: 61 6e 79 20 75 73 65 66 75 6c 20 70 75 72 70 6f  any useful purpo
8c10: 73 65 20 61 6e 64 20 68 61 73 20 62 65 65 6e 20  se and has been 
8c20: 64 65 70 72 65 63 61 74 65 64 2e 0a 20 20 20 20  deprecated..    
8c30: 20 2a 2f 0a 20 20 20 20 40 44 65 70 72 65 63 61   */.    @Depreca
8c40: 74 65 64 0a 20 20 20 20 70 75 62 6c 69 63 20 76  ted.    public v
8c50: 6f 69 64 20 6d 61 72 6b 54 61 62 6c 65 53 79 6e  oid markTableSyn
8c60: 63 61 62 6c 65 28 53 74 72 69 6e 67 20 74 61 62  cable(String tab
8c70: 6c 65 2c 20 53 74 72 69 6e 67 20 64 65 6c 65 74  le, String delet
8c80: 65 64 54 61 62 6c 65 29 20 7b 0a 20 20 20 20 7d  edTable) {.    }
8c90: 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a  ..    /**.     *
8ca0: 20 4d 61 72 6b 20 74 68 69 73 20 74 61 62 6c 65   Mark this table
8cb0: 20 61 73 20 73 79 6e 63 61 62 6c 65 2c 20 77 69   as syncable, wi
8cc0: 74 68 20 74 68 65 20 5f 73 79 6e 63 5f 64 69 72  th the _sync_dir
8cd0: 74 79 20 72 65 73 69 64 69 6e 67 20 69 6e 20 61  ty residing in a
8ce0: 6e 6f 74 68 65 72 0a 20 20 20 20 20 2a 20 74 61  nother.     * ta
8cf0: 62 6c 65 2e 20 57 68 65 6e 20 61 6e 20 75 70 64  ble. When an upd
8d00: 61 74 65 20 6f 63 63 75 72 73 20 69 6e 20 74 68  ate occurs in th
8d10: 69 73 20 74 61 62 6c 65 20 74 68 65 20 5f 73 79  is table the _sy
8d20: 6e 63 5f 64 69 72 74 79 20 66 69 65 6c 64 20 6f  nc_dirty field o
8d30: 66 20 74 68 65 0a 20 20 20 20 20 2a 20 72 6f 77  f the.     * row
8d40: 20 69 6e 20 75 70 64 61 74 65 54 61 62 6c 65 20   in updateTable 
8d50: 77 69 74 68 20 74 68 65 20 5f 69 64 20 69 6e 20  with the _id in 
8d60: 66 6f 72 65 69 67 6e 4b 65 79 20 77 69 6c 6c 20  foreignKey will 
8d70: 62 65 20 73 65 74 20 74 6f 0a 20 20 20 20 20 2a  be set to.     *
8d80: 20 65 6e 73 75 72 65 20 70 72 6f 70 65 72 20 73   ensure proper s
8d90: 79 6e 63 69 6e 67 20 6f 70 65 72 61 74 69 6f 6e  yncing operation
8da0: 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20  ..     *.     * 
8db0: 40 70 61 72 61 6d 20 74 61 62 6c 65 20 61 6e 20  @param table an 
8dc0: 75 70 64 61 74 65 20 6f 6e 20 74 68 69 73 20 74  update on this t
8dd0: 61 62 6c 65 20 77 69 6c 6c 20 74 72 69 67 67 65  able will trigge
8de0: 72 20 61 20 73 79 6e 63 20 74 69 6d 65 20 72 65  r a sync time re
8df0: 6d 6f 76 61 6c 0a 20 20 20 20 20 2a 20 40 70 61  moval.     * @pa
8e00: 72 61 6d 20 66 6f 72 65 69 67 6e 4b 65 79 20 74  ram foreignKey t
8e10: 68 69 73 20 69 73 20 74 68 65 20 63 6f 6c 75 6d  his is the colum
8e20: 6e 20 69 6e 20 74 61 62 6c 65 20 77 68 6f 73 65  n in table whose
8e30: 20 76 61 6c 75 65 20 69 73 20 61 6e 20 5f 69 64   value is an _id
8e40: 20 69 6e 0a 20 20 20 20 20 2a 20 20 20 20 20 20   in.     *      
8e50: 20 20 20 20 75 70 64 61 74 65 54 61 62 6c 65 0a      updateTable.
8e60: 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 75 70       * @param up
8e70: 64 61 74 65 54 61 62 6c 65 20 74 68 69 73 20 69  dateTable this i
8e80: 73 20 74 68 65 20 74 61 62 6c 65 20 74 68 61 74  s the table that
8e90: 20 77 69 6c 6c 20 68 61 76 65 20 69 74 73 20 5f   will have its _
8ea0: 73 79 6e 63 5f 64 69 72 74 79 0a 20 20 20 20 20  sync_dirty.     
8eb0: 2a 20 40 64 65 70 72 65 63 61 74 65 64 20 54 68  * @deprecated Th
8ec0: 69 73 20 6d 65 74 68 6f 64 20 6e 6f 20 6c 6f 6e  is method no lon
8ed0: 67 65 72 20 73 65 72 76 65 73 20 61 6e 79 20 75  ger serves any u
8ee0: 73 65 66 75 6c 20 70 75 72 70 6f 73 65 20 61 6e  seful purpose an
8ef0: 64 20 68 61 73 20 62 65 65 6e 20 64 65 70 72 65  d has been depre
8f00: 63 61 74 65 64 2e 0a 20 20 20 20 20 2a 2f 0a 20  cated..     */. 
8f10: 20 20 20 40 44 65 70 72 65 63 61 74 65 64 0a 20     @Deprecated. 
8f20: 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20 6d     public void m
8f30: 61 72 6b 54 61 62 6c 65 53 79 6e 63 61 62 6c 65  arkTableSyncable
8f40: 28 53 74 72 69 6e 67 20 74 61 62 6c 65 2c 20 53  (String table, S
8f50: 74 72 69 6e 67 20 66 6f 72 65 69 67 6e 4b 65 79  tring foreignKey
8f60: 2c 20 53 74 72 69 6e 67 20 75 70 64 61 74 65 54  , String updateT
8f70: 61 62 6c 65 29 20 7b 0a 20 20 20 20 7d 0a 0a 20  able) {.    }.. 
8f80: 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 46 69     /**.     * Fi
8f90: 6e 64 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  nds the name of 
8fa0: 74 68 65 20 66 69 72 73 74 20 74 61 62 6c 65 2c  the first table,
8fb0: 20 77 68 69 63 68 20 69 73 20 65 64 69 74 61 62   which is editab
8fc0: 6c 65 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20  le..     *.     
8fd0: 2a 20 40 70 61 72 61 6d 20 74 61 62 6c 65 73 20  * @param tables 
8fe0: 61 20 6c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  a list of tables
8ff0: 0a 20 20 20 20 20 2a 20 40 72 65 74 75 72 6e 20  .     * @return 
9000: 74 68 65 20 66 69 72 73 74 20 74 61 62 6c 65 20  the first table 
9010: 6c 69 73 74 65 64 0a 20 20 20 20 20 2a 2f 0a 20  listed.     */. 
9020: 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63     public static
9030: 20 53 74 72 69 6e 67 20 66 69 6e 64 45 64 69 74   String findEdit
9040: 54 61 62 6c 65 28 53 74 72 69 6e 67 20 74 61 62  Table(String tab
9050: 6c 65 73 29 20 7b 0a 20 20 20 20 20 20 20 20 69  les) {.        i
9060: 66 20 28 21 54 65 78 74 55 74 69 6c 73 2e 69 73  f (!TextUtils.is
9070: 45 6d 70 74 79 28 74 61 62 6c 65 73 29 29 20 7b  Empty(tables)) {
9080: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
9090: 66 69 6e 64 20 74 68 65 20 66 69 72 73 74 20 77  find the first w
90a0: 6f 72 64 20 74 65 72 6d 69 6e 61 74 65 64 20 62  ord terminated b
90b0: 79 20 65 69 74 68 65 72 20 61 20 73 70 61 63 65  y either a space
90c0: 20 6f 72 20 61 20 63 6f 6d 6d 61 0a 20 20 20 20   or a comma.    
90d0: 20 20 20 20 20 20 20 20 69 6e 74 20 73 70 61 63          int spac
90e0: 65 70 6f 73 20 3d 20 74 61 62 6c 65 73 2e 69 6e  epos = tables.in
90f0: 64 65 78 4f 66 28 27 20 27 29 3b 0a 20 20 20 20  dexOf(' ');.    
9100: 20 20 20 20 20 20 20 20 69 6e 74 20 63 6f 6d 6d          int comm
9110: 61 70 6f 73 20 3d 20 74 61 62 6c 65 73 2e 69 6e  apos = tables.in
9120: 64 65 78 4f 66 28 27 2c 27 29 3b 0a 0a 20 20 20  dexOf(',');..   
9130: 20 20 20 20 20 20 20 20 20 69 66 20 28 73 70 61           if (spa
9140: 63 65 70 6f 73 20 3e 20 30 20 26 26 20 28 73 70  cepos > 0 && (sp
9150: 61 63 65 70 6f 73 20 3c 20 63 6f 6d 6d 61 70 6f  acepos < commapo
9160: 73 20 7c 7c 20 63 6f 6d 6d 61 70 6f 73 20 3c 20  s || commapos < 
9170: 30 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  0)) {.          
9180: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 61 62        return tab
9190: 6c 65 73 2e 73 75 62 73 74 72 69 6e 67 28 30 2c  les.substring(0,
91a0: 20 73 70 61 63 65 70 6f 73 29 3b 0a 20 20 20 20   spacepos);.    
91b0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69          } else i
91c0: 66 20 28 63 6f 6d 6d 61 70 6f 73 20 3e 20 30 20  f (commapos > 0 
91d0: 26 26 20 28 63 6f 6d 6d 61 70 6f 73 20 3c 20 73  && (commapos < s
91e0: 70 61 63 65 70 6f 73 20 7c 7c 20 73 70 61 63 65  pacepos || space
91f0: 70 6f 73 20 3c 20 30 29 20 29 20 7b 0a 20 20 20  pos < 0) ) {.   
9200: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
9210: 75 72 6e 20 74 61 62 6c 65 73 2e 73 75 62 73 74  urn tables.subst
9220: 72 69 6e 67 28 30 2c 20 63 6f 6d 6d 61 70 6f 73  ring(0, commapos
9230: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
9240: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
9250: 75 72 6e 20 74 61 62 6c 65 73 3b 0a 20 20 20 20  urn tables;.    
9260: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
9270: 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e           throw n
9280: 65 77 20 49 6c 6c 65 67 61 6c 53 74 61 74 65 45  ew IllegalStateE
9290: 78 63 65 70 74 69 6f 6e 28 22 49 6e 76 61 6c 69  xception("Invali
92a0: 64 20 74 61 62 6c 65 73 22 29 3b 0a 20 20 20 20  d tables");.    
92b0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
92c0: 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 43 6f 6d 70   /**.     * Comp
92d0: 69 6c 65 73 20 61 6e 20 53 51 4c 20 73 74 61 74  iles an SQL stat
92e0: 65 6d 65 6e 74 20 69 6e 74 6f 20 61 20 72 65 75  ement into a reu
92f0: 73 61 62 6c 65 20 70 72 65 2d 63 6f 6d 70 69 6c  sable pre-compil
9300: 65 64 20 73 74 61 74 65 6d 65 6e 74 20 6f 62 6a  ed statement obj
9310: 65 63 74 2e 0a 20 20 20 20 20 2a 20 54 68 65 20  ect..     * The 
9320: 70 61 72 61 6d 65 74 65 72 73 20 61 72 65 20 69  parameters are i
9330: 64 65 6e 74 69 63 61 6c 20 74 6f 20 7b 40 6c 69  dentical to {@li
9340: 6e 6b 20 23 65 78 65 63 53 51 4c 28 53 74 72 69  nk #execSQL(Stri
9350: 6e 67 29 7d 2e 20 59 6f 75 20 6d 61 79 20 70 75  ng)}. You may pu
9360: 74 20 3f 73 20 69 6e 20 74 68 65 0a 20 20 20 20  t ?s in the.    
9370: 20 2a 20 73 74 61 74 65 6d 65 6e 74 20 61 6e 64   * statement and
9380: 20 66 69 6c 6c 20 69 6e 20 74 68 6f 73 65 20 76   fill in those v
9390: 61 6c 75 65 73 20 77 69 74 68 20 7b 40 6c 69 6e  alues with {@lin
93a0: 6b 20 53 51 4c 69 74 65 50 72 6f 67 72 61 6d 23  k SQLiteProgram#
93b0: 62 69 6e 64 53 74 72 69 6e 67 7d 0a 20 20 20 20  bindString}.    
93c0: 20 2a 20 61 6e 64 20 7b 40 6c 69 6e 6b 20 53 51   * and {@link SQ
93d0: 4c 69 74 65 50 72 6f 67 72 61 6d 23 62 69 6e 64  LiteProgram#bind
93e0: 4c 6f 6e 67 7d 20 65 61 63 68 20 74 69 6d 65 20  Long} each time 
93f0: 79 6f 75 20 77 61 6e 74 20 74 6f 20 72 75 6e 20  you want to run 
9400: 74 68 65 0a 20 20 20 20 20 2a 20 73 74 61 74 65  the.     * state
9410: 6d 65 6e 74 2e 20 53 74 61 74 65 6d 65 6e 74 73  ment. Statements
9420: 20 6d 61 79 20 6e 6f 74 20 72 65 74 75 72 6e 20   may not return 
9430: 72 65 73 75 6c 74 20 73 65 74 73 20 6c 61 72 67  result sets larg
9440: 65 72 20 74 68 61 6e 20 31 78 31 2e 0a 20 20 20  er than 1x1..   
9450: 20 20 2a 3c 70 3e 0a 20 20 20 20 20 2a 20 4e 6f    *<p>.     * No
9460: 20 74 77 6f 20 74 68 72 65 61 64 73 20 73 68 6f   two threads sho
9470: 75 6c 64 20 62 65 20 75 73 69 6e 67 20 74 68 65  uld be using the
9480: 20 73 61 6d 65 20 7b 40 6c 69 6e 6b 20 53 51 4c   same {@link SQL
9490: 69 74 65 53 74 61 74 65 6d 65 6e 74 7d 20 61 74  iteStatement} at
94a0: 20 74 68 65 20 73 61 6d 65 20 74 69 6d 65 2e 0a   the same time..
94b0: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 70       *.     * @p
94c0: 61 72 61 6d 20 73 71 6c 20 54 68 65 20 72 61 77  aram sql The raw
94d0: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2c 20   SQL statement, 
94e0: 6d 61 79 20 63 6f 6e 74 61 69 6e 20 3f 20 66 6f  may contain ? fo
94f0: 72 20 75 6e 6b 6e 6f 77 6e 20 76 61 6c 75 65 73  r unknown values
9500: 20 74 6f 20 62 65 0a 20 20 20 20 20 2a 20 20 20   to be.     *   
9510: 20 20 20 20 20 20 20 20 20 62 6f 75 6e 64 20 6c           bound l
9520: 61 74 65 72 2e 0a 20 20 20 20 20 2a 20 40 72 65  ater..     * @re
9530: 74 75 72 6e 20 41 20 70 72 65 2d 63 6f 6d 70 69  turn A pre-compi
9540: 6c 65 64 20 7b 40 6c 69 6e 6b 20 53 51 4c 69 74  led {@link SQLit
9550: 65 53 74 61 74 65 6d 65 6e 74 7d 20 6f 62 6a 65  eStatement} obje
9560: 63 74 2e 20 4e 6f 74 65 20 74 68 61 74 0a 20 20  ct. Note that.  
9570: 20 20 20 2a 20 7b 40 6c 69 6e 6b 20 53 51 4c 69     * {@link SQLi
9580: 74 65 53 74 61 74 65 6d 65 6e 74 7d 73 20 61 72  teStatement}s ar
9590: 65 20 6e 6f 74 20 73 79 6e 63 68 72 6f 6e 69 7a  e not synchroniz
95a0: 65 64 2c 20 73 65 65 20 74 68 65 20 64 6f 63 75  ed, see the docu
95b0: 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20 6d 6f  mentation for mo
95c0: 72 65 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20  re details..    
95d0: 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20 53   */.    public S
95e0: 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 63  QLiteStatement c
95f0: 6f 6d 70 69 6c 65 53 74 61 74 65 6d 65 6e 74 28  ompileStatement(
9600: 53 74 72 69 6e 67 20 73 71 6c 29 20 74 68 72 6f  String sql) thro
9610: 77 73 20 53 51 4c 45 78 63 65 70 74 69 6f 6e 20  ws SQLException 
9620: 7b 0a 20 20 20 20 20 20 20 20 61 63 71 75 69 72  {.        acquir
9630: 65 52 65 66 65 72 65 6e 63 65 28 29 3b 0a 20 20  eReference();.  
9640: 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20        try {.    
9650: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
9660: 65 77 20 53 51 4c 69 74 65 53 74 61 74 65 6d 65  ew SQLiteStateme
9670: 6e 74 28 74 68 69 73 2c 20 73 71 6c 2c 20 6e 75  nt(this, sql, nu
9680: 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 66  ll);.        } f
9690: 69 6e 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20  inally {.       
96a0: 20 20 20 20 20 72 65 6c 65 61 73 65 52 65 66 65       releaseRefe
96b0: 72 65 6e 63 65 28 29 3b 0a 20 20 20 20 20 20 20  rence();.       
96c0: 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
96d0: 2a 0a 20 20 20 20 20 2a 20 51 75 65 72 79 20 74  *.     * Query t
96e0: 68 65 20 67 69 76 65 6e 20 55 52 4c 2c 20 72 65  he given URL, re
96f0: 74 75 72 6e 69 6e 67 20 61 20 7b 40 6c 69 6e 6b  turning a {@link
9700: 20 43 75 72 73 6f 72 7d 20 6f 76 65 72 20 74 68   Cursor} over th
9710: 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a 20 20  e result set..  
9720: 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 70 61 72     *.     * @par
9730: 61 6d 20 64 69 73 74 69 6e 63 74 20 74 72 75 65  am distinct true
9740: 20 69 66 20 79 6f 75 20 77 61 6e 74 20 65 61 63   if you want eac
9750: 68 20 72 6f 77 20 74 6f 20 62 65 20 75 6e 69 71  h row to be uniq
9760: 75 65 2c 20 66 61 6c 73 65 20 6f 74 68 65 72 77  ue, false otherw
9770: 69 73 65 2e 0a 20 20 20 20 20 2a 20 40 70 61 72  ise..     * @par
9780: 61 6d 20 74 61 62 6c 65 20 54 68 65 20 74 61 62  am table The tab
9790: 6c 65 20 6e 61 6d 65 20 74 6f 20 63 6f 6d 70 69  le name to compi
97a0: 6c 65 20 74 68 65 20 71 75 65 72 79 20 61 67 61  le the query aga
97b0: 69 6e 73 74 2e 0a 20 20 20 20 20 2a 20 40 70 61  inst..     * @pa
97c0: 72 61 6d 20 63 6f 6c 75 6d 6e 73 20 41 20 6c 69  ram columns A li
97d0: 73 74 20 6f 66 20 77 68 69 63 68 20 63 6f 6c 75  st of which colu
97e0: 6d 6e 73 20 74 6f 20 72 65 74 75 72 6e 2e 20 50  mns to return. P
97f0: 61 73 73 69 6e 67 20 6e 75 6c 6c 20 77 69 6c 6c  assing null will
9800: 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20  .     *         
9810: 20 20 20 72 65 74 75 72 6e 20 61 6c 6c 20 63 6f     return all co
9820: 6c 75 6d 6e 73 2c 20 77 68 69 63 68 20 69 73 20  lumns, which is 
9830: 64 69 73 63 6f 75 72 61 67 65 64 20 74 6f 20 70  discouraged to p
9840: 72 65 76 65 6e 74 20 72 65 61 64 69 6e 67 0a 20  revent reading. 
9850: 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20      *           
9860: 20 64 61 74 61 20 66 72 6f 6d 20 73 74 6f 72 61   data from stora
9870: 67 65 20 74 68 61 74 20 69 73 6e 27 74 20 67 6f  ge that isn't go
9880: 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64 2e 0a  ing to be used..
9890: 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 73 65       * @param se
98a0: 6c 65 63 74 69 6f 6e 20 41 20 66 69 6c 74 65 72  lection A filter
98b0: 20 64 65 63 6c 61 72 69 6e 67 20 77 68 69 63 68   declaring which
98c0: 20 72 6f 77 73 20 74 6f 20 72 65 74 75 72 6e 2c   rows to return,
98d0: 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20 61 6e   formatted as an
98e0: 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20  .     *         
98f0: 20 20 20 53 51 4c 20 57 48 45 52 45 20 63 6c 61     SQL WHERE cla
9900: 75 73 65 20 28 65 78 63 6c 75 64 69 6e 67 20 74  use (excluding t
9910: 68 65 20 57 48 45 52 45 20 69 74 73 65 6c 66 29  he WHERE itself)
9920: 2e 20 50 61 73 73 69 6e 67 20 6e 75 6c 6c 0a 20  . Passing null. 
9930: 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20      *           
9940: 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6c 6c   will return all
9950: 20 72 6f 77 73 20 66 6f 72 20 74 68 65 20 67 69   rows for the gi
9960: 76 65 6e 20 74 61 62 6c 65 2e 0a 20 20 20 20 20  ven table..     
9970: 2a 20 40 70 61 72 61 6d 20 73 65 6c 65 63 74 69  * @param selecti
9980: 6f 6e 41 72 67 73 20 59 6f 75 20 6d 61 79 20 69  onArgs You may i
9990: 6e 63 6c 75 64 65 20 3f 73 20 69 6e 20 73 65 6c  nclude ?s in sel
99a0: 65 63 74 69 6f 6e 2c 20 77 68 69 63 68 20 77 69  ection, which wi
99b0: 6c 6c 20 62 65 0a 20 20 20 20 20 2a 20 20 20 20  ll be.     *    
99c0: 20 20 20 20 20 72 65 70 6c 61 63 65 64 20 62 79       replaced by
99d0: 20 74 68 65 20 76 61 6c 75 65 73 20 66 72 6f 6d   the values from
99e0: 20 73 65 6c 65 63 74 69 6f 6e 41 72 67 73 2c 20   selectionArgs, 
99f0: 69 6e 20 6f 72 64 65 72 20 74 68 61 74 20 74 68  in order that th
9a00: 65 79 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20  ey.     *       
9a10: 20 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20    appear in the 
9a20: 73 65 6c 65 63 74 69 6f 6e 2e 20 54 68 65 20 76  selection. The v
9a30: 61 6c 75 65 73 20 77 69 6c 6c 20 62 65 20 62 6f  alues will be bo
9a40: 75 6e 64 20 61 73 20 53 74 72 69 6e 67 73 2e 0a  und as Strings..
9a50: 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 67 72       * @param gr
9a60: 6f 75 70 42 79 20 41 20 66 69 6c 74 65 72 20 64  oupBy A filter d
9a70: 65 63 6c 61 72 69 6e 67 20 68 6f 77 20 74 6f 20  eclaring how to 
9a80: 67 72 6f 75 70 20 72 6f 77 73 2c 20 66 6f 72 6d  group rows, form
9a90: 61 74 74 65 64 20 61 73 20 61 6e 20 53 51 4c 0a  atted as an SQL.
9aa0: 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 20       *          
9ab0: 20 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73    GROUP BY claus
9ac0: 65 20 28 65 78 63 6c 75 64 69 6e 67 20 74 68 65  e (excluding the
9ad0: 20 47 52 4f 55 50 20 42 59 20 69 74 73 65 6c 66   GROUP BY itself
9ae0: 29 2e 20 50 61 73 73 69 6e 67 20 6e 75 6c 6c 0a  ). Passing null.
9af0: 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 20       *          
9b00: 20 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65    will cause the
9b10: 20 72 6f 77 73 20 74 6f 20 6e 6f 74 20 62 65 20   rows to not be 
9b20: 67 72 6f 75 70 65 64 2e 0a 20 20 20 20 20 2a 20  grouped..     * 
9b30: 40 70 61 72 61 6d 20 68 61 76 69 6e 67 20 41 20  @param having A 
9b40: 66 69 6c 74 65 72 20 64 65 63 6c 61 72 65 20 77  filter declare w
9b50: 68 69 63 68 20 72 6f 77 20 67 72 6f 75 70 73 20  hich row groups 
9b60: 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68  to include in th
9b70: 65 20 63 75 72 73 6f 72 2c 0a 20 20 20 20 20 2a  e cursor,.     *
9b80: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 72              if r
9b90: 6f 77 20 67 72 6f 75 70 69 6e 67 20 69 73 20 62  ow grouping is b
9ba0: 65 69 6e 67 20 75 73 65 64 2c 20 66 6f 72 6d 61  eing used, forma
9bb0: 74 74 65 64 20 61 73 20 61 6e 20 53 51 4c 20 48  tted as an SQL H
9bc0: 41 56 49 4e 47 0a 20 20 20 20 20 2a 20 20 20 20  AVING.     *    
9bd0: 20 20 20 20 20 20 20 20 63 6c 61 75 73 65 20 28          clause (
9be0: 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20 48 41  excluding the HA
9bf0: 56 49 4e 47 20 69 74 73 65 6c 66 29 2e 20 50 61  VING itself). Pa
9c00: 73 73 69 6e 67 20 6e 75 6c 6c 20 77 69 6c 6c 20  ssing null will 
9c10: 63 61 75 73 65 0a 20 20 20 20 20 2a 20 20 20 20  cause.     *    
9c20: 20 20 20 20 20 20 20 20 61 6c 6c 20 72 6f 77 20          all row 
9c30: 67 72 6f 75 70 73 20 74 6f 20 62 65 20 69 6e 63  groups to be inc
9c40: 6c 75 64 65 64 2c 20 61 6e 64 20 69 73 20 72 65  luded, and is re
9c50: 71 75 69 72 65 64 20 77 68 65 6e 20 72 6f 77 0a  quired when row.
9c60: 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 20       *          
9c70: 20 20 67 72 6f 75 70 69 6e 67 20 69 73 20 6e 6f    grouping is no
9c80: 74 20 62 65 69 6e 67 20 75 73 65 64 2e 0a 20 20  t being used..  
9c90: 20 20 20 2a 20 40 70 61 72 61 6d 20 6f 72 64 65     * @param orde
9ca0: 72 42 79 20 48 6f 77 20 74 6f 20 6f 72 64 65 72  rBy How to order
9cb0: 20 74 68 65 20 72 6f 77 73 2c 20 66 6f 72 6d 61   the rows, forma
9cc0: 74 74 65 64 20 61 73 20 61 6e 20 53 51 4c 20 4f  tted as an SQL O
9cd0: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20  RDER BY clause. 
9ce0: 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20      *           
9cf0: 20 28 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20   (excluding the 
9d00: 4f 52 44 45 52 20 42 59 20 69 74 73 65 6c 66 29  ORDER BY itself)
9d10: 2e 20 50 61 73 73 69 6e 67 20 6e 75 6c 6c 20 77  . Passing null w
9d20: 69 6c 6c 20 75 73 65 20 74 68 65 0a 20 20 20 20  ill use the.    
9d30: 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 64 65   *            de
9d40: 66 61 75 6c 74 20 73 6f 72 74 20 6f 72 64 65 72  fault sort order
9d50: 2c 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 75  , which may be u
9d60: 6e 6f 72 64 65 72 65 64 2e 0a 20 20 20 20 20 2a  nordered..     *
9d70: 20 40 70 61 72 61 6d 20 6c 69 6d 69 74 20 4c 69   @param limit Li
9d80: 6d 69 74 73 20 74 68 65 20 6e 75 6d 62 65 72 20  mits the number 
9d90: 6f 66 20 72 6f 77 73 20 72 65 74 75 72 6e 65 64  of rows returned
9da0: 20 62 79 20 74 68 65 20 71 75 65 72 79 2c 0a 20   by the query,. 
9db0: 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20      *           
9dc0: 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20 4c 49   formatted as LI
9dd0: 4d 49 54 20 63 6c 61 75 73 65 2e 20 50 61 73 73  MIT clause. Pass
9de0: 69 6e 67 20 6e 75 6c 6c 20 64 65 6e 6f 74 65 73  ing null denotes
9df0: 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73 65   no LIMIT clause
9e00: 2e 0a 20 20 20 20 20 2a 20 40 72 65 74 75 72 6e  ..     * @return
9e10: 20 41 20 7b 40 6c 69 6e 6b 20 43 75 72 73 6f 72   A {@link Cursor
9e20: 7d 20 6f 62 6a 65 63 74 2c 20 77 68 69 63 68 20  } object, which 
9e30: 69 73 20 70 6f 73 69 74 69 6f 6e 65 64 20 62 65  is positioned be
9e40: 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 65  fore the first e
9e50: 6e 74 72 79 2e 20 4e 6f 74 65 20 74 68 61 74 0a  ntry. Note that.
9e60: 20 20 20 20 20 2a 20 7b 40 6c 69 6e 6b 20 43 75       * {@link Cu
9e70: 72 73 6f 72 7d 73 20 61 72 65 20 6e 6f 74 20 73  rsor}s are not s
9e80: 79 6e 63 68 72 6f 6e 69 7a 65 64 2c 20 73 65 65  ynchronized, see
9e90: 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69   the documentati
9ea0: 6f 6e 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 61  on for more deta
9eb0: 69 6c 73 2e 0a 20 20 20 20 20 2a 20 40 73 65 65  ils..     * @see
9ec0: 20 43 75 72 73 6f 72 0a 20 20 20 20 20 2a 2f 0a   Cursor.     */.
9ed0: 20 20 20 20 70 75 62 6c 69 63 20 43 75 72 73 6f      public Curso
9ee0: 72 20 71 75 65 72 79 28 62 6f 6f 6c 65 61 6e 20  r query(boolean 
9ef0: 64 69 73 74 69 6e 63 74 2c 20 53 74 72 69 6e 67  distinct, String
9f00: 20 74 61 62 6c 65 2c 20 53 74 72 69 6e 67 5b 5d   table, String[]
9f10: 20 63 6f 6c 75 6d 6e 73 2c 0a 20 20 20 20 20 20   columns,.      
9f20: 20 20 20 20 20 20 53 74 72 69 6e 67 20 73 65 6c        String sel
9f30: 65 63 74 69 6f 6e 2c 20 53 74 72 69 6e 67 5b 5d  ection, String[]
9f40: 20 73 65 6c 65 63 74 69 6f 6e 41 72 67 73 2c 20   selectionArgs, 
9f50: 53 74 72 69 6e 67 20 67 72 6f 75 70 42 79 2c 0a  String groupBy,.
9f60: 20 20 20 20 20 20 20 20 20 20 20 20 53 74 72 69              Stri
9f70: 6e 67 20 68 61 76 69 6e 67 2c 20 53 74 72 69 6e  ng having, Strin
9f80: 67 20 6f 72 64 65 72 42 79 2c 20 53 74 72 69 6e  g orderBy, Strin
9f90: 67 20 6c 69 6d 69 74 29 20 7b 0a 20 20 20 20 20  g limit) {.     
9fa0: 20 20 20 72 65 74 75 72 6e 20 71 75 65 72 79 57     return queryW
9fb0: 69 74 68 46 61 63 74 6f 72 79 28 6e 75 6c 6c 2c  ithFactory(null,
9fc0: 20 64 69 73 74 69 6e 63 74 2c 20 74 61 62 6c 65   distinct, table
9fd0: 2c 20 63 6f 6c 75 6d 6e 73 2c 20 73 65 6c 65 63  , columns, selec
9fe0: 74 69 6f 6e 2c 20 73 65 6c 65 63 74 69 6f 6e 41  tion, selectionA
9ff0: 72 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rgs,.           
a000: 20 20 20 20 20 67 72 6f 75 70 42 79 2c 20 68 61       groupBy, ha
a010: 76 69 6e 67 2c 20 6f 72 64 65 72 42 79 2c 20 6c  ving, orderBy, l
a020: 69 6d 69 74 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20  imit, null);.   
a030: 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20   }..    /**.    
a040: 20 2a 20 51 75 65 72 79 20 74 68 65 20 67 69 76   * Query the giv
a050: 65 6e 20 55 52 4c 2c 20 72 65 74 75 72 6e 69 6e  en URL, returnin
a060: 67 20 61 20 7b 40 6c 69 6e 6b 20 43 75 72 73 6f  g a {@link Curso
a070: 72 7d 20 6f 76 65 72 20 74 68 65 20 72 65 73 75  r} over the resu
a080: 6c 74 20 73 65 74 2e 0a 20 20 20 20 20 2a 0a 20  lt set..     *. 
a090: 20 20 20 20 2a 20 40 70 61 72 61 6d 20 64 69 73      * @param dis
a0a0: 74 69 6e 63 74 20 74 72 75 65 20 69 66 20 79 6f  tinct true if yo
a0b0: 75 20 77 61 6e 74 20 65 61 63 68 20 72 6f 77 20  u want each row 
a0c0: 74 6f 20 62 65 20 75 6e 69 71 75 65 2c 20 66 61  to be unique, fa
a0d0: 6c 73 65 20 6f 74 68 65 72 77 69 73 65 2e 0a 20  lse otherwise.. 
a0e0: 20 20 20 20 2a 20 40 70 61 72 61 6d 20 74 61 62      * @param tab
a0f0: 6c 65 20 54 68 65 20 74 61 62 6c 65 20 6e 61 6d  le The table nam
a100: 65 20 74 6f 20 63 6f 6d 70 69 6c 65 20 74 68 65  e to compile the
a110: 20 71 75 65 72 79 20 61 67 61 69 6e 73 74 2e 0a   query against..
a120: 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 63 6f       * @param co
a130: 6c 75 6d 6e 73 20 41 20 6c 69 73 74 20 6f 66 20  lumns A list of 
a140: 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20 74 6f  which columns to
a150: 20 72 65 74 75 72 6e 2e 20 50 61 73 73 69 6e 67   return. Passing
a160: 20 6e 75 6c 6c 20 77 69 6c 6c 0a 20 20 20 20 20   null will.     
a170: 2a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  *            ret
a180: 75 72 6e 20 61 6c 6c 20 63 6f 6c 75 6d 6e 73 2c  urn all columns,
a190: 20 77 68 69 63 68 20 69 73 20 64 69 73 63 6f 75   which is discou
a1a0: 72 61 67 65 64 20 74 6f 20 70 72 65 76 65 6e 74  raged to prevent
a1b0: 20 72 65 61 64 69 6e 67 0a 20 20 20 20 20 2a 20   reading.     * 
a1c0: 20 20 20 20 20 20 20 20 20 20 20 64 61 74 61 20             data 
a1d0: 66 72 6f 6d 20 73 74 6f 72 61 67 65 20 74 68 61  from storage tha
a1e0: 74 20 69 73 6e 27 74 20 67 6f 69 6e 67 20 74 6f  t isn't going to
a1f0: 20 62 65 20 75 73 65 64 2e 0a 20 20 20 20 20 2a   be used..     *
a200: 20 40 70 61 72 61 6d 20 73 65 6c 65 63 74 69 6f   @param selectio
a210: 6e 20 41 20 66 69 6c 74 65 72 20 64 65 63 6c 61  n A filter decla
a220: 72 69 6e 67 20 77 68 69 63 68 20 72 6f 77 73 20  ring which rows 
a230: 74 6f 20 72 65 74 75 72 6e 2c 20 66 6f 72 6d 61  to return, forma
a240: 74 74 65 64 20 61 73 20 61 6e 0a 20 20 20 20 20  tted as an.     
a250: 2a 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c  *            SQL
a260: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 28 65   WHERE clause (e
a270: 78 63 6c 75 64 69 6e 67 20 74 68 65 20 57 48 45  xcluding the WHE
a280: 52 45 20 69 74 73 65 6c 66 29 2e 20 50 61 73 73  RE itself). Pass
a290: 69 6e 67 20 6e 75 6c 6c 0a 20 20 20 20 20 2a 20  ing null.     * 
a2a0: 20 20 20 20 20 20 20 20 20 20 20 77 69 6c 6c 20             will 
a2b0: 72 65 74 75 72 6e 20 61 6c 6c 20 72 6f 77 73 20  return all rows 
a2c0: 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 74 61  for the given ta
a2d0: 62 6c 65 2e 0a 20 20 20 20 20 2a 20 40 70 61 72  ble..     * @par
a2e0: 61 6d 20 73 65 6c 65 63 74 69 6f 6e 41 72 67 73  am selectionArgs
a2f0: 20 59 6f 75 20 6d 61 79 20 69 6e 63 6c 75 64 65   You may include
a300: 20 3f 73 20 69 6e 20 73 65 6c 65 63 74 69 6f 6e   ?s in selection
a310: 2c 20 77 68 69 63 68 20 77 69 6c 6c 20 62 65 0a  , which will be.
a320: 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 72       *         r
a330: 65 70 6c 61 63 65 64 20 62 79 20 74 68 65 20 76  eplaced by the v
a340: 61 6c 75 65 73 20 66 72 6f 6d 20 73 65 6c 65 63  alues from selec
a350: 74 69 6f 6e 41 72 67 73 2c 20 69 6e 20 6f 72 64  tionArgs, in ord
a360: 65 72 20 74 68 61 74 20 74 68 65 79 0a 20 20 20  er that they.   
a370: 20 20 2a 20 20 20 20 20 20 20 20 20 61 70 70 65    *         appe
a380: 61 72 20 69 6e 20 74 68 65 20 73 65 6c 65 63 74  ar in the select
a390: 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65 73 20  ion. The values 
a3a0: 77 69 6c 6c 20 62 65 20 62 6f 75 6e 64 20 61 73  will be bound as
a3b0: 20 53 74 72 69 6e 67 73 2e 0a 20 20 20 20 20 2a   Strings..     *
a3c0: 20 40 70 61 72 61 6d 20 67 72 6f 75 70 42 79 20   @param groupBy 
a3d0: 41 20 66 69 6c 74 65 72 20 64 65 63 6c 61 72 69  A filter declari
a3e0: 6e 67 20 68 6f 77 20 74 6f 20 67 72 6f 75 70 20  ng how to group 
a3f0: 72 6f 77 73 2c 20 66 6f 72 6d 61 74 74 65 64 20  rows, formatted 
a400: 61 73 20 61 6e 20 53 51 4c 0a 20 20 20 20 20 2a  as an SQL.     *
a410: 20 20 20 20 20 20 20 20 20 20 20 20 47 52 4f 55              GROU
a420: 50 20 42 59 20 63 6c 61 75 73 65 20 28 65 78 63  P BY clause (exc
a430: 6c 75 64 69 6e 67 20 74 68 65 20 47 52 4f 55 50  luding the GROUP
a440: 20 42 59 20 69 74 73 65 6c 66 29 2e 20 50 61 73   BY itself). Pas
a450: 73 69 6e 67 20 6e 75 6c 6c 0a 20 20 20 20 20 2a  sing null.     *
a460: 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6c 6c              will
a470: 20 63 61 75 73 65 20 74 68 65 20 72 6f 77 73 20   cause the rows 
a480: 74 6f 20 6e 6f 74 20 62 65 20 67 72 6f 75 70 65  to not be groupe
a490: 64 2e 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d  d..     * @param
a4a0: 20 68 61 76 69 6e 67 20 41 20 66 69 6c 74 65 72   having A filter
a4b0: 20 64 65 63 6c 61 72 65 20 77 68 69 63 68 20 72   declare which r
a4c0: 6f 77 20 67 72 6f 75 70 73 20 74 6f 20 69 6e 63  ow groups to inc
a4d0: 6c 75 64 65 20 69 6e 20 74 68 65 20 63 75 72 73  lude in the curs
a4e0: 6f 72 2c 0a 20 20 20 20 20 2a 20 20 20 20 20 20  or,.     *      
a4f0: 20 20 20 20 20 20 69 66 20 72 6f 77 20 67 72 6f        if row gro
a500: 75 70 69 6e 67 20 69 73 20 62 65 69 6e 67 20 75  uping is being u
a510: 73 65 64 2c 20 66 6f 72 6d 61 74 74 65 64 20 61  sed, formatted a
a520: 73 20 61 6e 20 53 51 4c 20 48 41 56 49 4e 47 0a  s an SQL HAVING.
a530: 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 20       *          
a540: 20 20 63 6c 61 75 73 65 20 28 65 78 63 6c 75 64    clause (exclud
a550: 69 6e 67 20 74 68 65 20 48 41 56 49 4e 47 20 69  ing the HAVING i
a560: 74 73 65 6c 66 29 2e 20 50 61 73 73 69 6e 67 20  tself). Passing 
a570: 6e 75 6c 6c 20 77 69 6c 6c 20 63 61 75 73 65 0a  null will cause.
a580: 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 20       *          
a590: 20 20 61 6c 6c 20 72 6f 77 20 67 72 6f 75 70 73    all row groups
a5a0: 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65 64 2c   to be included,
a5b0: 20 61 6e 64 20 69 73 20 72 65 71 75 69 72 65 64   and is required
a5c0: 20 77 68 65 6e 20 72 6f 77 0a 20 20 20 20 20 2a   when row.     *
a5d0: 20 20 20 20 20 20 20 20 20 20 20 20 67 72 6f 75              grou
a5e0: 70 69 6e 67 20 69 73 20 6e 6f 74 20 62 65 69 6e  ping is not bein
a5f0: 67 20 75 73 65 64 2e 0a 20 20 20 20 20 2a 20 40  g used..     * @
a600: 70 61 72 61 6d 20 6f 72 64 65 72 42 79 20 48 6f  param orderBy Ho
a610: 77 20 74 6f 20 6f 72 64 65 72 20 74 68 65 20 72  w to order the r
a620: 6f 77 73 2c 20 66 6f 72 6d 61 74 74 65 64 20 61  ows, formatted a
a630: 73 20 61 6e 20 53 51 4c 20 4f 52 44 45 52 20 42  s an SQL ORDER B
a640: 59 20 63 6c 61 75 73 65 0a 20 20 20 20 20 2a 20  Y clause.     * 
a650: 20 20 20 20 20 20 20 20 20 20 20 28 65 78 63 6c             (excl
a660: 75 64 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20  uding the ORDER 
a670: 42 59 20 69 74 73 65 6c 66 29 2e 20 50 61 73 73  BY itself). Pass
a680: 69 6e 67 20 6e 75 6c 6c 20 77 69 6c 6c 20 75 73  ing null will us
a690: 65 20 74 68 65 0a 20 20 20 20 20 2a 20 20 20 20  e the.     *    
a6a0: 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 20          default 
a6b0: 73 6f 72 74 20 6f 72 64 65 72 2c 20 77 68 69 63  sort order, whic
a6c0: 68 20 6d 61 79 20 62 65 20 75 6e 6f 72 64 65 72  h may be unorder
a6d0: 65 64 2e 0a 20 20 20 20 20 2a 20 40 70 61 72 61  ed..     * @para
a6e0: 6d 20 6c 69 6d 69 74 20 4c 69 6d 69 74 73 20 74  m limit Limits t
a6f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
a700: 73 20 72 65 74 75 72 6e 65 64 20 62 79 20 74 68  s returned by th
a710: 65 20 71 75 65 72 79 2c 0a 20 20 20 20 20 2a 20  e query,.     * 
a720: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 6d 61             forma
a730: 74 74 65 64 20 61 73 20 4c 49 4d 49 54 20 63 6c  tted as LIMIT cl
a740: 61 75 73 65 2e 20 50 61 73 73 69 6e 67 20 6e 75  ause. Passing nu
a750: 6c 6c 20 64 65 6e 6f 74 65 73 20 6e 6f 20 4c 49  ll denotes no LI
a760: 4d 49 54 20 63 6c 61 75 73 65 2e 0a 20 20 20 20  MIT clause..    
a770: 20 2a 20 40 70 61 72 61 6d 20 63 61 6e 63 65 6c   * @param cancel
a780: 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 20 41 20 73  lationSignal A s
a790: 69 67 6e 61 6c 20 74 6f 20 63 61 6e 63 65 6c 20  ignal to cancel 
a7a0: 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e  the operation in
a7b0: 20 70 72 6f 67 72 65 73 73 2c 20 6f 72 20 6e 75   progress, or nu
a7c0: 6c 6c 20 69 66 20 6e 6f 6e 65 2e 0a 20 20 20 20  ll if none..    
a7d0: 20 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74   * If the operat
a7e0: 69 6f 6e 20 69 73 20 63 61 6e 63 65 6c 65 64 2c  ion is canceled,
a7f0: 20 74 68 65 6e 20 7b 40 6c 69 6e 6b 20 4f 70 65   then {@link Ope
a800: 72 61 74 69 6f 6e 43 61 6e 63 65 6c 65 64 45 78  rationCanceledEx
a810: 63 65 70 74 69 6f 6e 7d 20 77 69 6c 6c 20 62 65  ception} will be
a820: 20 74 68 72 6f 77 6e 0a 20 20 20 20 20 2a 20 77   thrown.     * w
a830: 68 65 6e 20 74 68 65 20 71 75 65 72 79 20 69 73  hen the query is
a840: 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20 20   executed..     
a850: 2a 20 40 72 65 74 75 72 6e 20 41 20 7b 40 6c 69  * @return A {@li
a860: 6e 6b 20 43 75 72 73 6f 72 7d 20 6f 62 6a 65 63  nk Cursor} objec
a870: 74 2c 20 77 68 69 63 68 20 69 73 20 70 6f 73 69  t, which is posi
a880: 74 69 6f 6e 65 64 20 62 65 66 6f 72 65 20 74 68  tioned before th
a890: 65 20 66 69 72 73 74 20 65 6e 74 72 79 2e 20 4e  e first entry. N
a8a0: 6f 74 65 20 74 68 61 74 0a 20 20 20 20 20 2a 20  ote that.     * 
a8b0: 7b 40 6c 69 6e 6b 20 43 75 72 73 6f 72 7d 73 20  {@link Cursor}s 
a8c0: 61 72 65 20 6e 6f 74 20 73 79 6e 63 68 72 6f 6e  are not synchron
a8d0: 69 7a 65 64 2c 20 73 65 65 20 74 68 65 20 64 6f  ized, see the do
a8e0: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66 6f 72 20  cumentation for 
a8f0: 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e 0a 20 20  more details..  
a900: 20 20 20 2a 20 40 73 65 65 20 43 75 72 73 6f 72     * @see Cursor
a910: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 75 62  .     */.    pub
a920: 6c 69 63 20 43 75 72 73 6f 72 20 71 75 65 72 79  lic Cursor query
a930: 28 62 6f 6f 6c 65 61 6e 20 64 69 73 74 69 6e 63  (boolean distinc
a940: 74 2c 20 53 74 72 69 6e 67 20 74 61 62 6c 65 2c  t, String table,
a950: 20 53 74 72 69 6e 67 5b 5d 20 63 6f 6c 75 6d 6e   String[] column
a960: 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  s,.            S
a970: 74 72 69 6e 67 20 73 65 6c 65 63 74 69 6f 6e 2c  tring selection,
a980: 20 53 74 72 69 6e 67 5b 5d 20 73 65 6c 65 63 74   String[] select
a990: 69 6f 6e 41 72 67 73 2c 20 53 74 72 69 6e 67 20  ionArgs, String 
a9a0: 67 72 6f 75 70 42 79 2c 0a 20 20 20 20 20 20 20  groupBy,.       
a9b0: 20 20 20 20 20 53 74 72 69 6e 67 20 68 61 76 69       String havi
a9c0: 6e 67 2c 20 53 74 72 69 6e 67 20 6f 72 64 65 72  ng, String order
a9d0: 42 79 2c 20 53 74 72 69 6e 67 20 6c 69 6d 69 74  By, String limit
a9e0: 2c 20 43 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69  , CancellationSi
a9f0: 67 6e 61 6c 20 63 61 6e 63 65 6c 6c 61 74 69 6f  gnal cancellatio
aa00: 6e 53 69 67 6e 61 6c 29 20 7b 0a 20 20 20 20 20  nSignal) {.     
aa10: 20 20 20 72 65 74 75 72 6e 20 71 75 65 72 79 57     return queryW
aa20: 69 74 68 46 61 63 74 6f 72 79 28 6e 75 6c 6c 2c  ithFactory(null,
aa30: 20 64 69 73 74 69 6e 63 74 2c 20 74 61 62 6c 65   distinct, table
aa40: 2c 20 63 6f 6c 75 6d 6e 73 2c 20 73 65 6c 65 63  , columns, selec
aa50: 74 69 6f 6e 2c 20 73 65 6c 65 63 74 69 6f 6e 41  tion, selectionA
aa60: 72 67 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rgs,.           
aa70: 20 20 20 20 20 67 72 6f 75 70 42 79 2c 20 68 61       groupBy, ha
aa80: 76 69 6e 67 2c 20 6f 72 64 65 72 42 79 2c 20 6c  ving, orderBy, l
aa90: 69 6d 69 74 2c 20 63 61 6e 63 65 6c 6c 61 74 69  imit, cancellati
aaa0: 6f 6e 53 69 67 6e 61 6c 29 3b 0a 20 20 20 20 7d  onSignal);.    }
aab0: 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a  ..    /**.     *
aac0: 20 51 75 65 72 79 20 74 68 65 20 67 69 76 65 6e   Query the given
aad0: 20 55 52 4c 2c 20 72 65 74 75 72 6e 69 6e 67 20   URL, returning 
aae0: 61 20 7b 40 6c 69 6e 6b 20 43 75 72 73 6f 72 7d  a {@link Cursor}
aaf0: 20 6f 76 65 72 20 74 68 65 20 72 65 73 75 6c 74   over the result
ab00: 20 73 65 74 2e 0a 20 20 20 20 20 2a 0a 20 20 20   set..     *.   
ab10: 20 20 2a 20 40 70 61 72 61 6d 20 63 75 72 73 6f    * @param curso
ab20: 72 46 61 63 74 6f 72 79 20 74 68 65 20 63 75 72  rFactory the cur
ab30: 73 6f 72 20 66 61 63 74 6f 72 79 20 74 6f 20 75  sor factory to u
ab40: 73 65 2c 20 6f 72 20 6e 75 6c 6c 20 66 6f 72 20  se, or null for 
ab50: 74 68 65 20 64 65 66 61 75 6c 74 20 66 61 63 74  the default fact
ab60: 6f 72 79 0a 20 20 20 20 20 2a 20 40 70 61 72 61  ory.     * @para
ab70: 6d 20 64 69 73 74 69 6e 63 74 20 74 72 75 65 20  m distinct true 
ab80: 69 66 20 79 6f 75 20 77 61 6e 74 20 65 61 63 68  if you want each
ab90: 20 72 6f 77 20 74 6f 20 62 65 20 75 6e 69 71 75   row to be uniqu
aba0: 65 2c 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69  e, false otherwi
abb0: 73 65 2e 0a 20 20 20 20 20 2a 20 40 70 61 72 61  se..     * @para
abc0: 6d 20 74 61 62 6c 65 20 54 68 65 20 74 61 62 6c  m table The tabl
abd0: 65 20 6e 61 6d 65 20 74 6f 20 63 6f 6d 70 69 6c  e name to compil
abe0: 65 20 74 68 65 20 71 75 65 72 79 20 61 67 61 69  e the query agai
abf0: 6e 73 74 2e 0a 20 20 20 20 20 2a 20 40 70 61 72  nst..     * @par
ac00: 61 6d 20 63 6f 6c 75 6d 6e 73 20 41 20 6c 69 73  am columns A lis
ac10: 74 20 6f 66 20 77 68 69 63 68 20 63 6f 6c 75 6d  t of which colum
ac20: 6e 73 20 74 6f 20 72 65 74 75 72 6e 2e 20 50 61  ns to return. Pa
ac30: 73 73 69 6e 67 20 6e 75 6c 6c 20 77 69 6c 6c 0a  ssing null will.
ac40: 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 20       *          
ac50: 20 20 72 65 74 75 72 6e 20 61 6c 6c 20 63 6f 6c    return all col
ac60: 75 6d 6e 73 2c 20 77 68 69 63 68 20 69 73 20 64  umns, which is d
ac70: 69 73 63 6f 75 72 61 67 65 64 20 74 6f 20 70 72  iscouraged to pr
ac80: 65 76 65 6e 74 20 72 65 61 64 69 6e 67 0a 20 20  event reading.  
ac90: 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20 20     *            
aca0: 64 61 74 61 20 66 72 6f 6d 20 73 74 6f 72 61 67  data from storag
acb0: 65 20 74 68 61 74 20 69 73 6e 27 74 20 67 6f 69  e that isn't goi
acc0: 6e 67 20 74 6f 20 62 65 20 75 73 65 64 2e 0a 20  ng to be used.. 
acd0: 20 20 20 20 2a 20 40 70 61 72 61 6d 20 73 65 6c      * @param sel
ace0: 65 63 74 69 6f 6e 20 41 20 66 69 6c 74 65 72 20  ection A filter 
acf0: 64 65 63 6c 61 72 69 6e 67 20 77 68 69 63 68 20  declaring which 
ad00: 72 6f 77 73 20 74 6f 20 72 65 74 75 72 6e 2c 20  rows to return, 
ad10: 66 6f 72 6d 61 74 74 65 64 20 61 73 20 61 6e 0a  formatted as an.
ad20: 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 20       *          
ad30: 20 20 53 51 4c 20 57 48 45 52 45 20 63 6c 61 75    SQL WHERE clau
ad40: 73 65 20 28 65 78 63 6c 75 64 69 6e 67 20 74 68  se (excluding th
ad50: 65 20 57 48 45 52 45 20 69 74 73 65 6c 66 29 2e  e WHERE itself).
ad60: 20 50 61 73 73 69 6e 67 20 6e 75 6c 6c 0a 20 20   Passing null.  
ad70: 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20 20     *            
ad80: 77 69 6c 6c 20 72 65 74 75 72 6e 20 61 6c 6c 20  will return all 
ad90: 72 6f 77 73 20 66 6f 72 20 74 68 65 20 67 69 76  rows for the giv
ada0: 65 6e 20 74 61 62 6c 65 2e 0a 20 20 20 20 20 2a  en table..     *
adb0: 20 40 70 61 72 61 6d 20 73 65 6c 65 63 74 69 6f   @param selectio
adc0: 6e 41 72 67 73 20 59 6f 75 20 6d 61 79 20 69 6e  nArgs You may in
add0: 63 6c 75 64 65 20 3f 73 20 69 6e 20 73 65 6c 65  clude ?s in sele
ade0: 63 74 69 6f 6e 2c 20 77 68 69 63 68 20 77 69 6c  ction, which wil
adf0: 6c 20 62 65 0a 20 20 20 20 20 2a 20 20 20 20 20  l be.     *     
ae00: 20 20 20 20 72 65 70 6c 61 63 65 64 20 62 79 20      replaced by 
ae10: 74 68 65 20 76 61 6c 75 65 73 20 66 72 6f 6d 20  the values from 
ae20: 73 65 6c 65 63 74 69 6f 6e 41 72 67 73 2c 20 69  selectionArgs, i
ae30: 6e 20 6f 72 64 65 72 20 74 68 61 74 20 74 68 65  n order that the
ae40: 79 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20 20  y.     *        
ae50: 20 61 70 70 65 61 72 20 69 6e 20 74 68 65 20 73   appear in the s
ae60: 65 6c 65 63 74 69 6f 6e 2e 20 54 68 65 20 76 61  election. The va
ae70: 6c 75 65 73 20 77 69 6c 6c 20 62 65 20 62 6f 75  lues will be bou
ae80: 6e 64 20 61 73 20 53 74 72 69 6e 67 73 2e 0a 20  nd as Strings.. 
ae90: 20 20 20 20 2a 20 40 70 61 72 61 6d 20 67 72 6f      * @param gro
aea0: 75 70 42 79 20 41 20 66 69 6c 74 65 72 20 64 65  upBy A filter de
aeb0: 63 6c 61 72 69 6e 67 20 68 6f 77 20 74 6f 20 67  claring how to g
aec0: 72 6f 75 70 20 72 6f 77 73 2c 20 66 6f 72 6d 61  roup rows, forma
aed0: 74 74 65 64 20 61 73 20 61 6e 20 53 51 4c 0a 20  tted as an SQL. 
aee0: 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20      *           
aef0: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
af00: 20 28 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20   (excluding the 
af10: 47 52 4f 55 50 20 42 59 20 69 74 73 65 6c 66 29  GROUP BY itself)
af20: 2e 20 50 61 73 73 69 6e 67 20 6e 75 6c 6c 0a 20  . Passing null. 
af30: 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20      *           
af40: 20 77 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20   will cause the 
af50: 72 6f 77 73 20 74 6f 20 6e 6f 74 20 62 65 20 67  rows to not be g
af60: 72 6f 75 70 65 64 2e 0a 20 20 20 20 20 2a 20 40  rouped..     * @
af70: 70 61 72 61 6d 20 68 61 76 69 6e 67 20 41 20 66  param having A f
af80: 69 6c 74 65 72 20 64 65 63 6c 61 72 65 20 77 68  ilter declare wh
af90: 69 63 68 20 72 6f 77 20 67 72 6f 75 70 73 20 74  ich row groups t
afa0: 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20 74 68 65  o include in the
afb0: 20 63 75 72 73 6f 72 2c 0a 20 20 20 20 20 2a 20   cursor,.     * 
afc0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 72 6f             if ro
afd0: 77 20 67 72 6f 75 70 69 6e 67 20 69 73 20 62 65  w grouping is be
afe0: 69 6e 67 20 75 73 65 64 2c 20 66 6f 72 6d 61 74  ing used, format
aff0: 74 65 64 20 61 73 20 61 6e 20 53 51 4c 20 48 41  ted as an SQL HA
b000: 56 49 4e 47 0a 20 20 20 20 20 2a 20 20 20 20 20  VING.     *     
b010: 20 20 20 20 20 20 20 63 6c 61 75 73 65 20 28 65         clause (e
b020: 78 63 6c 75 64 69 6e 67 20 74 68 65 20 48 41 56  xcluding the HAV
b030: 49 4e 47 20 69 74 73 65 6c 66 29 2e 20 50 61 73  ING itself). Pas
b040: 73 69 6e 67 20 6e 75 6c 6c 20 77 69 6c 6c 20 63  sing null will c
b050: 61 75 73 65 0a 20 20 20 20 20 2a 20 20 20 20 20  ause.     *     
b060: 20 20 20 20 20 20 20 61 6c 6c 20 72 6f 77 20 67         all row g
b070: 72 6f 75 70 73 20 74 6f 20 62 65 20 69 6e 63 6c  roups to be incl
b080: 75 64 65 64 2c 20 61 6e 64 20 69 73 20 72 65 71  uded, and is req
b090: 75 69 72 65 64 20 77 68 65 6e 20 72 6f 77 0a 20  uired when row. 
b0a0: 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20      *           
b0b0: 20 67 72 6f 75 70 69 6e 67 20 69 73 20 6e 6f 74   grouping is not
b0c0: 20 62 65 69 6e 67 20 75 73 65 64 2e 0a 20 20 20   being used..   
b0d0: 20 20 2a 20 40 70 61 72 61 6d 20 6f 72 64 65 72    * @param order
b0e0: 42 79 20 48 6f 77 20 74 6f 20 6f 72 64 65 72 20  By How to order 
b0f0: 74 68 65 20 72 6f 77 73 2c 20 66 6f 72 6d 61 74  the rows, format
b100: 74 65 64 20 61 73 20 61 6e 20 53 51 4c 20 4f 52  ted as an SQL OR
b110: 44 45 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20  DER BY clause.  
b120: 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20 20     *            
b130: 28 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20 4f  (excluding the O
b140: 52 44 45 52 20 42 59 20 69 74 73 65 6c 66 29 2e  RDER BY itself).
b150: 20 50 61 73 73 69 6e 67 20 6e 75 6c 6c 20 77 69   Passing null wi
b160: 6c 6c 20 75 73 65 20 74 68 65 0a 20 20 20 20 20  ll use the.     
b170: 2a 20 20 20 20 20 20 20 20 20 20 20 20 64 65 66  *            def
b180: 61 75 6c 74 20 73 6f 72 74 20 6f 72 64 65 72 2c  ault sort order,
b190: 20 77 68 69 63 68 20 6d 61 79 20 62 65 20 75 6e   which may be un
b1a0: 6f 72 64 65 72 65 64 2e 0a 20 20 20 20 20 2a 20  ordered..     * 
b1b0: 40 70 61 72 61 6d 20 6c 69 6d 69 74 20 4c 69 6d  @param limit Lim
b1c0: 69 74 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  its the number o
b1d0: 66 20 72 6f 77 73 20 72 65 74 75 72 6e 65 64 20  f rows returned 
b1e0: 62 79 20 74 68 65 20 71 75 65 72 79 2c 0a 20 20  by the query,.  
b1f0: 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20 20     *            
b200: 66 6f 72 6d 61 74 74 65 64 20 61 73 20 4c 49 4d  formatted as LIM
b210: 49 54 20 63 6c 61 75 73 65 2e 20 50 61 73 73 69  IT clause. Passi
b220: 6e 67 20 6e 75 6c 6c 20 64 65 6e 6f 74 65 73 20  ng null denotes 
b230: 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e  no LIMIT clause.
b240: 0a 20 20 20 20 20 2a 20 40 72 65 74 75 72 6e 20  .     * @return 
b250: 41 20 7b 40 6c 69 6e 6b 20 43 75 72 73 6f 72 7d  A {@link Cursor}
b260: 20 6f 62 6a 65 63 74 2c 20 77 68 69 63 68 20 69   object, which i
b270: 73 20 70 6f 73 69 74 69 6f 6e 65 64 20 62 65 66  s positioned bef
b280: 6f 72 65 20 74 68 65 20 66 69 72 73 74 20 65 6e  ore the first en
b290: 74 72 79 2e 20 4e 6f 74 65 20 74 68 61 74 0a 20  try. Note that. 
b2a0: 20 20 20 20 2a 20 7b 40 6c 69 6e 6b 20 43 75 72      * {@link Cur
b2b0: 73 6f 72 7d 73 20 61 72 65 20 6e 6f 74 20 73 79  sor}s are not sy
b2c0: 6e 63 68 72 6f 6e 69 7a 65 64 2c 20 73 65 65 20  nchronized, see 
b2d0: 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  the documentatio
b2e0: 6e 20 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69  n for more detai
b2f0: 6c 73 2e 0a 20 20 20 20 20 2a 20 40 73 65 65 20  ls..     * @see 
b300: 43 75 72 73 6f 72 0a 20 20 20 20 20 2a 2f 0a 20  Cursor.     */. 
b310: 20 20 20 70 75 62 6c 69 63 20 43 75 72 73 6f 72     public Cursor
b320: 20 71 75 65 72 79 57 69 74 68 46 61 63 74 6f 72   queryWithFactor
b330: 79 28 43 75 72 73 6f 72 46 61 63 74 6f 72 79 20  y(CursorFactory 
b340: 63 75 72 73 6f 72 46 61 63 74 6f 72 79 2c 0a 20  cursorFactory,. 
b350: 20 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 65             boole
b360: 61 6e 20 64 69 73 74 69 6e 63 74 2c 20 53 74 72  an distinct, Str
b370: 69 6e 67 20 74 61 62 6c 65 2c 20 53 74 72 69 6e  ing table, Strin
b380: 67 5b 5d 20 63 6f 6c 75 6d 6e 73 2c 0a 20 20 20  g[] columns,.   
b390: 20 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 20           String 
b3a0: 73 65 6c 65 63 74 69 6f 6e 2c 20 53 74 72 69 6e  selection, Strin
b3b0: 67 5b 5d 20 73 65 6c 65 63 74 69 6f 6e 41 72 67  g[] selectionArg
b3c0: 73 2c 20 53 74 72 69 6e 67 20 67 72 6f 75 70 42  s, String groupB
b3d0: 79 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53  y,.            S
b3e0: 74 72 69 6e 67 20 68 61 76 69 6e 67 2c 20 53 74  tring having, St
b3f0: 72 69 6e 67 20 6f 72 64 65 72 42 79 2c 20 53 74  ring orderBy, St
b400: 72 69 6e 67 20 6c 69 6d 69 74 29 20 7b 0a 20 20  ring limit) {.  
b410: 20 20 20 20 20 20 72 65 74 75 72 6e 20 71 75 65        return que
b420: 72 79 57 69 74 68 46 61 63 74 6f 72 79 28 63 75  ryWithFactory(cu
b430: 72 73 6f 72 46 61 63 74 6f 72 79 2c 20 64 69 73  rsorFactory, dis
b440: 74 69 6e 63 74 2c 20 74 61 62 6c 65 2c 20 63 6f  tinct, table, co
b450: 6c 75 6d 6e 73 2c 20 73 65 6c 65 63 74 69 6f 6e  lumns, selection
b460: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
b470: 20 20 73 65 6c 65 63 74 69 6f 6e 41 72 67 73 2c    selectionArgs,
b480: 20 67 72 6f 75 70 42 79 2c 20 68 61 76 69 6e 67   groupBy, having
b490: 2c 20 6f 72 64 65 72 42 79 2c 20 6c 69 6d 69 74  , orderBy, limit
b4a0: 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 0a  , null);.    }..
b4b0: 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 51      /**.     * Q
b4c0: 75 65 72 79 20 74 68 65 20 67 69 76 65 6e 20 55  uery the given U
b4d0: 52 4c 2c 20 72 65 74 75 72 6e 69 6e 67 20 61 20  RL, returning a 
b4e0: 7b 40 6c 69 6e 6b 20 43 75 72 73 6f 72 7d 20 6f  {@link Cursor} o
b4f0: 76 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  ver the result s
b500: 65 74 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20  et..     *.     
b510: 2a 20 40 70 61 72 61 6d 20 63 75 72 73 6f 72 46  * @param cursorF
b520: 61 63 74 6f 72 79 20 74 68 65 20 63 75 72 73 6f  actory the curso
b530: 72 20 66 61 63 74 6f 72 79 20 74 6f 20 75 73 65  r factory to use
b540: 2c 20 6f 72 20 6e 75 6c 6c 20 66 6f 72 20 74 68  , or null for th
b550: 65 20 64 65 66 61 75 6c 74 20 66 61 63 74 6f 72  e default factor
b560: 79 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20  y.     * @param 
b570: 64 69 73 74 69 6e 63 74 20 74 72 75 65 20 69 66  distinct true if
b580: 20 79 6f 75 20 77 61 6e 74 20 65 61 63 68 20 72   you want each r
b590: 6f 77 20 74 6f 20 62 65 20 75 6e 69 71 75 65 2c  ow to be unique,
b5a0: 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73 65   false otherwise
b5b0: 2e 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20  ..     * @param 
b5c0: 74 61 62 6c 65 20 54 68 65 20 74 61 62 6c 65 20  table The table 
b5d0: 6e 61 6d 65 20 74 6f 20 63 6f 6d 70 69 6c 65 20  name to compile 
b5e0: 74 68 65 20 71 75 65 72 79 20 61 67 61 69 6e 73  the query agains
b5f0: 74 2e 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d  t..     * @param
b600: 20 63 6f 6c 75 6d 6e 73 20 41 20 6c 69 73 74 20   columns A list 
b610: 6f 66 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73  of which columns
b620: 20 74 6f 20 72 65 74 75 72 6e 2e 20 50 61 73 73   to return. Pass
b630: 69 6e 67 20 6e 75 6c 6c 20 77 69 6c 6c 0a 20 20  ing null will.  
b640: 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20 20     *            
b650: 72 65 74 75 72 6e 20 61 6c 6c 20 63 6f 6c 75 6d  return all colum
b660: 6e 73 2c 20 77 68 69 63 68 20 69 73 20 64 69 73  ns, which is dis
b670: 63 6f 75 72 61 67 65 64 20 74 6f 20 70 72 65 76  couraged to prev
b680: 65 6e 74 20 72 65 61 64 69 6e 67 0a 20 20 20 20  ent reading.    
b690: 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 64 61   *            da
b6a0: 74 61 20 66 72 6f 6d 20 73 74 6f 72 61 67 65 20  ta from storage 
b6b0: 74 68 61 74 20 69 73 6e 27 74 20 67 6f 69 6e 67  that isn't going
b6c0: 20 74 6f 20 62 65 20 75 73 65 64 2e 0a 20 20 20   to be used..   
b6d0: 20 20 2a 20 40 70 61 72 61 6d 20 73 65 6c 65 63    * @param selec
b6e0: 74 69 6f 6e 20 41 20 66 69 6c 74 65 72 20 64 65  tion A filter de
b6f0: 63 6c 61 72 69 6e 67 20 77 68 69 63 68 20 72 6f  claring which ro
b700: 77 73 20 74 6f 20 72 65 74 75 72 6e 2c 20 66 6f  ws to return, fo
b710: 72 6d 61 74 74 65 64 20 61 73 20 61 6e 0a 20 20  rmatted as an.  
b720: 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20 20     *            
b730: 53 51 4c 20 57 48 45 52 45 20 63 6c 61 75 73 65  SQL WHERE clause
b740: 20 28 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20   (excluding the 
b750: 57 48 45 52 45 20 69 74 73 65 6c 66 29 2e 20 50  WHERE itself). P
b760: 61 73 73 69 6e 67 20 6e 75 6c 6c 0a 20 20 20 20  assing null.    
b770: 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 77 69   *            wi
b780: 6c 6c 20 72 65 74 75 72 6e 20 61 6c 6c 20 72 6f  ll return all ro
b790: 77 73 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ws for the given
b7a0: 20 74 61 62 6c 65 2e 0a 20 20 20 20 20 2a 20 40   table..     * @
b7b0: 70 61 72 61 6d 20 73 65 6c 65 63 74 69 6f 6e 41  param selectionA
b7c0: 72 67 73 20 59 6f 75 20 6d 61 79 20 69 6e 63 6c  rgs You may incl
b7d0: 75 64 65 20 3f 73 20 69 6e 20 73 65 6c 65 63 74  ude ?s in select
b7e0: 69 6f 6e 2c 20 77 68 69 63 68 20 77 69 6c 6c 20  ion, which will 
b7f0: 62 65 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20  be.     *       
b800: 20 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68    replaced by th
b810: 65 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 73 65  e values from se
b820: 6c 65 63 74 69 6f 6e 41 72 67 73 2c 20 69 6e 20  lectionArgs, in 
b830: 6f 72 64 65 72 20 74 68 61 74 20 74 68 65 79 0a  order that they.
b840: 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 61       *         a
b850: 70 70 65 61 72 20 69 6e 20 74 68 65 20 73 65 6c  ppear in the sel
b860: 65 63 74 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75  ection. The valu
b870: 65 73 20 77 69 6c 6c 20 62 65 20 62 6f 75 6e 64  es will be bound
b880: 20 61 73 20 53 74 72 69 6e 67 73 2e 0a 20 20 20   as Strings..   
b890: 20 20 2a 20 40 70 61 72 61 6d 20 67 72 6f 75 70    * @param group
b8a0: 42 79 20 41 20 66 69 6c 74 65 72 20 64 65 63 6c  By A filter decl
b8b0: 61 72 69 6e 67 20 68 6f 77 20 74 6f 20 67 72 6f  aring how to gro
b8c0: 75 70 20 72 6f 77 73 2c 20 66 6f 72 6d 61 74 74  up rows, formatt
b8d0: 65 64 20 61 73 20 61 6e 20 53 51 4c 0a 20 20 20  ed as an SQL.   
b8e0: 20 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 47    *            G
b8f0: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 28  ROUP BY clause (
b900: 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20 47 52  excluding the GR
b910: 4f 55 50 20 42 59 20 69 74 73 65 6c 66 29 2e 20  OUP BY itself). 
b920: 50 61 73 73 69 6e 67 20 6e 75 6c 6c 0a 20 20 20  Passing null.   
b930: 20 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 77    *            w
b940: 69 6c 6c 20 63 61 75 73 65 20 74 68 65 20 72 6f  ill cause the ro
b950: 77 73 20 74 6f 20 6e 6f 74 20 62 65 20 67 72 6f  ws to not be gro
b960: 75 70 65 64 2e 0a 20 20 20 20 20 2a 20 40 70 61  uped..     * @pa
b970: 72 61 6d 20 68 61 76 69 6e 67 20 41 20 66 69 6c  ram having A fil
b980: 74 65 72 20 64 65 63 6c 61 72 65 20 77 68 69 63  ter declare whic
b990: 68 20 72 6f 77 20 67 72 6f 75 70 73 20 74 6f 20  h row groups to 
b9a0: 69 6e 63 6c 75 64 65 20 69 6e 20 74 68 65 20 63  include in the c
b9b0: 75 72 73 6f 72 2c 0a 20 20 20 20 20 2a 20 20 20  ursor,.     *   
b9c0: 20 20 20 20 20 20 20 20 20 69 66 20 72 6f 77 20           if row 
b9d0: 67 72 6f 75 70 69 6e 67 20 69 73 20 62 65 69 6e  grouping is bein
b9e0: 67 20 75 73 65 64 2c 20 66 6f 72 6d 61 74 74 65  g used, formatte
b9f0: 64 20 61 73 20 61 6e 20 53 51 4c 20 48 41 56 49  d as an SQL HAVI
ba00: 4e 47 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20  NG.     *       
ba10: 20 20 20 20 20 63 6c 61 75 73 65 20 28 65 78 63       clause (exc
ba20: 6c 75 64 69 6e 67 20 74 68 65 20 48 41 56 49 4e  luding the HAVIN
ba30: 47 20 69 74 73 65 6c 66 29 2e 20 50 61 73 73 69  G itself). Passi
ba40: 6e 67 20 6e 75 6c 6c 20 77 69 6c 6c 20 63 61 75  ng null will cau
ba50: 73 65 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20  se.     *       
ba60: 20 20 20 20 20 61 6c 6c 20 72 6f 77 20 67 72 6f       all row gro
ba70: 75 70 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64  ups to be includ
ba80: 65 64 2c 20 61 6e 64 20 69 73 20 72 65 71 75 69  ed, and is requi
ba90: 72 65 64 20 77 68 65 6e 20 72 6f 77 0a 20 20 20  red when row.   
baa0: 20 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 67    *            g
bab0: 72 6f 75 70 69 6e 67 20 69 73 20 6e 6f 74 20 62  rouping is not b
bac0: 65 69 6e 67 20 75 73 65 64 2e 0a 20 20 20 20 20  eing used..     
bad0: 2a 20 40 70 61 72 61 6d 20 6f 72 64 65 72 42 79  * @param orderBy
bae0: 20 48 6f 77 20 74 6f 20 6f 72 64 65 72 20 74 68   How to order th
baf0: 65 20 72 6f 77 73 2c 20 66 6f 72 6d 61 74 74 65  e rows, formatte
bb00: 64 20 61 73 20 61 6e 20 53 51 4c 20 4f 52 44 45  d as an SQL ORDE
bb10: 52 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20  R BY clause.    
bb20: 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 28 65   *            (e
bb30: 78 63 6c 75 64 69 6e 67 20 74 68 65 20 4f 52 44  xcluding the ORD
bb40: 45 52 20 42 59 20 69 74 73 65 6c 66 29 2e 20 50  ER BY itself). P
bb50: 61 73 73 69 6e 67 20 6e 75 6c 6c 20 77 69 6c 6c  assing null will
bb60: 20 75 73 65 20 74 68 65 0a 20 20 20 20 20 2a 20   use the.     * 
bb70: 20 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75             defau
bb80: 6c 74 20 73 6f 72 74 20 6f 72 64 65 72 2c 20 77  lt sort order, w
bb90: 68 69 63 68 20 6d 61 79 20 62 65 20 75 6e 6f 72  hich may be unor
bba0: 64 65 72 65 64 2e 0a 20 20 20 20 20 2a 20 40 70  dered..     * @p
bbb0: 61 72 61 6d 20 6c 69 6d 69 74 20 4c 69 6d 69 74  aram limit Limit
bbc0: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
bbd0: 72 6f 77 73 20 72 65 74 75 72 6e 65 64 20 62 79  rows returned by
bbe0: 20 74 68 65 20 71 75 65 72 79 2c 0a 20 20 20 20   the query,.    
bbf0: 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f   *            fo
bc00: 72 6d 61 74 74 65 64 20 61 73 20 4c 49 4d 49 54  rmatted as LIMIT
bc10: 20 63 6c 61 75 73 65 2e 20 50 61 73 73 69 6e 67   clause. Passing
bc20: 20 6e 75 6c 6c 20 64 65 6e 6f 74 65 73 20 6e 6f   null denotes no
bc30: 20 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 0a 20   LIMIT clause.. 
bc40: 20 20 20 20 2a 20 40 70 61 72 61 6d 20 63 61 6e      * @param can
bc50: 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 20  cellationSignal 
bc60: 41 20 73 69 67 6e 61 6c 20 74 6f 20 63 61 6e 63  A signal to canc
bc70: 65 6c 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  el the operation
bc80: 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 6f 72   in progress, or
bc90: 20 6e 75 6c 6c 20 69 66 20 6e 6f 6e 65 2e 0a 20   null if none.. 
bca0: 20 20 20 20 2a 20 49 66 20 74 68 65 20 6f 70 65      * If the ope
bcb0: 72 61 74 69 6f 6e 20 69 73 20 63 61 6e 63 65 6c  ration is cancel
bcc0: 65 64 2c 20 74 68 65 6e 20 7b 40 6c 69 6e 6b 20  ed, then {@link 
bcd0: 4f 70 65 72 61 74 69 6f 6e 43 61 6e 63 65 6c 65  OperationCancele
bce0: 64 45 78 63 65 70 74 69 6f 6e 7d 20 77 69 6c 6c  dException} will
bcf0: 20 62 65 20 74 68 72 6f 77 6e 0a 20 20 20 20 20   be thrown.     
bd00: 2a 20 77 68 65 6e 20 74 68 65 20 71 75 65 72 79  * when the query
bd10: 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20   is executed..  
bd20: 20 20 20 2a 20 40 72 65 74 75 72 6e 20 41 20 7b     * @return A {
bd30: 40 6c 69 6e 6b 20 43 75 72 73 6f 72 7d 20 6f 62  @link Cursor} ob
bd40: 6a 65 63 74 2c 20 77 68 69 63 68 20 69 73 20 70  ject, which is p
bd50: 6f 73 69 74 69 6f 6e 65 64 20 62 65 66 6f 72 65  ositioned before
bd60: 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
bd70: 2e 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20  . Note that.    
bd80: 20 2a 20 7b 40 6c 69 6e 6b 20 43 75 72 73 6f 72   * {@link Cursor
bd90: 7d 73 20 61 72 65 20 6e 6f 74 20 73 79 6e 63 68  }s are not synch
bda0: 72 6f 6e 69 7a 65 64 2c 20 73 65 65 20 74 68 65  ronized, see the
bdb0: 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66   documentation f
bdc0: 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e  or more details.
bdd0: 0a 20 20 20 20 20 2a 20 40 73 65 65 20 43 75 72  .     * @see Cur
bde0: 73 6f 72 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  sor.     */.    
bdf0: 70 75 62 6c 69 63 20 43 75 72 73 6f 72 20 71 75  public Cursor qu
be00: 65 72 79 57 69 74 68 46 61 63 74 6f 72 79 28 43  eryWithFactory(C
be10: 75 72 73 6f 72 46 61 63 74 6f 72 79 20 63 75 72  ursorFactory cur
be20: 73 6f 72 46 61 63 74 6f 72 79 2c 0a 20 20 20 20  sorFactory,.    
be30: 20 20 20 20 20 20 20 20 62 6f 6f 6c 65 61 6e 20          boolean 
be40: 64 69 73 74 69 6e 63 74 2c 20 53 74 72 69 6e 67  distinct, String
be50: 20 74 61 62 6c 65 2c 20 53 74 72 69 6e 67 5b 5d   table, String[]
be60: 20 63 6f 6c 75 6d 6e 73 2c 0a 20 20 20 20 20 20   columns,.      
be70: 20 20 20 20 20 20 53 74 72 69 6e 67 20 73 65 6c        String sel
be80: 65 63 74 69 6f 6e 2c 20 53 74 72 69 6e 67 5b 5d  ection, String[]
be90: 20 73 65 6c 65 63 74 69 6f 6e 41 72 67 73 2c 20   selectionArgs, 
bea0: 53 74 72 69 6e 67 20 67 72 6f 75 70 42 79 2c 0a  String groupBy,.
beb0: 20 20 20 20 20 20 20 20 20 20 20 20 53 74 72 69              Stri
bec0: 6e 67 20 68 61 76 69 6e 67 2c 20 53 74 72 69 6e  ng having, Strin
bed0: 67 20 6f 72 64 65 72 42 79 2c 20 53 74 72 69 6e  g orderBy, Strin
bee0: 67 20 6c 69 6d 69 74 2c 20 43 61 6e 63 65 6c 6c  g limit, Cancell
bef0: 61 74 69 6f 6e 53 69 67 6e 61 6c 20 63 61 6e 63  ationSignal canc
bf00: 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 29 20  ellationSignal) 
bf10: 7b 0a 20 20 20 20 20 20 20 20 61 63 71 75 69 72  {.        acquir
bf20: 65 52 65 66 65 72 65 6e 63 65 28 29 3b 0a 20 20  eReference();.  
bf30: 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20        try {.    
bf40: 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 20 73          String s
bf50: 71 6c 20 3d 20 53 51 4c 69 74 65 51 75 65 72 79  ql = SQLiteQuery
bf60: 42 75 69 6c 64 65 72 2e 62 75 69 6c 64 51 75 65  Builder.buildQue
bf70: 72 79 53 74 72 69 6e 67 28 0a 20 20 20 20 20 20  ryString(.      
bf80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
bf90: 73 74 69 6e 63 74 2c 20 74 61 62 6c 65 2c 20 63  stinct, table, c
bfa0: 6f 6c 75 6d 6e 73 2c 20 73 65 6c 65 63 74 69 6f  olumns, selectio
bfb0: 6e 2c 20 67 72 6f 75 70 42 79 2c 20 68 61 76 69  n, groupBy, havi
bfc0: 6e 67 2c 20 6f 72 64 65 72 42 79 2c 20 6c 69 6d  ng, orderBy, lim
bfd0: 69 74 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  it);..          
bfe0: 20 20 72 65 74 75 72 6e 20 72 61 77 51 75 65 72    return rawQuer
bff0: 79 57 69 74 68 46 61 63 74 6f 72 79 28 63 75 72  yWithFactory(cur
c000: 73 6f 72 46 61 63 74 6f 72 79 2c 20 73 71 6c 2c  sorFactory, sql,
c010: 20 73 65 6c 65 63 74 69 6f 6e 41 72 67 73 2c 0a   selectionArgs,.
c020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c030: 20 20 20 20 66 69 6e 64 45 64 69 74 54 61 62 6c      findEditTabl
c040: 65 28 74 61 62 6c 65 29 2c 20 63 61 6e 63 65 6c  e(table), cancel
c050: 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 29 3b 0a 20  lationSignal);. 
c060: 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79         } finally
c070: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72   {.            r
c080: 65 6c 65 61 73 65 52 65 66 65 72 65 6e 63 65 28  eleaseReference(
c090: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
c0a0: 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20   }..    /**.    
c0b0: 20 2a 20 51 75 65 72 79 20 74 68 65 20 67 69 76   * Query the giv
c0c0: 65 6e 20 74 61 62 6c 65 2c 20 72 65 74 75 72 6e  en table, return
c0d0: 69 6e 67 20 61 20 7b 40 6c 69 6e 6b 20 43 75 72  ing a {@link Cur
c0e0: 73 6f 72 7d 20 6f 76 65 72 20 74 68 65 20 72 65  sor} over the re
c0f0: 73 75 6c 74 20 73 65 74 2e 0a 20 20 20 20 20 2a  sult set..     *
c100: 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 74  .     * @param t
c110: 61 62 6c 65 20 54 68 65 20 74 61 62 6c 65 20 6e  able The table n
c120: 61 6d 65 20 74 6f 20 63 6f 6d 70 69 6c 65 20 74  ame to compile t
c130: 68 65 20 71 75 65 72 79 20 61 67 61 69 6e 73 74  he query against
c140: 2e 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20  ..     * @param 
c150: 63 6f 6c 75 6d 6e 73 20 41 20 6c 69 73 74 20 6f  columns A list o
c160: 66 20 77 68 69 63 68 20 63 6f 6c 75 6d 6e 73 20  f which columns 
c170: 74 6f 20 72 65 74 75 72 6e 2e 20 50 61 73 73 69  to return. Passi
c180: 6e 67 20 6e 75 6c 6c 20 77 69 6c 6c 0a 20 20 20  ng null will.   
c190: 20 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 72    *            r
c1a0: 65 74 75 72 6e 20 61 6c 6c 20 63 6f 6c 75 6d 6e  eturn all column
c1b0: 73 2c 20 77 68 69 63 68 20 69 73 20 64 69 73 63  s, which is disc
c1c0: 6f 75 72 61 67 65 64 20 74 6f 20 70 72 65 76 65  ouraged to preve
c1d0: 6e 74 20 72 65 61 64 69 6e 67 0a 20 20 20 20 20  nt reading.     
c1e0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 64 61 74  *            dat
c1f0: 61 20 66 72 6f 6d 20 73 74 6f 72 61 67 65 20 74  a from storage t
c200: 68 61 74 20 69 73 6e 27 74 20 67 6f 69 6e 67 20  hat isn't going 
c210: 74 6f 20 62 65 20 75 73 65 64 2e 0a 20 20 20 20  to be used..    
c220: 20 2a 20 40 70 61 72 61 6d 20 73 65 6c 65 63 74   * @param select
c230: 69 6f 6e 20 41 20 66 69 6c 74 65 72 20 64 65 63  ion A filter dec
c240: 6c 61 72 69 6e 67 20 77 68 69 63 68 20 72 6f 77  laring which row
c250: 73 20 74 6f 20 72 65 74 75 72 6e 2c 20 66 6f 72  s to return, for
c260: 6d 61 74 74 65 64 20 61 73 20 61 6e 0a 20 20 20  matted as an.   
c270: 20 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 53    *            S
c280: 51 4c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  QL WHERE clause 
c290: 28 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20 57  (excluding the W
c2a0: 48 45 52 45 20 69 74 73 65 6c 66 29 2e 20 50 61  HERE itself). Pa
c2b0: 73 73 69 6e 67 20 6e 75 6c 6c 0a 20 20 20 20 20  ssing null.     
c2c0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6c  *            wil
c2d0: 6c 20 72 65 74 75 72 6e 20 61 6c 6c 20 72 6f 77  l return all row
c2e0: 73 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20  s for the given 
c2f0: 74 61 62 6c 65 2e 0a 20 20 20 20 20 2a 20 40 70  table..     * @p
c300: 61 72 61 6d 20 73 65 6c 65 63 74 69 6f 6e 41 72  aram selectionAr
c310: 67 73 20 59 6f 75 20 6d 61 79 20 69 6e 63 6c 75  gs You may inclu
c320: 64 65 20 3f 73 20 69 6e 20 73 65 6c 65 63 74 69  de ?s in selecti
c330: 6f 6e 2c 20 77 68 69 63 68 20 77 69 6c 6c 20 62  on, which will b
c340: 65 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20 20  e.     *        
c350: 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65   replaced by the
c360: 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 73 65 6c   values from sel
c370: 65 63 74 69 6f 6e 41 72 67 73 2c 20 69 6e 20 6f  ectionArgs, in o
c380: 72 64 65 72 20 74 68 61 74 20 74 68 65 79 0a 20  rder that they. 
c390: 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 61 70      *         ap
c3a0: 70 65 61 72 20 69 6e 20 74 68 65 20 73 65 6c 65  pear in the sele
c3b0: 63 74 69 6f 6e 2e 20 54 68 65 20 76 61 6c 75 65  ction. The value
c3c0: 73 20 77 69 6c 6c 20 62 65 20 62 6f 75 6e 64 20  s will be bound 
c3d0: 61 73 20 53 74 72 69 6e 67 73 2e 0a 20 20 20 20  as Strings..    
c3e0: 20 2a 20 40 70 61 72 61 6d 20 67 72 6f 75 70 42   * @param groupB
c3f0: 79 20 41 20 66 69 6c 74 65 72 20 64 65 63 6c 61  y A filter decla
c400: 72 69 6e 67 20 68 6f 77 20 74 6f 20 67 72 6f 75  ring how to grou
c410: 70 20 72 6f 77 73 2c 20 66 6f 72 6d 61 74 74 65  p rows, formatte
c420: 64 20 61 73 20 61 6e 20 53 51 4c 0a 20 20 20 20  d as an SQL.    
c430: 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 47 52   *            GR
c440: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 28 65  OUP BY clause (e
c450: 78 63 6c 75 64 69 6e 67 20 74 68 65 20 47 52 4f  xcluding the GRO
c460: 55 50 20 42 59 20 69 74 73 65 6c 66 29 2e 20 50  UP BY itself). P
c470: 61 73 73 69 6e 67 20 6e 75 6c 6c 0a 20 20 20 20  assing null.    
c480: 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 77 69   *            wi
c490: 6c 6c 20 63 61 75 73 65 20 74 68 65 20 72 6f 77  ll cause the row
c4a0: 73 20 74 6f 20 6e 6f 74 20 62 65 20 67 72 6f 75  s to not be grou
c4b0: 70 65 64 2e 0a 20 20 20 20 20 2a 20 40 70 61 72  ped..     * @par
c4c0: 61 6d 20 68 61 76 69 6e 67 20 41 20 66 69 6c 74  am having A filt
c4d0: 65 72 20 64 65 63 6c 61 72 65 20 77 68 69 63 68  er declare which
c4e0: 20 72 6f 77 20 67 72 6f 75 70 73 20 74 6f 20 69   row groups to i
c4f0: 6e 63 6c 75 64 65 20 69 6e 20 74 68 65 20 63 75  nclude in the cu
c500: 72 73 6f 72 2c 0a 20 20 20 20 20 2a 20 20 20 20  rsor,.     *    
c510: 20 20 20 20 20 20 20 20 69 66 20 72 6f 77 20 67          if row g
c520: 72 6f 75 70 69 6e 67 20 69 73 20 62 65 69 6e 67  rouping is being
c530: 20 75 73 65 64 2c 20 66 6f 72 6d 61 74 74 65 64   used, formatted
c540: 20 61 73 20 61 6e 20 53 51 4c 20 48 41 56 49 4e   as an SQL HAVIN
c550: 47 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20 20  G.     *        
c560: 20 20 20 20 63 6c 61 75 73 65 20 28 65 78 63 6c      clause (excl
c570: 75 64 69 6e 67 20 74 68 65 20 48 41 56 49 4e 47  uding the HAVING
c580: 20 69 74 73 65 6c 66 29 2e 20 50 61 73 73 69 6e   itself). Passin
c590: 67 20 6e 75 6c 6c 20 77 69 6c 6c 20 63 61 75 73  g null will caus
c5a0: 65 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20 20  e.     *        
c5b0: 20 20 20 20 61 6c 6c 20 72 6f 77 20 67 72 6f 75      all row grou
c5c0: 70 73 20 74 6f 20 62 65 20 69 6e 63 6c 75 64 65  ps to be include
c5d0: 64 2c 20 61 6e 64 20 69 73 20 72 65 71 75 69 72  d, and is requir
c5e0: 65 64 20 77 68 65 6e 20 72 6f 77 0a 20 20 20 20  ed when row.    
c5f0: 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 67 72   *            gr
c600: 6f 75 70 69 6e 67 20 69 73 20 6e 6f 74 20 62 65  ouping is not be
c610: 69 6e 67 20 75 73 65 64 2e 0a 20 20 20 20 20 2a  ing used..     *
c620: 20 40 70 61 72 61 6d 20 6f 72 64 65 72 42 79 20   @param orderBy 
c630: 48 6f 77 20 74 6f 20 6f 72 64 65 72 20 74 68 65  How to order the
c640: 20 72 6f 77 73 2c 20 66 6f 72 6d 61 74 74 65 64   rows, formatted
c650: 20 61 73 20 61 6e 20 53 51 4c 20 4f 52 44 45 52   as an SQL ORDER
c660: 20 42 59 20 63 6c 61 75 73 65 0a 20 20 20 20 20   BY clause.     
c670: 2a 20 20 20 20 20 20 20 20 20 20 20 20 28 65 78  *            (ex
c680: 63 6c 75 64 69 6e 67 20 74 68 65 20 4f 52 44 45  cluding the ORDE
c690: 52 20 42 59 20 69 74 73 65 6c 66 29 2e 20 50 61  R BY itself). Pa
c6a0: 73 73 69 6e 67 20 6e 75 6c 6c 20 77 69 6c 6c 20  ssing null will 
c6b0: 75 73 65 20 74 68 65 0a 20 20 20 20 20 2a 20 20  use the.     *  
c6c0: 20 20 20 20 20 20 20 20 20 20 64 65 66 61 75 6c            defaul
c6d0: 74 20 73 6f 72 74 20 6f 72 64 65 72 2c 20 77 68  t sort order, wh
c6e0: 69 63 68 20 6d 61 79 20 62 65 20 75 6e 6f 72 64  ich may be unord
c6f0: 65 72 65 64 2e 0a 20 20 20 20 20 2a 20 40 72 65  ered..     * @re
c700: 74 75 72 6e 20 41 20 7b 40 6c 69 6e 6b 20 43 75  turn A {@link Cu
c710: 72 73 6f 72 7d 20 6f 62 6a 65 63 74 2c 20 77 68  rsor} object, wh
c720: 69 63 68 20 69 73 20 70 6f 73 69 74 69 6f 6e 65  ich is positione
c730: 64 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72  d before the fir
c740: 73 74 20 65 6e 74 72 79 2e 20 4e 6f 74 65 20 74  st entry. Note t
c750: 68 61 74 0a 20 20 20 20 20 2a 20 7b 40 6c 69 6e  hat.     * {@lin
c760: 6b 20 43 75 72 73 6f 72 7d 73 20 61 72 65 20 6e  k Cursor}s are n
c770: 6f 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 2c  ot synchronized,
c780: 20 73 65 65 20 74 68 65 20 64 6f 63 75 6d 65 6e   see the documen
c790: 74 61 74 69 6f 6e 20 66 6f 72 20 6d 6f 72 65 20  tation for more 
c7a0: 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 2a 20  details..     * 
c7b0: 40 73 65 65 20 43 75 72 73 6f 72 0a 20 20 20 20  @see Cursor.    
c7c0: 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20 43   */.    public C
c7d0: 75 72 73 6f 72 20 71 75 65 72 79 28 53 74 72 69  ursor query(Stri
c7e0: 6e 67 20 74 61 62 6c 65 2c 20 53 74 72 69 6e 67  ng table, String
c7f0: 5b 5d 20 63 6f 6c 75 6d 6e 73 2c 20 53 74 72 69  [] columns, Stri
c800: 6e 67 20 73 65 6c 65 63 74 69 6f 6e 2c 0a 20 20  ng selection,.  
c810: 20 20 20 20 20 20 20 20 20 20 53 74 72 69 6e 67            String
c820: 5b 5d 20 73 65 6c 65 63 74 69 6f 6e 41 72 67 73  [] selectionArgs
c830: 2c 20 53 74 72 69 6e 67 20 67 72 6f 75 70 42 79  , String groupBy
c840: 2c 20 53 74 72 69 6e 67 20 68 61 76 69 6e 67 2c  , String having,
c850: 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 74 72  .            Str
c860: 69 6e 67 20 6f 72 64 65 72 42 79 29 20 7b 0a 0a  ing orderBy) {..
c870: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 71          return q
c880: 75 65 72 79 28 66 61 6c 73 65 2c 20 74 61 62 6c  uery(false, tabl
c890: 65 2c 20 63 6f 6c 75 6d 6e 73 2c 20 73 65 6c 65  e, columns, sele
c8a0: 63 74 69 6f 6e 2c 20 73 65 6c 65 63 74 69 6f 6e  ction, selection
c8b0: 41 72 67 73 2c 20 67 72 6f 75 70 42 79 2c 0a 20  Args, groupBy,. 
c8c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68                 h
c8d0: 61 76 69 6e 67 2c 20 6f 72 64 65 72 42 79 2c 20  aving, orderBy, 
c8e0: 6e 75 6c 6c 20 2f 2a 20 6c 69 6d 69 74 20 2a 2f  null /* limit */
c8f0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
c900: 2a 0a 20 20 20 20 20 2a 20 51 75 65 72 79 20 74  *.     * Query t
c910: 68 65 20 67 69 76 65 6e 20 74 61 62 6c 65 2c 20  he given table, 
c920: 72 65 74 75 72 6e 69 6e 67 20 61 20 7b 40 6c 69  returning a {@li
c930: 6e 6b 20 43 75 72 73 6f 72 7d 20 6f 76 65 72 20  nk Cursor} over 
c940: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
c950: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 70       *.     * @p
c960: 61 72 61 6d 20 74 61 62 6c 65 20 54 68 65 20 74  aram table The t
c970: 61 62 6c 65 20 6e 61 6d 65 20 74 6f 20 63 6f 6d  able name to com
c980: 70 69 6c 65 20 74 68 65 20 71 75 65 72 79 20 61  pile the query a
c990: 67 61 69 6e 73 74 2e 0a 20 20 20 20 20 2a 20 40  gainst..     * @
c9a0: 70 61 72 61 6d 20 63 6f 6c 75 6d 6e 73 20 41 20  param columns A 
c9b0: 6c 69 73 74 20 6f 66 20 77 68 69 63 68 20 63 6f  list of which co
c9c0: 6c 75 6d 6e 73 20 74 6f 20 72 65 74 75 72 6e 2e  lumns to return.
c9d0: 20 50 61 73 73 69 6e 67 20 6e 75 6c 6c 20 77 69   Passing null wi
c9e0: 6c 6c 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20  ll.     *       
c9f0: 20 20 20 20 20 72 65 74 75 72 6e 20 61 6c 6c 20       return all 
ca00: 63 6f 6c 75 6d 6e 73 2c 20 77 68 69 63 68 20 69  columns, which i
ca10: 73 20 64 69 73 63 6f 75 72 61 67 65 64 20 74 6f  s discouraged to
ca20: 20 70 72 65 76 65 6e 74 20 72 65 61 64 69 6e 67   prevent reading
ca30: 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20  .     *         
ca40: 20 20 20 64 61 74 61 20 66 72 6f 6d 20 73 74 6f     data from sto
ca50: 72 61 67 65 20 74 68 61 74 20 69 73 6e 27 74 20  rage that isn't 
ca60: 67 6f 69 6e 67 20 74 6f 20 62 65 20 75 73 65 64  going to be used
ca70: 2e 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20  ..     * @param 
ca80: 73 65 6c 65 63 74 69 6f 6e 20 41 20 66 69 6c 74  selection A filt
ca90: 65 72 20 64 65 63 6c 61 72 69 6e 67 20 77 68 69  er declaring whi
caa0: 63 68 20 72 6f 77 73 20 74 6f 20 72 65 74 75 72  ch rows to retur
cab0: 6e 2c 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20  n, formatted as 
cac0: 61 6e 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20  an.     *       
cad0: 20 20 20 20 20 53 51 4c 20 57 48 45 52 45 20 63       SQL WHERE c
cae0: 6c 61 75 73 65 20 28 65 78 63 6c 75 64 69 6e 67  lause (excluding
caf0: 20 74 68 65 20 57 48 45 52 45 20 69 74 73 65 6c   the WHERE itsel
cb00: 66 29 2e 20 50 61 73 73 69 6e 67 20 6e 75 6c 6c  f). Passing null
cb10: 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20  .     *         
cb20: 20 20 20 77 69 6c 6c 20 72 65 74 75 72 6e 20 61     will return a
cb30: 6c 6c 20 72 6f 77 73 20 66 6f 72 20 74 68 65 20  ll rows for the 
cb40: 67 69 76 65 6e 20 74 61 62 6c 65 2e 0a 20 20 20  given table..   
cb50: 20 20 2a 20 40 70 61 72 61 6d 20 73 65 6c 65 63    * @param selec
cb60: 74 69 6f 6e 41 72 67 73 20 59 6f 75 20 6d 61 79  tionArgs You may
cb70: 20 69 6e 63 6c 75 64 65 20 3f 73 20 69 6e 20 73   include ?s in s
cb80: 65 6c 65 63 74 69 6f 6e 2c 20 77 68 69 63 68 20  election, which 
cb90: 77 69 6c 6c 20 62 65 0a 20 20 20 20 20 2a 20 20  will be.     *  
cba0: 20 20 20 20 20 20 20 72 65 70 6c 61 63 65 64 20         replaced 
cbb0: 62 79 20 74 68 65 20 76 61 6c 75 65 73 20 66 72  by the values fr
cbc0: 6f 6d 20 73 65 6c 65 63 74 69 6f 6e 41 72 67 73  om selectionArgs
cbd0: 2c 20 69 6e 20 6f 72 64 65 72 20 74 68 61 74 20  , in order that 
cbe0: 74 68 65 79 0a 20 20 20 20 20 2a 20 20 20 20 20  they.     *     
cbf0: 20 20 20 20 61 70 70 65 61 72 20 69 6e 20 74 68      appear in th
cc00: 65 20 73 65 6c 65 63 74 69 6f 6e 2e 20 54 68 65  e selection. The
cc10: 20 76 61 6c 75 65 73 20 77 69 6c 6c 20 62 65 20   values will be 
cc20: 62 6f 75 6e 64 20 61 73 20 53 74 72 69 6e 67 73  bound as Strings
cc30: 2e 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20  ..     * @param 
cc40: 67 72 6f 75 70 42 79 20 41 20 66 69 6c 74 65 72  groupBy A filter
cc50: 20 64 65 63 6c 61 72 69 6e 67 20 68 6f 77 20 74   declaring how t
cc60: 6f 20 67 72 6f 75 70 20 72 6f 77 73 2c 20 66 6f  o group rows, fo
cc70: 72 6d 61 74 74 65 64 20 61 73 20 61 6e 20 53 51  rmatted as an SQ
cc80: 4c 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20 20  L.     *        
cc90: 20 20 20 20 47 52 4f 55 50 20 42 59 20 63 6c 61      GROUP BY cla
cca0: 75 73 65 20 28 65 78 63 6c 75 64 69 6e 67 20 74  use (excluding t
ccb0: 68 65 20 47 52 4f 55 50 20 42 59 20 69 74 73 65  he GROUP BY itse
ccc0: 6c 66 29 2e 20 50 61 73 73 69 6e 67 20 6e 75 6c  lf). Passing nul
ccd0: 6c 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20 20  l.     *        
cce0: 20 20 20 20 77 69 6c 6c 20 63 61 75 73 65 20 74      will cause t
ccf0: 68 65 20 72 6f 77 73 20 74 6f 20 6e 6f 74 20 62  he rows to not b
cd00: 65 20 67 72 6f 75 70 65 64 2e 0a 20 20 20 20 20  e grouped..     
cd10: 2a 20 40 70 61 72 61 6d 20 68 61 76 69 6e 67 20  * @param having 
cd20: 41 20 66 69 6c 74 65 72 20 64 65 63 6c 61 72 65  A filter declare
cd30: 20 77 68 69 63 68 20 72 6f 77 20 67 72 6f 75 70   which row group
cd40: 73 20 74 6f 20 69 6e 63 6c 75 64 65 20 69 6e 20  s to include in 
cd50: 74 68 65 20 63 75 72 73 6f 72 2c 0a 20 20 20 20  the cursor,.    
cd60: 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 69 66   *            if
cd70: 20 72 6f 77 20 67 72 6f 75 70 69 6e 67 20 69 73   row grouping is
cd80: 20 62 65 69 6e 67 20 75 73 65 64 2c 20 66 6f 72   being used, for
cd90: 6d 61 74 74 65 64 20 61 73 20 61 6e 20 53 51 4c  matted as an SQL
cda0: 20 48 41 56 49 4e 47 0a 20 20 20 20 20 2a 20 20   HAVING.     *  
cdb0: 20 20 20 20 20 20 20 20 20 20 63 6c 61 75 73 65            clause
cdc0: 20 28 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20   (excluding the 
cdd0: 48 41 56 49 4e 47 20 69 74 73 65 6c 66 29 2e 20  HAVING itself). 
cde0: 50 61 73 73 69 6e 67 20 6e 75 6c 6c 20 77 69 6c  Passing null wil
cdf0: 6c 20 63 61 75 73 65 0a 20 20 20 20 20 2a 20 20  l cause.     *  
ce00: 20 20 20 20 20 20 20 20 20 20 61 6c 6c 20 72 6f            all ro
ce10: 77 20 67 72 6f 75 70 73 20 74 6f 20 62 65 20 69  w groups to be i
ce20: 6e 63 6c 75 64 65 64 2c 20 61 6e 64 20 69 73 20  ncluded, and is 
ce30: 72 65 71 75 69 72 65 64 20 77 68 65 6e 20 72 6f  required when ro
ce40: 77 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20 20  w.     *        
ce50: 20 20 20 20 67 72 6f 75 70 69 6e 67 20 69 73 20      grouping is 
ce60: 6e 6f 74 20 62 65 69 6e 67 20 75 73 65 64 2e 0a  not being used..
ce70: 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 6f 72       * @param or
ce80: 64 65 72 42 79 20 48 6f 77 20 74 6f 20 6f 72 64  derBy How to ord
ce90: 65 72 20 74 68 65 20 72 6f 77 73 2c 20 66 6f 72  er the rows, for
cea0: 6d 61 74 74 65 64 20 61 73 20 61 6e 20 53 51 4c  matted as an SQL
ceb0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
cec0: 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20  .     *         
ced0: 20 20 20 28 65 78 63 6c 75 64 69 6e 67 20 74 68     (excluding th
cee0: 65 20 4f 52 44 45 52 20 42 59 20 69 74 73 65 6c  e ORDER BY itsel
cef0: 66 29 2e 20 50 61 73 73 69 6e 67 20 6e 75 6c 6c  f). Passing null
cf00: 20 77 69 6c 6c 20 75 73 65 20 74 68 65 0a 20 20   will use the.  
cf10: 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20 20     *            
cf20: 64 65 66 61 75 6c 74 20 73 6f 72 74 20 6f 72 64  default sort ord
cf30: 65 72 2c 20 77 68 69 63 68 20 6d 61 79 20 62 65  er, which may be
cf40: 20 75 6e 6f 72 64 65 72 65 64 2e 0a 20 20 20 20   unordered..    
cf50: 20 2a 20 40 70 61 72 61 6d 20 6c 69 6d 69 74 20   * @param limit 
cf60: 4c 69 6d 69 74 73 20 74 68 65 20 6e 75 6d 62 65  Limits the numbe
cf70: 72 20 6f 66 20 72 6f 77 73 20 72 65 74 75 72 6e  r of rows return
cf80: 65 64 20 62 79 20 74 68 65 20 71 75 65 72 79 2c  ed by the query,
cf90: 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20  .     *         
cfa0: 20 20 20 66 6f 72 6d 61 74 74 65 64 20 61 73 20     formatted as 
cfb0: 4c 49 4d 49 54 20 63 6c 61 75 73 65 2e 20 50 61  LIMIT clause. Pa
cfc0: 73 73 69 6e 67 20 6e 75 6c 6c 20 64 65 6e 6f 74  ssing null denot
cfd0: 65 73 20 6e 6f 20 4c 49 4d 49 54 20 63 6c 61 75  es no LIMIT clau
cfe0: 73 65 2e 0a 20 20 20 20 20 2a 20 40 72 65 74 75  se..     * @retu
cff0: 72 6e 20 41 20 7b 40 6c 69 6e 6b 20 43 75 72 73  rn A {@link Curs
d000: 6f 72 7d 20 6f 62 6a 65 63 74 2c 20 77 68 69 63  or} object, whic
d010: 68 20 69 73 20 70 6f 73 69 74 69 6f 6e 65 64 20  h is positioned 
d020: 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74  before the first
d030: 20 65 6e 74 72 79 2e 20 4e 6f 74 65 20 74 68 61   entry. Note tha
d040: 74 0a 20 20 20 20 20 2a 20 7b 40 6c 69 6e 6b 20  t.     * {@link 
d050: 43 75 72 73 6f 72 7d 73 20 61 72 65 20 6e 6f 74  Cursor}s are not
d060: 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 2c 20 73   synchronized, s
d070: 65 65 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61  ee the documenta
d080: 74 69 6f 6e 20 66 6f 72 20 6d 6f 72 65 20 64 65  tion for more de
d090: 74 61 69 6c 73 2e 0a 20 20 20 20 20 2a 20 40 73  tails..     * @s
d0a0: 65 65 20 43 75 72 73 6f 72 0a 20 20 20 20 20 2a  ee Cursor.     *
d0b0: 2f 0a 20 20 20 20 70 75 62 6c 69 63 20 43 75 72  /.    public Cur
d0c0: 73 6f 72 20 71 75 65 72 79 28 53 74 72 69 6e 67  sor query(String
d0d0: 20 74 61 62 6c 65 2c 20 53 74 72 69 6e 67 5b 5d   table, String[]
d0e0: 20 63 6f 6c 75 6d 6e 73 2c 20 53 74 72 69 6e 67   columns, String
d0f0: 20 73 65 6c 65 63 74 69 6f 6e 2c 0a 20 20 20 20   selection,.    
d100: 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 5b 5d          String[]
d110: 20 73 65 6c 65 63 74 69 6f 6e 41 72 67 73 2c 20   selectionArgs, 
d120: 53 74 72 69 6e 67 20 67 72 6f 75 70 42 79 2c 20  String groupBy, 
d130: 53 74 72 69 6e 67 20 68 61 76 69 6e 67 2c 0a 20  String having,. 
d140: 20 20 20 20 20 20 20 20 20 20 20 53 74 72 69 6e             Strin
d150: 67 20 6f 72 64 65 72 42 79 2c 20 53 74 72 69 6e  g orderBy, Strin
d160: 67 20 6c 69 6d 69 74 29 20 7b 0a 0a 20 20 20 20  g limit) {..    
d170: 20 20 20 20 72 65 74 75 72 6e 20 71 75 65 72 79      return query
d180: 28 66 61 6c 73 65 2c 20 74 61 62 6c 65 2c 20 63  (false, table, c
d190: 6f 6c 75 6d 6e 73 2c 20 73 65 6c 65 63 74 69 6f  olumns, selectio
d1a0: 6e 2c 20 73 65 6c 65 63 74 69 6f 6e 41 72 67 73  n, selectionArgs
d1b0: 2c 20 67 72 6f 75 70 42 79 2c 0a 20 20 20 20 20  , groupBy,.     
d1c0: 20 20 20 20 20 20 20 20 20 20 20 68 61 76 69 6e             havin
d1d0: 67 2c 20 6f 72 64 65 72 42 79 2c 20 6c 69 6d 69  g, orderBy, limi
d1e0: 74 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  t);.    }..    /
d1f0: 2a 2a 0a 20 20 20 20 20 2a 20 52 75 6e 73 20 74  **.     * Runs t
d200: 68 65 20 70 72 6f 76 69 64 65 64 20 53 51 4c 20  he provided SQL 
d210: 61 6e 64 20 72 65 74 75 72 6e 73 20 61 20 7b 40  and returns a {@
d220: 6c 69 6e 6b 20 43 75 72 73 6f 72 7d 20 6f 76 65  link Cursor} ove
d230: 72 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  r the result set
d240: 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20  ..     *.     * 
d250: 40 70 61 72 61 6d 20 73 71 6c 20 74 68 65 20 53  @param sql the S
d260: 51 4c 20 71 75 65 72 79 2e 20 54 68 65 20 53 51  QL query. The SQ
d270: 4c 20 73 74 72 69 6e 67 20 6d 75 73 74 20 6e 6f  L string must no
d280: 74 20 62 65 20 3b 20 74 65 72 6d 69 6e 61 74 65  t be ; terminate
d290: 64 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20  d.     * @param 
d2a0: 73 65 6c 65 63 74 69 6f 6e 41 72 67 73 20 59 6f  selectionArgs Yo
d2b0: 75 20 6d 61 79 20 69 6e 63 6c 75 64 65 20 3f 73  u may include ?s
d2c0: 20 69 6e 20 77 68 65 72 65 20 63 6c 61 75 73 65   in where clause
d2d0: 20 69 6e 20 74 68 65 20 71 75 65 72 79 2c 0a 20   in the query,. 
d2e0: 20 20 20 20 2a 20 20 20 20 20 77 68 69 63 68 20      *     which 
d2f0: 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64  will be replaced
d300: 20 62 79 20 74 68 65 20 76 61 6c 75 65 73 20 66   by the values f
d310: 72 6f 6d 20 73 65 6c 65 63 74 69 6f 6e 41 72 67  rom selectionArg
d320: 73 2e 20 54 68 65 0a 20 20 20 20 20 2a 20 20 20  s. The.     *   
d330: 20 20 76 61 6c 75 65 73 20 77 69 6c 6c 20 62 65    values will be
d340: 20 62 6f 75 6e 64 20 61 73 20 53 74 72 69 6e 67   bound as String
d350: 73 2e 0a 20 20 20 20 20 2a 20 40 72 65 74 75 72  s..     * @retur
d360: 6e 20 41 20 7b 40 6c 69 6e 6b 20 43 75 72 73 6f  n A {@link Curso
d370: 72 7d 20 6f 62 6a 65 63 74 2c 20 77 68 69 63 68  r} object, which
d380: 20 69 73 20 70 6f 73 69 74 69 6f 6e 65 64 20 62   is positioned b
d390: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
d3a0: 65 6e 74 72 79 2e 20 4e 6f 74 65 20 74 68 61 74  entry. Note that
d3b0: 0a 20 20 20 20 20 2a 20 7b 40 6c 69 6e 6b 20 43  .     * {@link C
d3c0: 75 72 73 6f 72 7d 73 20 61 72 65 20 6e 6f 74 20  ursor}s are not 
d3d0: 73 79 6e 63 68 72 6f 6e 69 7a 65 64 2c 20 73 65  synchronized, se
d3e0: 65 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74  e the documentat
d3f0: 69 6f 6e 20 66 6f 72 20 6d 6f 72 65 20 64 65 74  ion for more det
d400: 61 69 6c 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20  ails..     */.  
d410: 20 20 70 75 62 6c 69 63 20 43 75 72 73 6f 72 20    public Cursor 
d420: 72 61 77 51 75 65 72 79 28 53 74 72 69 6e 67 20  rawQuery(String 
d430: 73 71 6c 2c 20 53 74 72 69 6e 67 5b 5d 20 73 65  sql, String[] se
d440: 6c 65 63 74 69 6f 6e 41 72 67 73 29 20 7b 0a 20  lectionArgs) {. 
d450: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 72 61         return ra
d460: 77 51 75 65 72 79 57 69 74 68 46 61 63 74 6f 72  wQueryWithFactor
d470: 79 28 6e 75 6c 6c 2c 20 73 71 6c 2c 20 73 65 6c  y(null, sql, sel
d480: 65 63 74 69 6f 6e 41 72 67 73 2c 20 6e 75 6c 6c  ectionArgs, null
d490: 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 0a  , null);.    }..
d4a0: 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 52      /**.     * R
d4b0: 75 6e 73 20 74 68 65 20 70 72 6f 76 69 64 65 64  uns the provided
d4c0: 20 53 51 4c 20 61 6e 64 20 72 65 74 75 72 6e 73   SQL and returns
d4d0: 20 61 20 7b 40 6c 69 6e 6b 20 43 75 72 73 6f 72   a {@link Cursor
d4e0: 7d 20 6f 76 65 72 20 74 68 65 20 72 65 73 75 6c  } over the resul
d4f0: 74 20 73 65 74 2e 0a 20 20 20 20 20 2a 0a 20 20  t set..     *.  
d500: 20 20 20 2a 20 40 70 61 72 61 6d 20 73 71 6c 20     * @param sql 
d510: 74 68 65 20 53 51 4c 20 71 75 65 72 79 2e 20 54  the SQL query. T
d520: 68 65 20 53 51 4c 20 73 74 72 69 6e 67 20 6d 75  he SQL string mu
d530: 73 74 20 6e 6f 74 20 62 65 20 3b 20 74 65 72 6d  st not be ; term
d540: 69 6e 61 74 65 64 0a 20 20 20 20 20 2a 20 40 70  inated.     * @p
d550: 61 72 61 6d 20 73 65 6c 65 63 74 69 6f 6e 41 72  aram selectionAr
d560: 67 73 20 59 6f 75 20 6d 61 79 20 69 6e 63 6c 75  gs You may inclu
d570: 64 65 20 3f 73 20 69 6e 20 77 68 65 72 65 20 63  de ?s in where c
d580: 6c 61 75 73 65 20 69 6e 20 74 68 65 20 71 75 65  lause in the que
d590: 72 79 2c 0a 20 20 20 20 20 2a 20 20 20 20 20 77  ry,.     *     w
d5a0: 68 69 63 68 20 77 69 6c 6c 20 62 65 20 72 65 70  hich will be rep
d5b0: 6c 61 63 65 64 20 62 79 20 74 68 65 20 76 61 6c  laced by the val
d5c0: 75 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 69  ues from selecti
d5d0: 6f 6e 41 72 67 73 2e 20 54 68 65 0a 20 20 20 20  onArgs. The.    
d5e0: 20 2a 20 20 20 20 20 76 61 6c 75 65 73 20 77 69   *     values wi
d5f0: 6c 6c 20 62 65 20 62 6f 75 6e 64 20 61 73 20 53  ll be bound as S
d600: 74 72 69 6e 67 73 2e 0a 20 20 20 20 20 2a 20 40  trings..     * @
d610: 70 61 72 61 6d 20 63 61 6e 63 65 6c 6c 61 74 69  param cancellati
d620: 6f 6e 53 69 67 6e 61 6c 20 41 20 73 69 67 6e 61  onSignal A signa
d630: 6c 20 74 6f 20 63 61 6e 63 65 6c 20 74 68 65 20  l to cancel the 
d640: 6f 70 65 72 61 74 69 6f 6e 20 69 6e 20 70 72 6f  operation in pro
d650: 67 72 65 73 73 2c 20 6f 72 20 6e 75 6c 6c 20 69  gress, or null i
d660: 66 20 6e 6f 6e 65 2e 0a 20 20 20 20 20 2a 20 49  f none..     * I
d670: 66 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20  f the operation 
d680: 69 73 20 63 61 6e 63 65 6c 65 64 2c 20 74 68 65  is canceled, the
d690: 6e 20 7b 40 6c 69 6e 6b 20 4f 70 65 72 61 74 69  n {@link Operati
d6a0: 6f 6e 43 61 6e 63 65 6c 65 64 45 78 63 65 70 74  onCanceledExcept
d6b0: 69 6f 6e 7d 20 77 69 6c 6c 20 62 65 20 74 68 72  ion} will be thr
d6c0: 6f 77 6e 0a 20 20 20 20 20 2a 20 77 68 65 6e 20  own.     * when 
d6d0: 74 68 65 20 71 75 65 72 79 20 69 73 20 65 78 65  the query is exe
d6e0: 63 75 74 65 64 2e 0a 20 20 20 20 20 2a 20 40 72  cuted..     * @r
d6f0: 65 74 75 72 6e 20 41 20 7b 40 6c 69 6e 6b 20 43  eturn A {@link C
d700: 75 72 73 6f 72 7d 20 6f 62 6a 65 63 74 2c 20 77  ursor} object, w
d710: 68 69 63 68 20 69 73 20 70 6f 73 69 74 69 6f 6e  hich is position
d720: 65 64 20 62 65 66 6f 72 65 20 74 68 65 20 66 69  ed before the fi
d730: 72 73 74 20 65 6e 74 72 79 2e 20 4e 6f 74 65 20  rst entry. Note 
d740: 74 68 61 74 0a 20 20 20 20 20 2a 20 7b 40 6c 69  that.     * {@li
d750: 6e 6b 20 43 75 72 73 6f 72 7d 73 20 61 72 65 20  nk Cursor}s are 
d760: 6e 6f 74 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64  not synchronized
d770: 2c 20 73 65 65 20 74 68 65 20 64 6f 63 75 6d 65  , see the docume
d780: 6e 74 61 74 69 6f 6e 20 66 6f 72 20 6d 6f 72 65  ntation for more
d790: 20 64 65 74 61 69 6c 73 2e 0a 20 20 20 20 20 2a   details..     *
d7a0: 2f 0a 20 20 20 20 70 75 62 6c 69 63 20 43 75 72  /.    public Cur
d7b0: 73 6f 72 20 72 61 77 51 75 65 72 79 28 53 74 72  sor rawQuery(Str
d7c0: 69 6e 67 20 73 71 6c 2c 20 53 74 72 69 6e 67 5b  ing sql, String[
d7d0: 5d 20 73 65 6c 65 63 74 69 6f 6e 41 72 67 73 2c  ] selectionArgs,
d7e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 43 61 6e  .            Can
d7f0: 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 20  cellationSignal 
d800: 63 61 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e  cancellationSign
d810: 61 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65  al) {.        re
d820: 74 75 72 6e 20 72 61 77 51 75 65 72 79 57 69 74  turn rawQueryWit
d830: 68 46 61 63 74 6f 72 79 28 6e 75 6c 6c 2c 20 73  hFactory(null, s
d840: 71 6c 2c 20 73 65 6c 65 63 74 69 6f 6e 41 72 67  ql, selectionArg
d850: 73 2c 20 6e 75 6c 6c 2c 20 63 61 6e 63 65 6c 6c  s, null, cancell
d860: 61 74 69 6f 6e 53 69 67 6e 61 6c 29 3b 0a 20 20  ationSignal);.  
d870: 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20    }..    /**.   
d880: 20 20 2a 20 52 75 6e 73 20 74 68 65 20 70 72 6f    * Runs the pro
d890: 76 69 64 65 64 20 53 51 4c 20 61 6e 64 20 72 65  vided SQL and re
d8a0: 74 75 72 6e 73 20 61 20 63 75 72 73 6f 72 20 6f  turns a cursor o
d8b0: 76 65 72 20 74 68 65 20 72 65 73 75 6c 74 20 73  ver the result s
d8c0: 65 74 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20  et..     *.     
d8d0: 2a 20 40 70 61 72 61 6d 20 63 75 72 73 6f 72 46  * @param cursorF
d8e0: 61 63 74 6f 72 79 20 74 68 65 20 63 75 72 73 6f  actory the curso
d8f0: 72 20 66 61 63 74 6f 72 79 20 74 6f 20 75 73 65  r factory to use
d900: 2c 20 6f 72 20 6e 75 6c 6c 20 66 6f 72 20 74 68  , or null for th
d910: 65 20 64 65 66 61 75 6c 74 20 66 61 63 74 6f 72  e default factor
d920: 79 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20  y.     * @param 
d930: 73 71 6c 20 74 68 65 20 53 51 4c 20 71 75 65 72  sql the SQL quer
d940: 79 2e 20 54 68 65 20 53 51 4c 20 73 74 72 69 6e  y. The SQL strin
d950: 67 20 6d 75 73 74 20 6e 6f 74 20 62 65 20 3b 20  g must not be ; 
d960: 74 65 72 6d 69 6e 61 74 65 64 0a 20 20 20 20 20  terminated.     
d970: 2a 20 40 70 61 72 61 6d 20 73 65 6c 65 63 74 69  * @param selecti
d980: 6f 6e 41 72 67 73 20 59 6f 75 20 6d 61 79 20 69  onArgs You may i
d990: 6e 63 6c 75 64 65 20 3f 73 20 69 6e 20 77 68 65  nclude ?s in whe
d9a0: 72 65 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65  re clause in the
d9b0: 20 71 75 65 72 79 2c 0a 20 20 20 20 20 2a 20 20   query,.     *  
d9c0: 20 20 20 77 68 69 63 68 20 77 69 6c 6c 20 62 65     which will be
d9d0: 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65   replaced by the
d9e0: 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 73 65 6c   values from sel
d9f0: 65 63 74 69 6f 6e 41 72 67 73 2e 20 54 68 65 0a  ectionArgs. The.
da00: 20 20 20 20 20 2a 20 20 20 20 20 76 61 6c 75 65       *     value
da10: 73 20 77 69 6c 6c 20 62 65 20 62 6f 75 6e 64 20  s will be bound 
da20: 61 73 20 53 74 72 69 6e 67 73 2e 0a 20 20 20 20  as Strings..    
da30: 20 2a 20 40 70 61 72 61 6d 20 65 64 69 74 54 61   * @param editTa
da40: 62 6c 65 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ble the name of 
da50: 74 68 65 20 66 69 72 73 74 20 74 61 62 6c 65 2c  the first table,
da60: 20 77 68 69 63 68 20 69 73 20 65 64 69 74 61 62   which is editab
da70: 6c 65 0a 20 20 20 20 20 2a 20 40 72 65 74 75 72  le.     * @retur
da80: 6e 20 41 20 7b 40 6c 69 6e 6b 20 43 75 72 73 6f  n A {@link Curso
da90: 72 7d 20 6f 62 6a 65 63 74 2c 20 77 68 69 63 68  r} object, which
daa0: 20 69 73 20 70 6f 73 69 74 69 6f 6e 65 64 20 62   is positioned b
dab0: 65 66 6f 72 65 20 74 68 65 20 66 69 72 73 74 20  efore the first 
dac0: 65 6e 74 72 79 2e 20 4e 6f 74 65 20 74 68 61 74  entry. Note that
dad0: 0a 20 20 20 20 20 2a 20 7b 40 6c 69 6e 6b 20 43  .     * {@link C
dae0: 75 72 73 6f 72 7d 73 20 61 72 65 20 6e 6f 74 20  ursor}s are not 
daf0: 73 79 6e 63 68 72 6f 6e 69 7a 65 64 2c 20 73 65  synchronized, se
db00: 65 20 74 68 65 20 64 6f 63 75 6d 65 6e 74 61 74  e the documentat
db10: 69 6f 6e 20 66 6f 72 20 6d 6f 72 65 20 64 65 74  ion for more det
db20: 61 69 6c 73 2e 0a 20 20 20 20 20 2a 2f 0a 20 20  ails..     */.  
db30: 20 20 70 75 62 6c 69 63 20 43 75 72 73 6f 72 20    public Cursor 
db40: 72 61 77 51 75 65 72 79 57 69 74 68 46 61 63 74  rawQueryWithFact
db50: 6f 72 79 28 0a 20 20 20 20 20 20 20 20 20 20 20  ory(.           
db60: 20 43 75 72 73 6f 72 46 61 63 74 6f 72 79 20 63   CursorFactory c
db70: 75 72 73 6f 72 46 61 63 74 6f 72 79 2c 20 53 74  ursorFactory, St
db80: 72 69 6e 67 20 73 71 6c 2c 20 53 74 72 69 6e 67  ring sql, String
db90: 5b 5d 20 73 65 6c 65 63 74 69 6f 6e 41 72 67 73  [] selectionArgs
dba0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 74  ,.            St
dbb0: 72 69 6e 67 20 65 64 69 74 54 61 62 6c 65 29 20  ring editTable) 
dbc0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
dbd0: 20 72 61 77 51 75 65 72 79 57 69 74 68 46 61 63   rawQueryWithFac
dbe0: 74 6f 72 79 28 63 75 72 73 6f 72 46 61 63 74 6f  tory(cursorFacto
dbf0: 72 79 2c 20 73 71 6c 2c 20 73 65 6c 65 63 74 69  ry, sql, selecti
dc00: 6f 6e 41 72 67 73 2c 20 65 64 69 74 54 61 62 6c  onArgs, editTabl
dc10: 65 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a  e, null);.    }.
dc20: 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20  .    /**.     * 
dc30: 52 75 6e 73 20 74 68 65 20 70 72 6f 76 69 64 65  Runs the provide
dc40: 64 20 53 51 4c 20 61 6e 64 20 72 65 74 75 72 6e  d SQL and return
dc50: 73 20 61 20 63 75 72 73 6f 72 20 6f 76 65 72 20  s a cursor over 
dc60: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 0a  the result set..
dc70: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 70       *.     * @p
dc80: 61 72 61 6d 20 63 75 72 73 6f 72 46 61 63 74 6f  aram cursorFacto
dc90: 72 79 20 74 68 65 20 63 75 72 73 6f 72 20 66 61  ry the cursor fa
dca0: 63 74 6f 72 79 20 74 6f 20 75 73 65 2c 20 6f 72  ctory to use, or
dcb0: 20 6e 75 6c 6c 20 66 6f 72 20 74 68 65 20 64 65   null for the de
dcc0: 66 61 75 6c 74 20 66 61 63 74 6f 72 79 0a 20 20  fault factory.  
dcd0: 20 20 20 2a 20 40 70 61 72 61 6d 20 73 71 6c 20     * @param sql 
dce0: 74 68 65 20 53 51 4c 20 71 75 65 72 79 2e 20 54  the SQL query. T
dcf0: 68 65 20 53 51 4c 20 73 74 72 69 6e 67 20 6d 75  he SQL string mu
dd00: 73 74 20 6e 6f 74 20 62 65 20 3b 20 74 65 72 6d  st not be ; term
dd10: 69 6e 61 74 65 64 0a 20 20 20 20 20 2a 20 40 70  inated.     * @p
dd20: 61 72 61 6d 20 73 65 6c 65 63 74 69 6f 6e 41 72  aram selectionAr
dd30: 67 73 20 59 6f 75 20 6d 61 79 20 69 6e 63 6c 75  gs You may inclu
dd40: 64 65 20 3f 73 20 69 6e 20 77 68 65 72 65 20 63  de ?s in where c
dd50: 6c 61 75 73 65 20 69 6e 20 74 68 65 20 71 75 65  lause in the que
dd60: 72 79 2c 0a 20 20 20 20 20 2a 20 20 20 20 20 77  ry,.     *     w
dd70: 68 69 63 68 20 77 69 6c 6c 20 62 65 20 72 65 70  hich will be rep
dd80: 6c 61 63 65 64 20 62 79 20 74 68 65 20 76 61 6c  laced by the val
dd90: 75 65 73 20 66 72 6f 6d 20 73 65 6c 65 63 74 69  ues from selecti
dda0: 6f 6e 41 72 67 73 2e 20 54 68 65 0a 20 20 20 20  onArgs. The.    
ddb0: 20 2a 20 20 20 20 20 76 61 6c 75 65 73 20 77 69   *     values wi
ddc0: 6c 6c 20 62 65 20 62 6f 75 6e 64 20 61 73 20 53  ll be bound as S
ddd0: 74 72 69 6e 67 73 2e 0a 20 20 20 20 20 2a 20 40  trings..     * @
dde0: 70 61 72 61 6d 20 65 64 69 74 54 61 62 6c 65 20  param editTable 
ddf0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
de00: 66 69 72 73 74 20 74 61 62 6c 65 2c 20 77 68 69  first table, whi
de10: 63 68 20 69 73 20 65 64 69 74 61 62 6c 65 0a 20  ch is editable. 
de20: 20 20 20 20 2a 20 40 70 61 72 61 6d 20 63 61 6e      * @param can
de30: 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 20  cellationSignal 
de40: 41 20 73 69 67 6e 61 6c 20 74 6f 20 63 61 6e 63  A signal to canc
de50: 65 6c 20 74 68 65 20 6f 70 65 72 61 74 69 6f 6e  el the operation
de60: 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 6f 72   in progress, or
de70: 20 6e 75 6c 6c 20 69 66 20 6e 6f 6e 65 2e 0a 20   null if none.. 
de80: 20 20 20 20 2a 20 49 66 20 74 68 65 20 6f 70 65      * If the ope
de90: 72 61 74 69 6f 6e 20 69 73 20 63 61 6e 63 65 6c  ration is cancel
dea0: 65 64 2c 20 74 68 65 6e 20 7b 40 6c 69 6e 6b 20  ed, then {@link 
deb0: 4f 70 65 72 61 74 69 6f 6e 43 61 6e 63 65 6c 65  OperationCancele
dec0: 64 45 78 63 65 70 74 69 6f 6e 7d 20 77 69 6c 6c  dException} will
ded0: 20 62 65 20 74 68 72 6f 77 6e 0a 20 20 20 20 20   be thrown.     
dee0: 2a 20 77 68 65 6e 20 74 68 65 20 71 75 65 72 79  * when the query
def0: 20 69 73 20 65 78 65 63 75 74 65 64 2e 0a 20 20   is executed..  
df00: 20 20 20 2a 20 40 72 65 74 75 72 6e 20 41 20 7b     * @return A {
df10: 40 6c 69 6e 6b 20 43 75 72 73 6f 72 7d 20 6f 62  @link Cursor} ob
df20: 6a 65 63 74 2c 20 77 68 69 63 68 20 69 73 20 70  ject, which is p
df30: 6f 73 69 74 69 6f 6e 65 64 20 62 65 66 6f 72 65  ositioned before
df40: 20 74 68 65 20 66 69 72 73 74 20 65 6e 74 72 79   the first entry
df50: 2e 20 4e 6f 74 65 20 74 68 61 74 0a 20 20 20 20  . Note that.    
df60: 20 2a 20 7b 40 6c 69 6e 6b 20 43 75 72 73 6f 72   * {@link Cursor
df70: 7d 73 20 61 72 65 20 6e 6f 74 20 73 79 6e 63 68  }s are not synch
df80: 72 6f 6e 69 7a 65 64 2c 20 73 65 65 20 74 68 65  ronized, see the
df90: 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 66   documentation f
dfa0: 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 2e  or more details.
dfb0: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 75 62  .     */.    pub
dfc0: 6c 69 63 20 43 75 72 73 6f 72 20 72 61 77 51 75  lic Cursor rawQu
dfd0: 65 72 79 57 69 74 68 46 61 63 74 6f 72 79 28 0a  eryWithFactory(.
dfe0: 20 20 20 20 20 20 20 20 20 20 20 20 43 75 72 73              Curs
dff0: 6f 72 46 61 63 74 6f 72 79 20 63 75 72 73 6f 72  orFactory cursor
e000: 46 61 63 74 6f 72 79 2c 20 53 74 72 69 6e 67 20  Factory, String 
e010: 73 71 6c 2c 20 53 74 72 69 6e 67 5b 5d 20 73 65  sql, String[] se
e020: 6c 65 63 74 69 6f 6e 41 72 67 73 2c 0a 20 20 20  lectionArgs,.   
e030: 20 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 20           String 
e040: 65 64 69 74 54 61 62 6c 65 2c 20 43 61 6e 63 65  editTable, Cance
e050: 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 20 63 61  llationSignal ca
e060: 6e 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c  ncellationSignal
e070: 29 20 7b 0a 20 20 20 20 20 20 20 20 61 63 71 75  ) {.        acqu
e080: 69 72 65 52 65 66 65 72 65 6e 63 65 28 29 3b 0a  ireReference();.
e090: 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20          try {.  
e0a0: 20 20 20 20 20 20 20 20 20 20 53 51 4c 69 74 65            SQLite
e0b0: 43 75 72 73 6f 72 44 72 69 76 65 72 20 64 72 69  CursorDriver dri
e0c0: 76 65 72 20 3d 20 6e 65 77 20 53 51 4c 69 74 65  ver = new SQLite
e0d0: 44 69 72 65 63 74 43 75 72 73 6f 72 44 72 69 76  DirectCursorDriv
e0e0: 65 72 28 74 68 69 73 2c 20 73 71 6c 2c 20 65 64  er(this, sql, ed
e0f0: 69 74 54 61 62 6c 65 2c 0a 20 20 20 20 20 20 20  itTable,.       
e100: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 6e               can
e110: 63 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 29  cellationSignal)
e120: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
e130: 74 75 72 6e 20 64 72 69 76 65 72 2e 71 75 65 72  turn driver.quer
e140: 79 28 63 75 72 73 6f 72 46 61 63 74 6f 72 79 20  y(cursorFactory 
e150: 21 3d 20 6e 75 6c 6c 20 3f 20 63 75 72 73 6f 72  != null ? cursor
e160: 46 61 63 74 6f 72 79 20 3a 20 6d 43 75 72 73 6f  Factory : mCurso
e170: 72 46 61 63 74 6f 72 79 2c 0a 20 20 20 20 20 20  rFactory,.      
e180: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 65                se
e190: 6c 65 63 74 69 6f 6e 41 72 67 73 29 3b 0a 20 20  lectionArgs);.  
e1a0: 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20        } finally 
e1b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
e1c0: 6c 65 61 73 65 52 65 66 65 72 65 6e 63 65 28 29  leaseReference()
e1d0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e1e0: 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20  }..    /**.     
e1f0: 2a 20 43 6f 6e 76 65 6e 69 65 6e 63 65 20 6d 65  * Convenience me
e200: 74 68 6f 64 20 66 6f 72 20 69 6e 73 65 72 74 69  thod for inserti
e210: 6e 67 20 61 20 72 6f 77 20 69 6e 74 6f 20 74 68  ng a row into th
e220: 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
e230: 20 2a 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d   *.     * @param
e240: 20 74 61 62 6c 65 20 74 68 65 20 74 61 62 6c 65   table the table
e250: 20 74 6f 20 69 6e 73 65 72 74 20 74 68 65 20 72   to insert the r
e260: 6f 77 20 69 6e 74 6f 0a 20 20 20 20 20 2a 20 40  ow into.     * @
e270: 70 61 72 61 6d 20 6e 75 6c 6c 43 6f 6c 75 6d 6e  param nullColumn
e280: 48 61 63 6b 20 6f 70 74 69 6f 6e 61 6c 3b 20 6d  Hack optional; m
e290: 61 79 20 62 65 20 3c 63 6f 64 65 3e 6e 75 6c 6c  ay be <code>null
e2a0: 3c 2f 63 6f 64 65 3e 2e 0a 20 20 20 20 20 2a 20  </code>..     * 
e2b0: 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 20 64             SQL d
e2c0: 6f 65 73 6e 27 74 20 61 6c 6c 6f 77 20 69 6e 73  oesn't allow ins
e2d0: 65 72 74 69 6e 67 20 61 20 63 6f 6d 70 6c 65 74  erting a complet
e2e0: 65 6c 79 20 65 6d 70 74 79 20 72 6f 77 20 77 69  ely empty row wi
e2f0: 74 68 6f 75 74 0a 20 20 20 20 20 2a 20 20 20 20  thout.     *    
e300: 20 20 20 20 20 20 20 20 6e 61 6d 69 6e 67 20 61          naming a
e310: 74 20 6c 65 61 73 74 20 6f 6e 65 20 63 6f 6c 75  t least one colu
e320: 6d 6e 20 6e 61 6d 65 2e 20 20 49 66 20 79 6f 75  mn name.  If you
e330: 72 20 70 72 6f 76 69 64 65 64 20 3c 63 6f 64 65  r provided <code
e340: 3e 76 61 6c 75 65 73 3c 2f 63 6f 64 65 3e 20 69  >values</code> i
e350: 73 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20 20  s.     *        
e360: 20 20 20 20 65 6d 70 74 79 2c 20 6e 6f 20 63 6f      empty, no co
e370: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 6b  lumn names are k
e380: 6e 6f 77 6e 20 61 6e 64 20 61 6e 20 65 6d 70 74  nown and an empt
e390: 79 20 72 6f 77 20 63 61 6e 27 74 20 62 65 20 69  y row can't be i
e3a0: 6e 73 65 72 74 65 64 2e 0a 20 20 20 20 20 2a 20  nserted..     * 
e3b0: 20 20 20 20 20 20 20 20 20 20 20 49 66 20 6e 6f             If no
e3c0: 74 20 73 65 74 20 74 6f 20 6e 75 6c 6c 2c 20 74  t set to null, t
e3d0: 68 65 20 3c 63 6f 64 65 3e 6e 75 6c 6c 43 6f 6c  he <code>nullCol
e3e0: 75 6d 6e 48 61 63 6b 3c 2f 63 6f 64 65 3e 20 70  umnHack</code> p
e3f0: 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20 2a 20  arameter.     * 
e400: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 76 69             provi
e410: 64 65 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  des the name of 
e420: 6e 75 6c 6c 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  nullable column 
e430: 6e 61 6d 65 20 74 6f 20 65 78 70 6c 69 63 69 74  name to explicit
e440: 6c 79 20 69 6e 73 65 72 74 20 61 20 4e 55 4c 4c  ly insert a NULL
e450: 20 69 6e 74 6f 0a 20 20 20 20 20 2a 20 20 20 20   into.     *    
e460: 20 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 63          in the c
e470: 61 73 65 20 77 68 65 72 65 20 79 6f 75 72 20 3c  ase where your <
e480: 63 6f 64 65 3e 76 61 6c 75 65 73 3c 2f 63 6f 64  code>values</cod
e490: 65 3e 20 69 73 20 65 6d 70 74 79 2e 0a 20 20 20  e> is empty..   
e4a0: 20 20 2a 20 40 70 61 72 61 6d 20 76 61 6c 75 65    * @param value
e4b0: 73 20 74 68 69 73 20 6d 61 70 20 63 6f 6e 74 61  s this map conta
e4c0: 69 6e 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20  ins the initial 
e4d0: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 66 6f  column values fo
e4e0: 72 20 74 68 65 0a 20 20 20 20 20 2a 20 20 20 20  r the.     *    
e4f0: 20 20 20 20 20 20 20 20 72 6f 77 2e 20 54 68 65          row. The
e500: 20 6b 65 79 73 20 73 68 6f 75 6c 64 20 62 65 20   keys should be 
e510: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
e520: 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 73 20   and the values 
e530: 74 68 65 0a 20 20 20 20 20 2a 20 20 20 20 20 20  the.     *      
e540: 20 20 20 20 20 20 63 6f 6c 75 6d 6e 20 76 61 6c        column val
e550: 75 65 73 0a 20 20 20 20 20 2a 20 40 72 65 74 75  ues.     * @retu
e560: 72 6e 20 74 68 65 20 72 6f 77 20 49 44 20 6f 66  rn the row ID of
e570: 20 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65 72   the newly inser
e580: 74 65 64 20 72 6f 77 2c 20 6f 72 20 2d 31 20 69  ted row, or -1 i
e590: 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75 72  f an error occur
e5a0: 72 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  red.     */.    
e5b0: 70 75 62 6c 69 63 20 6c 6f 6e 67 20 69 6e 73 65  public long inse
e5c0: 72 74 28 53 74 72 69 6e 67 20 74 61 62 6c 65 2c  rt(String table,
e5d0: 20 53 74 72 69 6e 67 20 6e 75 6c 6c 43 6f 6c 75   String nullColu
e5e0: 6d 6e 48 61 63 6b 2c 20 43 6f 6e 74 65 6e 74 56  mnHack, ContentV
e5f0: 61 6c 75 65 73 20 76 61 6c 75 65 73 29 20 7b 0a  alues values) {.
e600: 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20          try {.  
e610: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
e620: 20 69 6e 73 65 72 74 57 69 74 68 4f 6e 43 6f 6e   insertWithOnCon
e630: 66 6c 69 63 74 28 74 61 62 6c 65 2c 20 6e 75 6c  flict(table, nul
e640: 6c 43 6f 6c 75 6d 6e 48 61 63 6b 2c 20 76 61 6c  lColumnHack, val
e650: 75 65 73 2c 20 43 4f 4e 46 4c 49 43 54 5f 4e 4f  ues, CONFLICT_NO
e660: 4e 45 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 63  NE);.        } c
e670: 61 74 63 68 20 28 53 51 4c 45 78 63 65 70 74 69  atch (SQLExcepti
e680: 6f 6e 20 65 29 20 7b 0a 20 20 20 20 20 20 20 20  on e) {.        
e690: 20 20 20 20 4c 6f 67 2e 65 28 54 41 47 2c 20 22      Log.e(TAG, "
e6a0: 45 72 72 6f 72 20 69 6e 73 65 72 74 69 6e 67 20  Error inserting 
e6b0: 22 20 2b 20 76 61 6c 75 65 73 2c 20 65 29 3b 0a  " + values, e);.
e6c0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
e6d0: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d  rn -1;.        }
e6e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a  .    }..    /**.
e6f0: 20 20 20 20 20 2a 20 43 6f 6e 76 65 6e 69 65 6e       * Convenien
e700: 63 65 20 6d 65 74 68 6f 64 20 66 6f 72 20 69 6e  ce method for in
e710: 73 65 72 74 69 6e 67 20 61 20 72 6f 77 20 69 6e  serting a row in
e720: 74 6f 20 74 68 65 20 64 61 74 61 62 61 73 65 2e  to the database.
e730: 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40  .     *.     * @
e740: 70 61 72 61 6d 20 74 61 62 6c 65 20 74 68 65 20  param table the 
e750: 74 61 62 6c 65 20 74 6f 20 69 6e 73 65 72 74 20  table to insert 
e760: 74 68 65 20 72 6f 77 20 69 6e 74 6f 0a 20 20 20  the row into.   
e770: 20 20 2a 20 40 70 61 72 61 6d 20 6e 75 6c 6c 43    * @param nullC
e780: 6f 6c 75 6d 6e 48 61 63 6b 20 6f 70 74 69 6f 6e  olumnHack option
e790: 61 6c 3b 20 6d 61 79 20 62 65 20 3c 63 6f 64 65  al; may be <code
e7a0: 3e 6e 75 6c 6c 3c 2f 63 6f 64 65 3e 2e 0a 20 20  >null</code>..  
e7b0: 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20 20     *            
e7c0: 53 51 4c 20 64 6f 65 73 6e 27 74 20 61 6c 6c 6f  SQL doesn't allo
e7d0: 77 20 69 6e 73 65 72 74 69 6e 67 20 61 20 63 6f  w inserting a co
e7e0: 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20 72  mpletely empty r
e7f0: 6f 77 20 77 69 74 68 6f 75 74 0a 20 20 20 20 20  ow without.     
e800: 2a 20 20 20 20 20 20 20 20 20 20 20 20 6e 61 6d  *            nam
e810: 69 6e 67 20 61 74 20 6c 65 61 73 74 20 6f 6e 65  ing at least one
e820: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 20 20 49   column name.  I
e830: 66 20 79 6f 75 72 20 70 72 6f 76 69 64 65 64 20  f your provided 
e840: 3c 63 6f 64 65 3e 76 61 6c 75 65 73 3c 2f 63 6f  <code>values</co
e850: 64 65 3e 20 69 73 0a 20 20 20 20 20 2a 20 20 20  de> is.     *   
e860: 20 20 20 20 20 20 20 20 20 65 6d 70 74 79 2c 20           empty, 
e870: 6e 6f 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  no column names 
e880: 61 72 65 20 6b 6e 6f 77 6e 20 61 6e 64 20 61 6e  are known and an
e890: 20 65 6d 70 74 79 20 72 6f 77 20 63 61 6e 27 74   empty row can't
e8a0: 20 62 65 20 69 6e 73 65 72 74 65 64 2e 0a 20 20   be inserted..  
e8b0: 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20 20     *            
e8c0: 49 66 20 6e 6f 74 20 73 65 74 20 74 6f 20 6e 75  If not set to nu
e8d0: 6c 6c 2c 20 74 68 65 20 3c 63 6f 64 65 3e 6e 75  ll, the <code>nu
e8e0: 6c 6c 43 6f 6c 75 6d 6e 48 61 63 6b 3c 2f 63 6f  llColumnHack</co
e8f0: 64 65 3e 20 70 61 72 61 6d 65 74 65 72 0a 20 20  de> parameter.  
e900: 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20 20     *            
e910: 70 72 6f 76 69 64 65 73 20 74 68 65 20 6e 61 6d  provides the nam
e920: 65 20 6f 66 20 6e 75 6c 6c 61 62 6c 65 20 63 6f  e of nullable co
e930: 6c 75 6d 6e 20 6e 61 6d 65 20 74 6f 20 65 78 70  lumn name to exp
e940: 6c 69 63 69 74 6c 79 20 69 6e 73 65 72 74 20 61  licitly insert a
e950: 20 4e 55 4c 4c 20 69 6e 74 6f 0a 20 20 20 20 20   NULL into.     
e960: 2a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 20  *            in 
e970: 74 68 65 20 63 61 73 65 20 77 68 65 72 65 20 79  the case where y
e980: 6f 75 72 20 3c 63 6f 64 65 3e 76 61 6c 75 65 73  our <code>values
e990: 3c 2f 63 6f 64 65 3e 20 69 73 20 65 6d 70 74 79  </code> is empty
e9a0: 2e 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20  ..     * @param 
e9b0: 76 61 6c 75 65 73 20 74 68 69 73 20 6d 61 70 20  values this map 
e9c0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 69 6e 69  contains the ini
e9d0: 74 69 61 6c 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  tial column valu
e9e0: 65 73 20 66 6f 72 20 74 68 65 0a 20 20 20 20 20  es for the.     
e9f0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 72 6f 77  *            row
ea00: 2e 20 54 68 65 20 6b 65 79 73 20 73 68 6f 75 6c  . The keys shoul
ea10: 64 20 62 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20  d be the column 
ea20: 6e 61 6d 65 73 20 61 6e 64 20 74 68 65 20 76 61  names and the va
ea30: 6c 75 65 73 20 74 68 65 0a 20 20 20 20 20 2a 20  lues the.     * 
ea40: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6c 75 6d             colum
ea50: 6e 20 76 61 6c 75 65 73 0a 20 20 20 20 20 2a 20  n values.     * 
ea60: 40 74 68 72 6f 77 73 20 53 51 4c 45 78 63 65 70  @throws SQLExcep
ea70: 74 69 6f 6e 0a 20 20 20 20 20 2a 20 40 72 65 74  tion.     * @ret
ea80: 75 72 6e 20 74 68 65 20 72 6f 77 20 49 44 20 6f  urn the row ID o
ea90: 66 20 74 68 65 20 6e 65 77 6c 79 20 69 6e 73 65  f the newly inse
eaa0: 72 74 65 64 20 72 6f 77 2c 20 6f 72 20 2d 31 20  rted row, or -1 
eab0: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
eac0: 72 72 65 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20  rred.     */.   
ead0: 20 70 75 62 6c 69 63 20 6c 6f 6e 67 20 69 6e 73   public long ins
eae0: 65 72 74 4f 72 54 68 72 6f 77 28 53 74 72 69 6e  ertOrThrow(Strin
eaf0: 67 20 74 61 62 6c 65 2c 20 53 74 72 69 6e 67 20  g table, String 
eb00: 6e 75 6c 6c 43 6f 6c 75 6d 6e 48 61 63 6b 2c 20  nullColumnHack, 
eb10: 43 6f 6e 74 65 6e 74 56 61 6c 75 65 73 20 76 61  ContentValues va
eb20: 6c 75 65 73 29 0a 20 20 20 20 20 20 20 20 20 20  lues).          
eb30: 20 20 74 68 72 6f 77 73 20 53 51 4c 45 78 63 65    throws SQLExce
eb40: 70 74 69 6f 6e 20 7b 0a 20 20 20 20 20 20 20 20  ption {.        
eb50: 72 65 74 75 72 6e 20 69 6e 73 65 72 74 57 69 74  return insertWit
eb60: 68 4f 6e 43 6f 6e 66 6c 69 63 74 28 74 61 62 6c  hOnConflict(tabl
eb70: 65 2c 20 6e 75 6c 6c 43 6f 6c 75 6d 6e 48 61 63  e, nullColumnHac
eb80: 6b 2c 20 76 61 6c 75 65 73 2c 20 43 4f 4e 46 4c  k, values, CONFL
eb90: 49 43 54 5f 4e 4f 4e 45 29 3b 0a 20 20 20 20 7d  ICT_NONE);.    }
eba0: 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a  ..    /**.     *
ebb0: 20 43 6f 6e 76 65 6e 69 65 6e 63 65 20 6d 65 74   Convenience met
ebc0: 68 6f 64 20 66 6f 72 20 72 65 70 6c 61 63 69 6e  hod for replacin
ebd0: 67 20 61 20 72 6f 77 20 69 6e 20 74 68 65 20 64  g a row in the d
ebe0: 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 2a 20  atabase..     * 
ebf0: 49 6e 73 65 72 74 73 20 61 20 6e 65 77 20 72 6f  Inserts a new ro
ec00: 77 20 69 66 20 61 20 72 6f 77 20 64 6f 65 73 20  w if a row does 
ec10: 6e 6f 74 20 61 6c 72 65 61 64 79 20 65 78 69 73  not already exis
ec20: 74 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a  t..     *.     *
ec30: 20 40 70 61 72 61 6d 20 74 61 62 6c 65 20 74 68   @param table th
ec40: 65 20 74 61 62 6c 65 20 69 6e 20 77 68 69 63 68  e table in which
ec50: 20 74 6f 20 72 65 70 6c 61 63 65 20 74 68 65 20   to replace the 
ec60: 72 6f 77 0a 20 20 20 20 20 2a 20 40 70 61 72 61  row.     * @para
ec70: 6d 20 6e 75 6c 6c 43 6f 6c 75 6d 6e 48 61 63 6b  m nullColumnHack
ec80: 20 6f 70 74 69 6f 6e 61 6c 3b 20 6d 61 79 20 62   optional; may b
ec90: 65 20 3c 63 6f 64 65 3e 6e 75 6c 6c 3c 2f 63 6f  e <code>null</co
eca0: 64 65 3e 2e 0a 20 20 20 20 20 2a 20 20 20 20 20  de>..     *     
ecb0: 20 20 20 20 20 20 20 53 51 4c 20 64 6f 65 73 6e         SQL doesn
ecc0: 27 74 20 61 6c 6c 6f 77 20 69 6e 73 65 72 74 69  't allow inserti
ecd0: 6e 67 20 61 20 63 6f 6d 70 6c 65 74 65 6c 79 20  ng a completely 
ece0: 65 6d 70 74 79 20 72 6f 77 20 77 69 74 68 6f 75  empty row withou
ecf0: 74 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20 20  t.     *        
ed00: 20 20 20 20 6e 61 6d 69 6e 67 20 61 74 20 6c 65      naming at le
ed10: 61 73 74 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6e  ast one column n
ed20: 61 6d 65 2e 20 20 49 66 20 79 6f 75 72 20 70 72  ame.  If your pr
ed30: 6f 76 69 64 65 64 20 3c 63 6f 64 65 3e 69 6e 69  ovided <code>ini
ed40: 74 69 61 6c 56 61 6c 75 65 73 3c 2f 63 6f 64 65  tialValues</code
ed50: 3e 20 69 73 0a 20 20 20 20 20 2a 20 20 20 20 20  > is.     *     
ed60: 20 20 20 20 20 20 20 65 6d 70 74 79 2c 20 6e 6f         empty, no
ed70: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72   column names ar
ed80: 65 20 6b 6e 6f 77 6e 20 61 6e 64 20 61 6e 20 65  e known and an e
ed90: 6d 70 74 79 20 72 6f 77 20 63 61 6e 27 74 20 62  mpty row can't b
eda0: 65 20 69 6e 73 65 72 74 65 64 2e 0a 20 20 20 20  e inserted..    
edb0: 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 49 66   *            If
edc0: 20 6e 6f 74 20 73 65 74 20 74 6f 20 6e 75 6c 6c   not set to null
edd0: 2c 20 74 68 65 20 3c 63 6f 64 65 3e 6e 75 6c 6c  , the <code>null
ede0: 43 6f 6c 75 6d 6e 48 61 63 6b 3c 2f 63 6f 64 65  ColumnHack</code
edf0: 3e 20 70 61 72 61 6d 65 74 65 72 0a 20 20 20 20  > parameter.    
ee00: 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 70 72   *            pr
ee10: 6f 76 69 64 65 73 20 74 68 65 20 6e 61 6d 65 20  ovides the name 
ee20: 6f 66 20 6e 75 6c 6c 61 62 6c 65 20 63 6f 6c 75  of nullable colu
ee30: 6d 6e 20 6e 61 6d 65 20 74 6f 20 65 78 70 6c 69  mn name to expli
ee40: 63 69 74 6c 79 20 69 6e 73 65 72 74 20 61 20 4e  citly insert a N
ee50: 55 4c 4c 20 69 6e 74 6f 0a 20 20 20 20 20 2a 20  ULL into.     * 
ee60: 20 20 20 20 20 20 20 20 20 20 20 69 6e 20 74 68             in th
ee70: 65 20 63 61 73 65 20 77 68 65 72 65 20 79 6f 75  e case where you
ee80: 72 20 3c 63 6f 64 65 3e 69 6e 69 74 69 61 6c 56  r <code>initialV
ee90: 61 6c 75 65 73 3c 2f 63 6f 64 65 3e 20 69 73 20  alues</code> is 
eea0: 65 6d 70 74 79 2e 0a 20 20 20 20 20 2a 20 40 70  empty..     * @p
eeb0: 61 72 61 6d 20 69 6e 69 74 69 61 6c 56 61 6c 75  aram initialValu
eec0: 65 73 20 74 68 69 73 20 6d 61 70 20 63 6f 6e 74  es this map cont
eed0: 61 69 6e 73 20 74 68 65 20 69 6e 69 74 69 61 6c  ains the initial
eee0: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73 20 66   column values f
eef0: 6f 72 0a 20 20 20 20 20 2a 20 20 20 74 68 65 20  or.     *   the 
ef00: 72 6f 77 2e 20 54 68 65 20 6b 65 79 73 20 73 68  row. The keys sh
ef10: 6f 75 6c 64 20 62 65 20 74 68 65 20 63 6f 6c 75  ould be the colu
ef20: 6d 6e 20 6e 61 6d 65 73 20 61 6e 64 20 74 68 65  mn names and the
ef30: 20 76 61 6c 75 65 73 20 74 68 65 20 63 6f 6c 75   values the colu
ef40: 6d 6e 20 76 61 6c 75 65 73 2e 0a 20 20 20 20 20  mn values..     
ef50: 2a 20 40 72 65 74 75 72 6e 20 74 68 65 20 72 6f  * @return the ro
ef60: 77 20 49 44 20 6f 66 20 74 68 65 20 6e 65 77 6c  w ID of the newl
ef70: 79 20 69 6e 73 65 72 74 65 64 20 72 6f 77 2c 20  y inserted row, 
ef80: 6f 72 20 2d 31 20 69 66 20 61 6e 20 65 72 72 6f  or -1 if an erro
ef90: 72 20 6f 63 63 75 72 72 65 64 0a 20 20 20 20 20  r occurred.     
efa0: 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20 6c 6f  */.    public lo
efb0: 6e 67 20 72 65 70 6c 61 63 65 28 53 74 72 69 6e  ng replace(Strin
efc0: 67 20 74 61 62 6c 65 2c 20 53 74 72 69 6e 67 20  g table, String 
efd0: 6e 75 6c 6c 43 6f 6c 75 6d 6e 48 61 63 6b 2c 20  nullColumnHack, 
efe0: 43 6f 6e 74 65 6e 74 56 61 6c 75 65 73 20 69 6e  ContentValues in
eff0: 69 74 69 61 6c 56 61 6c 75 65 73 29 20 7b 0a 20  itialValues) {. 
f000: 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20         try {.   
f010: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
f020: 69 6e 73 65 72 74 57 69 74 68 4f 6e 43 6f 6e 66  insertWithOnConf
f030: 6c 69 63 74 28 74 61 62 6c 65 2c 20 6e 75 6c 6c  lict(table, null
f040: 43 6f 6c 75 6d 6e 48 61 63 6b 2c 20 69 6e 69 74  ColumnHack, init
f050: 69 61 6c 56 61 6c 75 65 73 2c 0a 20 20 20 20 20  ialValues,.     
f060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 43                 C
f070: 4f 4e 46 4c 49 43 54 5f 52 45 50 4c 41 43 45 29  ONFLICT_REPLACE)
f080: 3b 0a 20 20 20 20 20 20 20 20 7d 20 63 61 74 63  ;.        } catc
f090: 68 20 28 53 51 4c 45 78 63 65 70 74 69 6f 6e 20  h (SQLException 
f0a0: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e) {.           
f0b0: 20 4c 6f 67 2e 65 28 54 41 47 2c 20 22 45 72 72   Log.e(TAG, "Err
f0c0: 6f 72 20 69 6e 73 65 72 74 69 6e 67 20 22 20 2b  or inserting " +
f0d0: 20 69 6e 69 74 69 61 6c 56 61 6c 75 65 73 2c 20   initialValues, 
f0e0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
f0f0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20  return -1;.     
f100: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
f110: 2f 2a 2a 0a 20 20 20 20 20 2a 20 43 6f 6e 76 65  /**.     * Conve
f120: 6e 69 65 6e 63 65 20 6d 65 74 68 6f 64 20 66 6f  nience method fo
f130: 72 20 72 65 70 6c 61 63 69 6e 67 20 61 20 72 6f  r replacing a ro
f140: 77 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73  w in the databas
f150: 65 2e 0a 20 20 20 20 20 2a 20 49 6e 73 65 72 74  e..     * Insert
f160: 73 20 61 20 6e 65 77 20 72 6f 77 20 69 66 20 61  s a new row if a
f170: 20 72 6f 77 20 64 6f 65 73 20 6e 6f 74 20 61 6c   row does not al
f180: 72 65 61 64 79 20 65 78 69 73 74 2e 0a 20 20 20  ready exist..   
f190: 20 20 2a 0a 20 20 20 20 20 2a 20 40 70 61 72 61    *.     * @para
f1a0: 6d 20 74 61 62 6c 65 20 74 68 65 20 74 61 62 6c  m table the tabl
f1b0: 65 20 69 6e 20 77 68 69 63 68 20 74 6f 20 72 65  e in which to re
f1c0: 70 6c 61 63 65 20 74 68 65 20 72 6f 77 0a 20 20  place the row.  
f1d0: 20 20 20 2a 20 40 70 61 72 61 6d 20 6e 75 6c 6c     * @param null
f1e0: 43 6f 6c 75 6d 6e 48 61 63 6b 20 6f 70 74 69 6f  ColumnHack optio
f1f0: 6e 61 6c 3b 20 6d 61 79 20 62 65 20 3c 63 6f 64  nal; may be <cod
f200: 65 3e 6e 75 6c 6c 3c 2f 63 6f 64 65 3e 2e 0a 20  e>null</code>.. 
f210: 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20      *           
f220: 20 53 51 4c 20 64 6f 65 73 6e 27 74 20 61 6c 6c   SQL doesn't all
f230: 6f 77 20 69 6e 73 65 72 74 69 6e 67 20 61 20 63  ow inserting a c
f240: 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70 74 79 20  ompletely empty 
f250: 72 6f 77 20 77 69 74 68 6f 75 74 0a 20 20 20 20  row without.    
f260: 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 6e 61   *            na
f270: 6d 69 6e 67 20 61 74 20 6c 65 61 73 74 20 6f 6e  ming at least on
f280: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 20 20  e column name.  
f290: 49 66 20 79 6f 75 72 20 70 72 6f 76 69 64 65 64  If your provided
f2a0: 20 3c 63 6f 64 65 3e 69 6e 69 74 69 61 6c 56 61   <code>initialVa
f2b0: 6c 75 65 73 3c 2f 63 6f 64 65 3e 20 69 73 0a 20  lues</code> is. 
f2c0: 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20      *           
f2d0: 20 65 6d 70 74 79 2c 20 6e 6f 20 63 6f 6c 75 6d   empty, no colum
f2e0: 6e 20 6e 61 6d 65 73 20 61 72 65 20 6b 6e 6f 77  n names are know
f2f0: 6e 20 61 6e 64 20 61 6e 20 65 6d 70 74 79 20 72  n and an empty r
f300: 6f 77 20 63 61 6e 27 74 20 62 65 20 69 6e 73 65  ow can't be inse
f310: 72 74 65 64 2e 0a 20 20 20 20 20 2a 20 20 20 20  rted..     *    
f320: 20 20 20 20 20 20 20 20 49 66 20 6e 6f 74 20 73          If not s
f330: 65 74 20 74 6f 20 6e 75 6c 6c 2c 20 74 68 65 20  et to null, the 
f340: 3c 63 6f 64 65 3e 6e 75 6c 6c 43 6f 6c 75 6d 6e  <code>nullColumn
f350: 48 61 63 6b 3c 2f 63 6f 64 65 3e 20 70 61 72 61  Hack</code> para
f360: 6d 65 74 65 72 0a 20 20 20 20 20 2a 20 20 20 20  meter.     *    
f370: 20 20 20 20 20 20 20 20 70 72 6f 76 69 64 65 73          provides
f380: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 6e 75 6c   the name of nul
f390: 6c 61 62 6c 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  lable column nam
f3a0: 65 20 74 6f 20 65 78 70 6c 69 63 69 74 6c 79 20  e to explicitly 
f3b0: 69 6e 73 65 72 74 20 61 20 4e 55 4c 4c 20 69 6e  insert a NULL in
f3c0: 74 6f 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20  to.     *       
f3d0: 20 20 20 20 20 69 6e 20 74 68 65 20 63 61 73 65       in the case
f3e0: 20 77 68 65 72 65 20 79 6f 75 72 20 3c 63 6f 64   where your <cod
f3f0: 65 3e 69 6e 69 74 69 61 6c 56 61 6c 75 65 73 3c  e>initialValues<
f400: 2f 63 6f 64 65 3e 20 69 73 20 65 6d 70 74 79 2e  /code> is empty.
f410: 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 69  .     * @param i
f420: 6e 69 74 69 61 6c 56 61 6c 75 65 73 20 74 68 69  nitialValues thi
f430: 73 20 6d 61 70 20 63 6f 6e 74 61 69 6e 73 20 74  s map contains t
f440: 68 65 20 69 6e 69 74 69 61 6c 20 63 6f 6c 75 6d  he initial colum
f450: 6e 20 76 61 6c 75 65 73 20 66 6f 72 0a 20 20 20  n values for.   
f460: 20 20 2a 20 20 20 74 68 65 20 72 6f 77 2e 20 54    *   the row. T
f470: 68 65 20 6b 65 79 73 20 73 68 6f 75 6c 64 20 62  he keys should b
f480: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e the column nam
f490: 65 73 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  es and the value
f4a0: 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  s the column val
f4b0: 75 65 73 2e 0a 20 20 20 20 20 2a 20 40 74 68 72  ues..     * @thr
f4c0: 6f 77 73 20 53 51 4c 45 78 63 65 70 74 69 6f 6e  ows SQLException
f4d0: 0a 20 20 20 20 20 2a 20 40 72 65 74 75 72 6e 20  .     * @return 
f4e0: 74 68 65 20 72 6f 77 20 49 44 20 6f 66 20 74 68  the row ID of th
f4f0: 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65 64  e newly inserted
f500: 20 72 6f 77 2c 20 6f 72 20 2d 31 20 69 66 20 61   row, or -1 if a
f510: 6e 20 65 72 72 6f 72 20 6f 63 63 75 72 72 65 64  n error occurred
f520: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 75 62  .     */.    pub
f530: 6c 69 63 20 6c 6f 6e 67 20 72 65 70 6c 61 63 65  lic long replace
f540: 4f 72 54 68 72 6f 77 28 53 74 72 69 6e 67 20 74  OrThrow(String t
f550: 61 62 6c 65 2c 20 53 74 72 69 6e 67 20 6e 75 6c  able, String nul
f560: 6c 43 6f 6c 75 6d 6e 48 61 63 6b 2c 0a 20 20 20  lColumnHack,.   
f570: 20 20 20 20 20 20 20 20 20 43 6f 6e 74 65 6e 74           Content
f580: 56 61 6c 75 65 73 20 69 6e 69 74 69 61 6c 56 61  Values initialVa
f590: 6c 75 65 73 29 20 74 68 72 6f 77 73 20 53 51 4c  lues) throws SQL
f5a0: 45 78 63 65 70 74 69 6f 6e 20 7b 0a 20 20 20 20  Exception {.    
f5b0: 20 20 20 20 72 65 74 75 72 6e 20 69 6e 73 65 72      return inser
f5c0: 74 57 69 74 68 4f 6e 43 6f 6e 66 6c 69 63 74 28  tWithOnConflict(
f5d0: 74 61 62 6c 65 2c 20 6e 75 6c 6c 43 6f 6c 75 6d  table, nullColum
f5e0: 6e 48 61 63 6b 2c 20 69 6e 69 74 69 61 6c 56 61  nHack, initialVa
f5f0: 6c 75 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20  lues,.          
f600: 20 20 20 20 20 20 43 4f 4e 46 4c 49 43 54 5f 52        CONFLICT_R
f610: 45 50 4c 41 43 45 29 3b 0a 20 20 20 20 7d 0a 0a  EPLACE);.    }..
f620: 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 47      /**.     * G
f630: 65 6e 65 72 61 6c 20 6d 65 74 68 6f 64 20 66 6f  eneral method fo
f640: 72 20 69 6e 73 65 72 74 69 6e 67 20 61 20 72 6f  r inserting a ro
f650: 77 20 69 6e 74 6f 20 74 68 65 20 64 61 74 61 62  w into the datab
f660: 61 73 65 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20  ase..     *.    
f670: 20 2a 20 40 70 61 72 61 6d 20 74 61 62 6c 65 20   * @param table 
f680: 74 68 65 20 74 61 62 6c 65 20 74 6f 20 69 6e 73  the table to ins
f690: 65 72 74 20 74 68 65 20 72 6f 77 20 69 6e 74 6f  ert the row into
f6a0: 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 6e  .     * @param n
f6b0: 75 6c 6c 43 6f 6c 75 6d 6e 48 61 63 6b 20 6f 70  ullColumnHack op
f6c0: 74 69 6f 6e 61 6c 3b 20 6d 61 79 20 62 65 20 3c  tional; may be <
f6d0: 63 6f 64 65 3e 6e 75 6c 6c 3c 2f 63 6f 64 65 3e  code>null</code>
f6e0: 2e 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20 20  ..     *        
f6f0: 20 20 20 20 53 51 4c 20 64 6f 65 73 6e 27 74 20      SQL doesn't 
f700: 61 6c 6c 6f 77 20 69 6e 73 65 72 74 69 6e 67 20  allow inserting 
f710: 61 20 63 6f 6d 70 6c 65 74 65 6c 79 20 65 6d 70  a completely emp
f720: 74 79 20 72 6f 77 20 77 69 74 68 6f 75 74 0a 20  ty row without. 
f730: 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20      *           
f740: 20 6e 61 6d 69 6e 67 20 61 74 20 6c 65 61 73 74   naming at least
f750: 20 6f 6e 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   one column name
f760: 2e 20 20 49 66 20 79 6f 75 72 20 70 72 6f 76 69  .  If your provi
f770: 64 65 64 20 3c 63 6f 64 65 3e 69 6e 69 74 69 61  ded <code>initia
f780: 6c 56 61 6c 75 65 73 3c 2f 63 6f 64 65 3e 20 69  lValues</code> i
f790: 73 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20 20  s.     *        
f7a0: 20 20 20 20 65 6d 70 74 79 2c 20 6e 6f 20 63 6f      empty, no co
f7b0: 6c 75 6d 6e 20 6e 61 6d 65 73 20 61 72 65 20 6b  lumn names are k
f7c0: 6e 6f 77 6e 20 61 6e 64 20 61 6e 20 65 6d 70 74  nown and an empt
f7d0: 79 20 72 6f 77 20 63 61 6e 27 74 20 62 65 20 69  y row can't be i
f7e0: 6e 73 65 72 74 65 64 2e 0a 20 20 20 20 20 2a 20  nserted..     * 
f7f0: 20 20 20 20 20 20 20 20 20 20 20 49 66 20 6e 6f             If no
f800: 74 20 73 65 74 20 74 6f 20 6e 75 6c 6c 2c 20 74  t set to null, t
f810: 68 65 20 3c 63 6f 64 65 3e 6e 75 6c 6c 43 6f 6c  he <code>nullCol
f820: 75 6d 6e 48 61 63 6b 3c 2f 63 6f 64 65 3e 20 70  umnHack</code> p
f830: 61 72 61 6d 65 74 65 72 0a 20 20 20 20 20 2a 20  arameter.     * 
f840: 20 20 20 20 20 20 20 20 20 20 20 70 72 6f 76 69             provi
f850: 64 65 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  des the name of 
f860: 6e 75 6c 6c 61 62 6c 65 20 63 6f 6c 75 6d 6e 20  nullable column 
f870: 6e 61 6d 65 20 74 6f 20 65 78 70 6c 69 63 69 74  name to explicit
f880: 6c 79 20 69 6e 73 65 72 74 20 61 20 4e 55 4c 4c  ly insert a NULL
f890: 20 69 6e 74 6f 0a 20 20 20 20 20 2a 20 20 20 20   into.     *    
f8a0: 20 20 20 20 20 20 20 20 69 6e 20 74 68 65 20 63          in the c
f8b0: 61 73 65 20 77 68 65 72 65 20 79 6f 75 72 20 3c  ase where your <
f8c0: 63 6f 64 65 3e 69 6e 69 74 69 61 6c 56 61 6c 75  code>initialValu
f8d0: 65 73 3c 2f 63 6f 64 65 3e 20 69 73 20 65 6d 70  es</code> is emp
f8e0: 74 79 2e 0a 20 20 20 20 20 2a 20 40 70 61 72 61  ty..     * @para
f8f0: 6d 20 69 6e 69 74 69 61 6c 56 61 6c 75 65 73 20  m initialValues 
f900: 74 68 69 73 20 6d 61 70 20 63 6f 6e 74 61 69 6e  this map contain
f910: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 63 6f  s the initial co
f920: 6c 75 6d 6e 20 76 61 6c 75 65 73 20 66 6f 72 20  lumn values for 
f930: 74 68 65 0a 20 20 20 20 20 2a 20 20 20 20 20 20  the.     *      
f940: 20 20 20 20 20 20 72 6f 77 2e 20 54 68 65 20 6b        row. The k
f950: 65 79 73 20 73 68 6f 75 6c 64 20 62 65 20 74 68  eys should be th
f960: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 61  e column names a
f970: 6e 64 20 74 68 65 20 76 61 6c 75 65 73 20 74 68  nd the values th
f980: 65 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20 20  e.     *        
f990: 20 20 20 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65      column value
f9a0: 73 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20  s.     * @param 
f9b0: 63 6f 6e 66 6c 69 63 74 41 6c 67 6f 72 69 74 68  conflictAlgorith
f9c0: 6d 20 66 6f 72 20 69 6e 73 65 72 74 20 63 6f 6e  m for insert con
f9d0: 66 6c 69 63 74 20 72 65 73 6f 6c 76 65 72 0a 20  flict resolver. 
f9e0: 20 20 20 20 2a 20 40 72 65 74 75 72 6e 20 74 68      * @return th
f9f0: 65 20 72 6f 77 20 49 44 20 6f 66 20 74 68 65 20  e row ID of the 
fa00: 6e 65 77 6c 79 20 69 6e 73 65 72 74 65 64 20 72  newly inserted r
fa10: 6f 77 20 4f 52 20 3c 63 6f 64 65 3e 2d 31 3c 2f  ow OR <code>-1</
fa20: 63 6f 64 65 3e 20 69 66 20 65 69 74 68 65 72 20  code> if either 
fa30: 74 68 65 0a 20 20 20 20 20 2a 20 20 20 20 20 20  the.     *      
fa40: 20 20 20 20 20 20 69 6e 70 75 74 20 70 61 72 61        input para
fa50: 6d 65 74 65 72 20 3c 63 6f 64 65 3e 63 6f 6e 66  meter <code>conf
fa60: 6c 69 63 74 41 6c 67 6f 72 69 74 68 6d 3c 2f 63  lictAlgorithm</c
fa70: 6f 64 65 3e 20 3d 20 7b 40 6c 69 6e 6b 20 23 43  ode> = {@link #C
fa80: 4f 4e 46 4c 49 43 54 5f 49 47 4e 4f 52 45 7d 0a  ONFLICT_IGNORE}.
fa90: 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 20       *          
faa0: 20 20 6f 72 20 61 6e 20 65 72 72 6f 72 20 6f 63    or an error oc
fab0: 63 75 72 72 65 64 2e 0a 20 20 20 20 20 2a 2f 0a  curred..     */.
fac0: 20 20 20 20 70 75 62 6c 69 63 20 6c 6f 6e 67 20      public long 
fad0: 69 6e 73 65 72 74 57 69 74 68 4f 6e 43 6f 6e 66  insertWithOnConf
fae0: 6c 69 63 74 28 53 74 72 69 6e 67 20 74 61 62 6c  lict(String tabl
faf0: 65 2c 20 53 74 72 69 6e 67 20 6e 75 6c 6c 43 6f  e, String nullCo
fb00: 6c 75 6d 6e 48 61 63 6b 2c 0a 20 20 20 20 20 20  lumnHack,.      
fb10: 20 20 20 20 20 20 43 6f 6e 74 65 6e 74 56 61 6c        ContentVal
fb20: 75 65 73 20 69 6e 69 74 69 61 6c 56 61 6c 75 65  ues initialValue
fb30: 73 2c 20 69 6e 74 20 63 6f 6e 66 6c 69 63 74 41  s, int conflictA
fb40: 6c 67 6f 72 69 74 68 6d 29 20 7b 0a 20 20 20 20  lgorithm) {.    
fb50: 20 20 20 20 61 63 71 75 69 72 65 52 65 66 65 72      acquireRefer
fb60: 65 6e 63 65 28 29 3b 0a 20 20 20 20 20 20 20 20  ence();.        
fb70: 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20  try {.          
fb80: 20 20 53 74 72 69 6e 67 42 75 69 6c 64 65 72 20    StringBuilder 
fb90: 73 71 6c 20 3d 20 6e 65 77 20 53 74 72 69 6e 67  sql = new String
fba0: 42 75 69 6c 64 65 72 28 29 3b 0a 20 20 20 20 20  Builder();.     
fbb0: 20 20 20 20 20 20 20 73 71 6c 2e 61 70 70 65 6e         sql.appen
fbc0: 64 28 22 49 4e 53 45 52 54 22 29 3b 0a 20 20 20  d("INSERT");.   
fbd0: 20 20 20 20 20 20 20 20 20 73 71 6c 2e 61 70 70           sql.app
fbe0: 65 6e 64 28 43 4f 4e 46 4c 49 43 54 5f 56 41 4c  end(CONFLICT_VAL
fbf0: 55 45 53 5b 63 6f 6e 66 6c 69 63 74 41 6c 67 6f  UES[conflictAlgo
fc00: 72 69 74 68 6d 5d 29 3b 0a 20 20 20 20 20 20 20  rithm]);.       
fc10: 20 20 20 20 20 73 71 6c 2e 61 70 70 65 6e 64 28       sql.append(
fc20: 22 20 49 4e 54 4f 20 22 29 3b 0a 20 20 20 20 20  " INTO ");.     
fc30: 20 20 20 20 20 20 20 73 71 6c 2e 61 70 70 65 6e         sql.appen
fc40: 64 28 74 61 62 6c 65 29 3b 0a 20 20 20 20 20 20  d(table);.      
fc50: 20 20 20 20 20 20 73 71 6c 2e 61 70 70 65 6e 64        sql.append
fc60: 28 27 28 27 29 3b 0a 0a 20 20 20 20 20 20 20 20  ('(');..        
fc70: 20 20 20 20 4f 62 6a 65 63 74 5b 5d 20 62 69 6e      Object[] bin
fc80: 64 41 72 67 73 20 3d 20 6e 75 6c 6c 3b 0a 20 20  dArgs = null;.  
fc90: 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 73 69            int si
fca0: 7a 65 20 3d 20 28 69 6e 69 74 69 61 6c 56 61 6c  ze = (initialVal
fcb0: 75 65 73 20 21 3d 20 6e 75 6c 6c 20 26 26 20 69  ues != null && i
fcc0: 6e 69 74 69 61 6c 56 61 6c 75 65 73 2e 73 69 7a  nitialValues.siz
fcd0: 65 28 29 20 3e 20 30 29 0a 20 20 20 20 20 20 20  e() > 0).       
fce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 3f 20 69               ? i
fcf0: 6e 69 74 69 61 6c 56 61 6c 75 65 73 2e 73 69 7a  nitialValues.siz
fd00: 65 28 29 20 3a 20 30 3b 0a 20 20 20 20 20 20 20  e() : 0;.       
fd10: 20 20 20 20 20 69 66 20 28 73 69 7a 65 20 3e 20       if (size > 
fd20: 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0) {.           
fd30: 20 20 20 20 20 62 69 6e 64 41 72 67 73 20 3d 20       bindArgs = 
fd40: 6e 65 77 20 4f 62 6a 65 63 74 5b 73 69 7a 65 5d  new Object[size]
fd50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
fd60: 20 20 69 6e 74 20 69 20 3d 20 30 3b 0a 20 20 20    int i = 0;.   
fd70: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
fd80: 20 28 53 74 72 69 6e 67 20 63 6f 6c 4e 61 6d 65   (String colName
fd90: 20 3a 20 69 6e 69 74 69 61 6c 56 61 6c 75 65 73   : initialValues
fda0: 2e 6b 65 79 53 65 74 28 29 29 20 7b 0a 20 20 20  .keySet()) {.   
fdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdc0: 20 73 71 6c 2e 61 70 70 65 6e 64 28 28 69 20 3e   sql.append((i >
fdd0: 20 30 29 20 3f 20 22 2c 22 20 3a 20 22 22 29 3b   0) ? "," : "");
fde0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fdf0: 20 20 20 20 20 73 71 6c 2e 61 70 70 65 6e 64 28       sql.append(
fe00: 63 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  colName);.      
fe10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 69                bi
fe20: 6e 64 41 72 67 73 5b 69 2b 2b 5d 20 3d 20 69 6e  ndArgs[i++] = in
fe30: 69 74 69 61 6c 56 61 6c 75 65 73 2e 67 65 74 28  itialValues.get(
fe40: 63 6f 6c 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20  colName);.      
fe50: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
fe60: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 2e              sql.
fe70: 61 70 70 65 6e 64 28 27 29 27 29 3b 0a 20 20 20  append(')');.   
fe80: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
fe90: 2e 61 70 70 65 6e 64 28 22 20 56 41 4c 55 45 53  .append(" VALUES
fea0: 20 28 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20   (");.          
feb0: 20 20 20 20 20 20 66 6f 72 20 28 69 20 3d 20 30        for (i = 0
fec0: 3b 20 69 20 3c 20 73 69 7a 65 3b 20 69 2b 2b 29  ; i < size; i++)
fed0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
fee0: 20 20 20 20 20 20 20 73 71 6c 2e 61 70 70 65 6e         sql.appen
fef0: 64 28 28 69 20 3e 20 30 29 20 3f 20 22 2c 3f 22  d((i > 0) ? ",?"
ff00: 20 3a 20 22 3f 22 29 3b 0a 20 20 20 20 20 20 20   : "?");.       
ff10: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
ff20: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
ff30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ff40: 73 71 6c 2e 61 70 70 65 6e 64 28 6e 75 6c 6c 43  sql.append(nullC
ff50: 6f 6c 75 6d 6e 48 61 63 6b 20 2b 20 22 29 20 56  olumnHack + ") V
ff60: 41 4c 55 45 53 20 28 4e 55 4c 4c 22 29 3b 0a 20  ALUES (NULL");. 
ff70: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
ff80: 20 20 20 20 20 20 20 20 20 73 71 6c 2e 61 70 70           sql.app
ff90: 65 6e 64 28 27 29 27 29 3b 0a 0a 20 20 20 20 20  end(')');..     
ffa0: 20 20 20 20 20 20 20 53 51 4c 69 74 65 53 74 61         SQLiteSta
ffb0: 74 65 6d 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  tement statement
ffc0: 20 3d 20 6e 65 77 20 53 51 4c 69 74 65 53 74 61   = new SQLiteSta
ffd0: 74 65 6d 65 6e 74 28 74 68 69 73 2c 20 73 71 6c  tement(this, sql
ffe0: 2e 74 6f 53 74 72 69 6e 67 28 29 2c 20 62 69 6e  .toString(), bin
fff0: 64 41 72 67 73 29 3b 0a 20 20 20 20 20 20 20 20  dArgs);.        
10000 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20      try {.      
10010 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
10020 20 73 74 61 74 65 6d 65 6e 74 2e 65 78 65 63 75   statement.execu
10030 74 65 49 6e 73 65 72 74 28 29 3b 0a 20 20 20 20  teInsert();.    
10040 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c          } finall
10050 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y {.            
10060 20 20 20 20 73 74 61 74 65 6d 65 6e 74 2e 63 6c      statement.cl
10070 6f 73 65 28 29 3b 0a 20 20 20 20 20 20 20 20 20  ose();.         
10080 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 66     }.        } f
10090 69 6e 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20  inally {.       
100a0 20 20 20 20 20 72 65 6c 65 61 73 65 52 65 66 65       releaseRefe
100b0 72 65 6e 63 65 28 29 3b 0a 20 20 20 20 20 20 20  rence();.       
100c0 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
100d0 2a 0a 20 20 20 20 20 2a 20 43 6f 6e 76 65 6e 69  *.     * Conveni
100e0 65 6e 63 65 20 6d 65 74 68 6f 64 20 66 6f 72 20  ence method for 
100f0 64 65 6c 65 74 69 6e 67 20 72 6f 77 73 20 69 6e  deleting rows in
10100 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20   the database.. 
10110 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 70 61      *.     * @pa
10120 72 61 6d 20 74 61 62 6c 65 20 74 68 65 20 74 61  ram table the ta
10130 62 6c 65 20 74 6f 20 64 65 6c 65 74 65 20 66 72  ble to delete fr
10140 6f 6d 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d  om.     * @param
10150 20 77 68 65 72 65 43 6c 61 75 73 65 20 74 68 65   whereClause the
10160 20 6f 70 74 69 6f 6e 61 6c 20 57 48 45 52 45 20   optional WHERE 
10170 63 6c 61 75 73 65 20 74 6f 20 61 70 70 6c 79 20  clause to apply 
10180 77 68 65 6e 20 64 65 6c 65 74 69 6e 67 2e 0a 20  when deleting.. 
10190 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20      *           
101a0 20 50 61 73 73 69 6e 67 20 6e 75 6c 6c 20 77 69   Passing null wi
101b0 6c 6c 20 64 65 6c 65 74 65 20 61 6c 6c 20 72 6f  ll delete all ro
101c0 77 73 2e 0a 20 20 20 20 20 2a 20 40 70 61 72 61  ws..     * @para
101d0 6d 20 77 68 65 72 65 41 72 67 73 20 59 6f 75 20  m whereArgs You 
101e0 6d 61 79 20 69 6e 63 6c 75 64 65 20 3f 73 20 69  may include ?s i
101f0 6e 20 74 68 65 20 77 68 65 72 65 20 63 6c 61 75  n the where clau
10200 73 65 2c 20 77 68 69 63 68 0a 20 20 20 20 20 2a  se, which.     *
10210 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6c 6c              will
10220 20 62 65 20 72 65 70 6c 61 63 65 64 20 62 79 20   be replaced by 
10230 74 68 65 20 76 61 6c 75 65 73 20 66 72 6f 6d 20  the values from 
10240 77 68 65 72 65 41 72 67 73 2e 20 54 68 65 20 76  whereArgs. The v
10250 61 6c 75 65 73 0a 20 20 20 20 20 2a 20 20 20 20  alues.     *    
10260 20 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65 20          will be 
10270 62 6f 75 6e 64 20 61 73 20 53 74 72 69 6e 67 73  bound as Strings
10280 2e 0a 20 20 20 20 20 2a 20 40 72 65 74 75 72 6e  ..     * @return
10290 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72   the number of r
102a0 6f 77 73 20 61 66 66 65 63 74 65 64 20 69 66 20  ows affected if 
102b0 61 20 77 68 65 72 65 43 6c 61 75 73 65 20 69 73  a whereClause is
102c0 20 70 61 73 73 65 64 20 69 6e 2c 20 30 0a 20 20   passed in, 0.  
102d0 20 20 20 2a 20 20 20 20 20 20 20 20 20 6f 74 68     *         oth
102e0 65 72 77 69 73 65 2e 20 54 6f 20 72 65 6d 6f 76  erwise. To remov
102f0 65 20 61 6c 6c 20 72 6f 77 73 20 61 6e 64 20 67  e all rows and g
10300 65 74 20 61 20 63 6f 75 6e 74 20 70 61 73 73 20  et a count pass 
10310 22 31 22 20 61 73 20 74 68 65 0a 20 20 20 20 20  "1" as the.     
10320 2a 20 20 20 20 20 20 20 20 20 77 68 65 72 65 43  *         whereC
10330 6c 61 75 73 65 2e 0a 20 20 20 20 20 2a 2f 0a 20  lause..     */. 
10340 20 20 20 70 75 62 6c 69 63 20 69 6e 74 20 64 65     public int de
10350 6c 65 74 65 28 53 74 72 69 6e 67 20 74 61 62 6c  lete(String tabl
10360 65 2c 20 53 74 72 69 6e 67 20 77 68 65 72 65 43  e, String whereC
10370 6c 61 75 73 65 2c 20 53 74 72 69 6e 67 5b 5d 20  lause, String[] 
10380 77 68 65 72 65 41 72 67 73 29 20 7b 0a 20 20 20  whereArgs) {.   
10390 20 20 20 20 20 61 63 71 75 69 72 65 52 65 66 65       acquireRefe
103a0 72 65 6e 63 65 28 29 3b 0a 20 20 20 20 20 20 20  rence();.       
103b0 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20   try {.         
103c0 20 20 20 53 51 4c 69 74 65 53 74 61 74 65 6d 65     SQLiteStateme
103d0 6e 74 20 73 74 61 74 65 6d 65 6e 74 20 3d 20 20  nt statement =  
103e0 6e 65 77 20 53 51 4c 69 74 65 53 74 61 74 65 6d  new SQLiteStatem
103f0 65 6e 74 28 74 68 69 73 2c 20 22 44 45 4c 45 54  ent(this, "DELET
10400 45 20 46 52 4f 4d 20 22 20 2b 20 74 61 62 6c 65  E FROM " + table
10410 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   +.             
10420 20 20 20 20 20 20 20 28 21 54 65 78 74 55 74 69         (!TextUti
10430 6c 73 2e 69 73 45 6d 70 74 79 28 77 68 65 72 65  ls.isEmpty(where
10440 43 6c 61 75 73 65 29 20 3f 20 22 20 57 48 45 52  Clause) ? " WHER
10450 45 20 22 20 2b 20 77 68 65 72 65 43 6c 61 75 73  E " + whereClaus
10460 65 20 3a 20 22 22 29 2c 20 77 68 65 72 65 41 72  e : ""), whereAr
10470 67 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  gs);.           
10480 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20   try {.         
10490 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 74         return st
104a0 61 74 65 6d 65 6e 74 2e 65 78 65 63 75 74 65 55  atement.executeU
104b0 70 64 61 74 65 44 65 6c 65 74 65 28 29 3b 0a 20  pdateDelete();. 
104c0 20 20 20 20 20 20 20 20 20 20 20 7d 20 66 69 6e             } fin
104d0 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20 20 20  ally {.         
104e0 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74         statement
104f0 2e 63 6c 6f 73 65 28 29 3b 0a 20 20 20 20 20 20  .close();.      
10500 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
10510 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a 20 20 20 20  } finally {.    
10520 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65 52          releaseR
10530 65 66 65 72 65 6e 63 65 28 29 3b 0a 20 20 20 20  eference();.    
10540 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
10550 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 43 6f 6e 76   /**.     * Conv
10560 65 6e 69 65 6e 63 65 20 6d 65 74 68 6f 64 20 66  enience method f
10570 6f 72 20 75 70 64 61 74 69 6e 67 20 72 6f 77 73  or updating rows
10580 20 69 6e 20 74 68 65 20 64 61 74 61 62 61 73 65   in the database
10590 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20  ..     *.     * 
105a0 40 70 61 72 61 6d 20 74 61 62 6c 65 20 74 68 65  @param table the
105b0 20 74 61 62 6c 65 20 74 6f 20 75 70 64 61 74 65   table to update
105c0 20 69 6e 0a 20 20 20 20 20 2a 20 40 70 61 72 61   in.     * @para
105d0 6d 20 76 61 6c 75 65 73 20 61 20 6d 61 70 20 66  m values a map f
105e0 72 6f 6d 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  rom column names
105f0 20 74 6f 20 6e 65 77 20 63 6f 6c 75 6d 6e 20 76   to new column v
10600 61 6c 75 65 73 2e 20 6e 75 6c 6c 20 69 73 20 61  alues. null is a
10610 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20  .     *         
10620 20 20 20 76 61 6c 69 64 20 76 61 6c 75 65 20 74     valid value t
10630 68 61 74 20 77 69 6c 6c 20 62 65 20 74 72 61 6e  hat will be tran
10640 73 6c 61 74 65 64 20 74 6f 20 4e 55 4c 4c 2e 0a  slated to NULL..
10650 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 77 68       * @param wh
10660 65 72 65 43 6c 61 75 73 65 20 74 68 65 20 6f 70  ereClause the op
10670 74 69 6f 6e 61 6c 20 57 48 45 52 45 20 63 6c 61  tional WHERE cla
10680 75 73 65 20 74 6f 20 61 70 70 6c 79 20 77 68 65  use to apply whe
10690 6e 20 75 70 64 61 74 69 6e 67 2e 0a 20 20 20 20  n updating..    
106a0 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 50 61   *            Pa
106b0 73 73 69 6e 67 20 6e 75 6c 6c 20 77 69 6c 6c 20  ssing null will 
106c0 75 70 64 61 74 65 20 61 6c 6c 20 72 6f 77 73 2e  update all rows.
106d0 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 77  .     * @param w
106e0 68 65 72 65 41 72 67 73 20 59 6f 75 20 6d 61 79  hereArgs You may
106f0 20 69 6e 63 6c 75 64 65 20 3f 73 20 69 6e 20 74   include ?s in t
10700 68 65 20 77 68 65 72 65 20 63 6c 61 75 73 65 2c  he where clause,
10710 20 77 68 69 63 68 0a 20 20 20 20 20 2a 20 20 20   which.     *   
10720 20 20 20 20 20 20 20 20 20 77 69 6c 6c 20 62 65           will be
10730 20 72 65 70 6c 61 63 65 64 20 62 79 20 74 68 65   replaced by the
10740 20 76 61 6c 75 65 73 20 66 72 6f 6d 20 77 68 65   values from whe
10750 72 65 41 72 67 73 2e 20 54 68 65 20 76 61 6c 75  reArgs. The valu
10760 65 73 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20  es.     *       
10770 20 20 20 20 20 77 69 6c 6c 20 62 65 20 62 6f 75       will be bou
10780 6e 64 20 61 73 20 53 74 72 69 6e 67 73 2e 0a 20  nd as Strings.. 
10790 20 20 20 20 2a 20 40 72 65 74 75 72 6e 20 74 68      * @return th
107a0 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77 73  e number of rows
107b0 20 61 66 66 65 63 74 65 64 0a 20 20 20 20 20 2a   affected.     *
107c0 2f 0a 20 20 20 20 70 75 62 6c 69 63 20 69 6e 74  /.    public int
107d0 20 75 70 64 61 74 65 28 53 74 72 69 6e 67 20 74   update(String t
107e0 61 62 6c 65 2c 20 43 6f 6e 74 65 6e 74 56 61 6c  able, ContentVal
107f0 75 65 73 20 76 61 6c 75 65 73 2c 20 53 74 72 69  ues values, Stri
10800 6e 67 20 77 68 65 72 65 43 6c 61 75 73 65 2c 20  ng whereClause, 
10810 53 74 72 69 6e 67 5b 5d 20 77 68 65 72 65 41 72  String[] whereAr
10820 67 73 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65  gs) {.        re
10830 74 75 72 6e 20 75 70 64 61 74 65 57 69 74 68 4f  turn updateWithO
10840 6e 43 6f 6e 66 6c 69 63 74 28 74 61 62 6c 65 2c  nConflict(table,
10850 20 76 61 6c 75 65 73 2c 20 77 68 65 72 65 43 6c   values, whereCl
10860 61 75 73 65 2c 20 77 68 65 72 65 41 72 67 73 2c  ause, whereArgs,
10870 20 43 4f 4e 46 4c 49 43 54 5f 4e 4f 4e 45 29 3b   CONFLICT_NONE);
10880 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a  .    }..    /**.
10890 20 20 20 20 20 2a 20 43 6f 6e 76 65 6e 69 65 6e       * Convenien
108a0 63 65 20 6d 65 74 68 6f 64 20 66 6f 72 20 75 70  ce method for up
108b0 64 61 74 69 6e 67 20 72 6f 77 73 20 69 6e 20 74  dating rows in t
108c0 68 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20  he database..   
108d0 20 20 2a 0a 20 20 20 20 20 2a 20 40 70 61 72 61    *.     * @para
108e0 6d 20 74 61 62 6c 65 20 74 68 65 20 74 61 62 6c  m table the tabl
108f0 65 20 74 6f 20 75 70 64 61 74 65 20 69 6e 0a 20  e to update in. 
10900 20 20 20 20 2a 20 40 70 61 72 61 6d 20 76 61 6c      * @param val
10910 75 65 73 20 61 20 6d 61 70 20 66 72 6f 6d 20 63  ues a map from c
10920 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 74 6f 20 6e  olumn names to n
10930 65 77 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 73  ew column values
10940 2e 20 6e 75 6c 6c 20 69 73 20 61 0a 20 20 20 20  . null is a.    
10950 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 76 61   *            va
10960 6c 69 64 20 76 61 6c 75 65 20 74 68 61 74 20 77  lid value that w
10970 69 6c 6c 20 62 65 20 74 72 61 6e 73 6c 61 74 65  ill be translate
10980 64 20 74 6f 20 4e 55 4c 4c 2e 0a 20 20 20 20 20  d to NULL..     
10990 2a 20 40 70 61 72 61 6d 20 77 68 65 72 65 43 6c  * @param whereCl
109a0 61 75 73 65 20 74 68 65 20 6f 70 74 69 6f 6e 61  ause the optiona
109b0 6c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 74  l WHERE clause t
109c0 6f 20 61 70 70 6c 79 20 77 68 65 6e 20 75 70 64  o apply when upd
109d0 61 74 69 6e 67 2e 0a 20 20 20 20 20 2a 20 20 20  ating..     *   
109e0 20 20 20 20 20 20 20 20 20 50 61 73 73 69 6e 67           Passing
109f0 20 6e 75 6c 6c 20 77 69 6c 6c 20 75 70 64 61 74   null will updat
10a00 65 20 61 6c 6c 20 72 6f 77 73 2e 0a 20 20 20 20  e all rows..    
10a10 20 2a 20 40 70 61 72 61 6d 20 77 68 65 72 65 41   * @param whereA
10a20 72 67 73 20 59 6f 75 20 6d 61 79 20 69 6e 63 6c  rgs You may incl
10a30 75 64 65 20 3f 73 20 69 6e 20 74 68 65 20 77 68  ude ?s in the wh
10a40 65 72 65 20 63 6c 61 75 73 65 2c 20 77 68 69 63  ere clause, whic
10a50 68 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20 20  h.     *        
10a60 20 20 20 20 77 69 6c 6c 20 62 65 20 72 65 70 6c      will be repl
10a70 61 63 65 64 20 62 79 20 74 68 65 20 76 61 6c 75  aced by the valu
10a80 65 73 20 66 72 6f 6d 20 77 68 65 72 65 41 72 67  es from whereArg
10a90 73 2e 20 54 68 65 20 76 61 6c 75 65 73 0a 20 20  s. The values.  
10aa0 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20 20     *            
10ab0 77 69 6c 6c 20 62 65 20 62 6f 75 6e 64 20 61 73  will be bound as
10ac0 20 53 74 72 69 6e 67 73 2e 0a 20 20 20 20 20 2a   Strings..     *
10ad0 20 40 70 61 72 61 6d 20 63 6f 6e 66 6c 69 63 74   @param conflict
10ae0 41 6c 67 6f 72 69 74 68 6d 20 66 6f 72 20 75 70  Algorithm for up
10af0 64 61 74 65 20 63 6f 6e 66 6c 69 63 74 20 72 65  date conflict re
10b00 73 6f 6c 76 65 72 0a 20 20 20 20 20 2a 20 40 72  solver.     * @r
10b10 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
10b20 20 6f 66 20 72 6f 77 73 20 61 66 66 65 63 74 65   of rows affecte
10b30 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 75  d.     */.    pu
10b40 62 6c 69 63 20 69 6e 74 20 75 70 64 61 74 65 57  blic int updateW
10b50 69 74 68 4f 6e 43 6f 6e 66 6c 69 63 74 28 53 74  ithOnConflict(St
10b60 72 69 6e 67 20 74 61 62 6c 65 2c 20 43 6f 6e 74  ring table, Cont
10b70 65 6e 74 56 61 6c 75 65 73 20 76 61 6c 75 65 73  entValues values
10b80 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 74  ,.            St
10b90 72 69 6e 67 20 77 68 65 72 65 43 6c 61 75 73 65  ring whereClause
10ba0 2c 20 53 74 72 69 6e 67 5b 5d 20 77 68 65 72 65  , String[] where
10bb0 41 72 67 73 2c 20 69 6e 74 20 63 6f 6e 66 6c 69  Args, int confli
10bc0 63 74 41 6c 67 6f 72 69 74 68 6d 29 20 7b 0a 20  ctAlgorithm) {. 
10bd0 20 20 20 20 20 20 20 69 66 20 28 76 61 6c 75 65         if (value
10be0 73 20 3d 3d 20 6e 75 6c 6c 20 7c 7c 20 76 61 6c  s == null || val
10bf0 75 65 73 2e 73 69 7a 65 28 29 20 3d 3d 20 30 29  ues.size() == 0)
10c00 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74   {.            t
10c10 68 72 6f 77 20 6e 65 77 20 49 6c 6c 65 67 61 6c  hrow new Illegal
10c20 41 72 67 75 6d 65 6e 74 45 78 63 65 70 74 69 6f  ArgumentExceptio
10c30 6e 28 22 45 6d 70 74 79 20 76 61 6c 75 65 73 22  n("Empty values"
10c40 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
10c50 20 20 20 20 20 20 61 63 71 75 69 72 65 52 65 66        acquireRef
10c60 65 72 65 6e 63 65 28 29 3b 0a 20 20 20 20 20 20  erence();.      
10c70 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20    try {.        
10c80 20 20 20 20 53 74 72 69 6e 67 42 75 69 6c 64 65      StringBuilde
10c90 72 20 73 71 6c 20 3d 20 6e 65 77 20 53 74 72 69  r sql = new Stri
10ca0 6e 67 42 75 69 6c 64 65 72 28 31 32 30 29 3b 0a  ngBuilder(120);.
10cb0 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 2e              sql.
10cc0 61 70 70 65 6e 64 28 22 55 50 44 41 54 45 20 22  append("UPDATE "
10cd0 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
10ce0 71 6c 2e 61 70 70 65 6e 64 28 43 4f 4e 46 4c 49  ql.append(CONFLI
10cf0 43 54 5f 56 41 4c 55 45 53 5b 63 6f 6e 66 6c 69  CT_VALUES[confli
10d00 63 74 41 6c 67 6f 72 69 74 68 6d 5d 29 3b 0a 20  ctAlgorithm]);. 
10d10 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 2e 61             sql.a
10d20 70 70 65 6e 64 28 74 61 62 6c 65 29 3b 0a 20 20  ppend(table);.  
10d30 20 20 20 20 20 20 20 20 20 20 73 71 6c 2e 61 70            sql.ap
10d40 70 65 6e 64 28 22 20 53 45 54 20 22 29 3b 0a 0a  pend(" SET ");..
10d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 6d              // m
10d60 6f 76 65 20 61 6c 6c 20 62 69 6e 64 20 61 72 67  ove all bind arg
10d70 73 20 74 6f 20 6f 6e 65 20 61 72 72 61 79 0a 20  s to one array. 
10d80 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 73             int s
10d90 65 74 56 61 6c 75 65 73 53 69 7a 65 20 3d 20 76  etValuesSize = v
10da0 61 6c 75 65 73 2e 73 69 7a 65 28 29 3b 0a 20 20  alues.size();.  
10db0 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 62 69            int bi
10dc0 6e 64 41 72 67 73 53 69 7a 65 20 3d 20 28 77 68  ndArgsSize = (wh
10dd0 65 72 65 41 72 67 73 20 3d 3d 20 6e 75 6c 6c 29  ereArgs == null)
10de0 20 3f 20 73 65 74 56 61 6c 75 65 73 53 69 7a 65   ? setValuesSize
10df0 20 3a 20 28 73 65 74 56 61 6c 75 65 73 53 69 7a   : (setValuesSiz
10e00 65 20 2b 20 77 68 65 72 65 41 72 67 73 2e 6c 65  e + whereArgs.le
10e10 6e 67 74 68 29 3b 0a 20 20 20 20 20 20 20 20 20  ngth);.         
10e20 20 20 20 4f 62 6a 65 63 74 5b 5d 20 62 69 6e 64     Object[] bind
10e30 41 72 67 73 20 3d 20 6e 65 77 20 4f 62 6a 65 63  Args = new Objec
10e40 74 5b 62 69 6e 64 41 72 67 73 53 69 7a 65 5d 3b  t[bindArgsSize];
10e50 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
10e60 20 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20   i = 0;.        
10e70 20 20 20 20 66 6f 72 20 28 53 74 72 69 6e 67 20      for (String 
10e80 63 6f 6c 4e 61 6d 65 20 3a 20 76 61 6c 75 65 73  colName : values
10e90 2e 6b 65 79 53 65 74 28 29 29 20 7b 0a 20 20 20  .keySet()) {.   
10ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
10eb0 2e 61 70 70 65 6e 64 28 28 69 20 3e 20 30 29 20  .append((i > 0) 
10ec0 3f 20 22 2c 22 20 3a 20 22 22 29 3b 0a 20 20 20  ? "," : "");.   
10ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
10ee0 2e 61 70 70 65 6e 64 28 63 6f 6c 4e 61 6d 65 29  .append(colName)
10ef0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
10f00 20 20 62 69 6e 64 41 72 67 73 5b 69 2b 2b 5d 20    bindArgs[i++] 
10f10 3d 20 76 61 6c 75 65 73 2e 67 65 74 28 63 6f 6c  = values.get(col
10f20 4e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Name);.         
10f30 20 20 20 20 20 20 20 73 71 6c 2e 61 70 70 65 6e         sql.appen
10f40 64 28 22 3d 3f 22 29 3b 0a 20 20 20 20 20 20 20  d("=?");.       
10f50 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
10f60 20 20 20 69 66 20 28 77 68 65 72 65 41 72 67 73     if (whereArgs
10f70 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20   != null) {.    
10f80 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20              for 
10f90 28 69 20 3d 20 73 65 74 56 61 6c 75 65 73 53 69  (i = setValuesSi
10fa0 7a 65 3b 20 69 20 3c 20 62 69 6e 64 41 72 67 73  ze; i < bindArgs
10fb0 53 69 7a 65 3b 20 69 2b 2b 29 20 7b 0a 20 20 20  Size; i++) {.   
10fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10fd0 20 62 69 6e 64 41 72 67 73 5b 69 5d 20 3d 20 77   bindArgs[i] = w
10fe0 68 65 72 65 41 72 67 73 5b 69 20 2d 20 73 65 74  hereArgs[i - set
10ff0 56 61 6c 75 65 73 53 69 7a 65 5d 3b 0a 20 20 20  ValuesSize];.   
11000 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
11010 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
11020 20 20 20 20 20 20 20 20 20 69 66 20 28 21 54 65           if (!Te
11030 78 74 55 74 69 6c 73 2e 69 73 45 6d 70 74 79 28  xtUtils.isEmpty(
11040 77 68 65 72 65 43 6c 61 75 73 65 29 29 20 7b 0a  whereClause)) {.
11050 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11060 73 71 6c 2e 61 70 70 65 6e 64 28 22 20 57 48 45  sql.append(" WHE
11070 52 45 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20  RE ");.         
11080 20 20 20 20 20 20 20 73 71 6c 2e 61 70 70 65 6e         sql.appen
11090 64 28 77 68 65 72 65 43 6c 61 75 73 65 29 3b 0a  d(whereClause);.
110a0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
110b0 20 20 20 20 20 20 20 20 20 20 20 53 51 4c 69 74             SQLit
110c0 65 53 74 61 74 65 6d 65 6e 74 20 73 74 61 74 65  eStatement state
110d0 6d 65 6e 74 20 3d 20 6e 65 77 20 53 51 4c 69 74  ment = new SQLit
110e0 65 53 74 61 74 65 6d 65 6e 74 28 74 68 69 73 2c  eStatement(this,
110f0 20 73 71 6c 2e 74 6f 53 74 72 69 6e 67 28 29 2c   sql.toString(),
11100 20 62 69 6e 64 41 72 67 73 29 3b 0a 20 20 20 20   bindArgs);.    
11110 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20          try {.  
11120 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
11130 74 75 72 6e 20 73 74 61 74 65 6d 65 6e 74 2e 65  turn statement.e
11140 78 65 63 75 74 65 55 70 64 61 74 65 44 65 6c 65  xecuteUpdateDele
11150 74 65 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  te();.          
11160 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a 20 20    } finally {.  
11170 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 74                st
11180 61 74 65 6d 65 6e 74 2e 63 6c 6f 73 65 28 29 3b  atement.close();
11190 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
111a0 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79         } finally
111b0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72   {.            r
111c0 65 6c 65 61 73 65 52 65 66 65 72 65 6e 63 65 28  eleaseReference(
111d0 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
111e0 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20   }..    /**.    
111f0 20 2a 20 45 78 65 63 75 74 65 20 61 20 73 69 6e   * Execute a sin
11200 67 6c 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  gle SQL statemen
11210 74 20 74 68 61 74 20 69 73 20 4e 4f 54 20 61 20  t that is NOT a 
11220 53 45 4c 45 43 54 0a 20 20 20 20 20 2a 20 6f 72  SELECT.     * or
11230 20 61 6e 79 20 6f 74 68 65 72 20 53 51 4c 20 73   any other SQL s
11240 74 61 74 65 6d 65 6e 74 20 74 68 61 74 20 72 65  tatement that re
11250 74 75 72 6e 73 20 64 61 74 61 2e 0a 20 20 20 20  turns data..    
11260 20 2a 20 3c 70 3e 0a 20 20 20 20 20 2a 20 49 74   * <p>.     * It
11270 20 68 61 73 20 6e 6f 20 6d 65 61 6e 73 20 74 6f   has no means to
11280 20 72 65 74 75 72 6e 20 61 6e 79 20 64 61 74 61   return any data
11290 20 28 73 75 63 68 20 61 73 20 74 68 65 20 6e 75   (such as the nu
112a0 6d 62 65 72 20 6f 66 20 61 66 66 65 63 74 65 64  mber of affected
112b0 20 72 6f 77 73 29 2e 0a 20 20 20 20 20 2a 20 49   rows)..     * I
112c0 6e 73 74 65 61 64 2c 20 79 6f 75 27 72 65 20 65  nstead, you're e
112d0 6e 63 6f 75 72 61 67 65 64 20 74 6f 20 75 73 65  ncouraged to use
112e0 20 7b 40 6c 69 6e 6b 20 23 69 6e 73 65 72 74 28   {@link #insert(
112f0 53 74 72 69 6e 67 2c 20 53 74 72 69 6e 67 2c 20  String, String, 
11300 43 6f 6e 74 65 6e 74 56 61 6c 75 65 73 29 7d 2c  ContentValues)},
11310 0a 20 20 20 20 20 2a 20 7b 40 6c 69 6e 6b 20 23  .     * {@link #
11320 75 70 64 61 74 65 28 53 74 72 69 6e 67 2c 20 43  update(String, C
11330 6f 6e 74 65 6e 74 56 61 6c 75 65 73 2c 20 53 74  ontentValues, St
11340 72 69 6e 67 2c 20 53 74 72 69 6e 67 5b 5d 29 7d  ring, String[])}
11350 2c 20 65 74 20 61 6c 2c 20 77 68 65 6e 20 70 6f  , et al, when po
11360 73 73 69 62 6c 65 2e 0a 20 20 20 20 20 2a 20 3c  ssible..     * <
11370 2f 70 3e 0a 20 20 20 20 20 2a 20 3c 70 3e 0a 20  /p>.     * <p>. 
11380 20 20 20 20 2a 20 57 68 65 6e 20 75 73 69 6e 67      * When using
11390 20 7b 40 6c 69 6e 6b 20 23 65 6e 61 62 6c 65 57   {@link #enableW
113a0 72 69 74 65 41 68 65 61 64 4c 6f 67 67 69 6e 67  riteAheadLogging
113b0 28 29 7d 2c 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  ()}, journal_mod
113c0 65 20 69 73 0a 20 20 20 20 20 2a 20 61 75 74 6f  e is.     * auto
113d0 6d 61 74 69 63 61 6c 6c 79 20 6d 61 6e 61 67 65  matically manage
113e0 64 20 62 79 20 74 68 69 73 20 63 6c 61 73 73 2e  d by this class.
113f0 20 53 6f 2c 20 64 6f 20 6e 6f 74 20 73 65 74 20   So, do not set 
11400 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 0a 20 20 20  journal_mode.   
11410 20 20 2a 20 75 73 69 6e 67 20 22 50 52 41 47 4d    * using "PRAGM
11420 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 27 3c  A journal_mode'<
11430 76 61 6c 75 65 3e 22 20 73 74 61 74 65 6d 65 6e  value>" statemen
11440 74 20 69 66 20 79 6f 75 72 20 61 70 70 20 69 73  t if your app is
11450 20 75 73 69 6e 67 0a 20 20 20 20 20 2a 20 7b 40   using.     * {@
11460 6c 69 6e 6b 20 23 65 6e 61 62 6c 65 57 72 69 74  link #enableWrit
11470 65 41 68 65 61 64 4c 6f 67 67 69 6e 67 28 29 7d  eAheadLogging()}
11480 0a 20 20 20 20 20 2a 20 3c 2f 70 3e 0a 20 20 20  .     * </p>.   
11490 20 20 2a 0a 20 20 20 20 20 2a 20 40 70 61 72 61    *.     * @para
114a0 6d 20 73 71 6c 20 74 68 65 20 53 51 4c 20 73 74  m sql the SQL st
114b0 61 74 65 6d 65 6e 74 20 74 6f 20 62 65 20 65 78  atement to be ex
114c0 65 63 75 74 65 64 2e 20 4d 75 6c 74 69 70 6c 65  ecuted. Multiple
114d0 20 73 74 61 74 65 6d 65 6e 74 73 20 73 65 70 61   statements sepa
114e0 72 61 74 65 64 20 62 79 20 73 65 6d 69 63 6f 6c  rated by semicol
114f0 6f 6e 73 20 61 72 65 0a 20 20 20 20 20 2a 20 6e  ons are.     * n
11500 6f 74 20 73 75 70 70 6f 72 74 65 64 2e 0a 20 20  ot supported..  
11510 20 20 20 2a 20 40 74 68 72 6f 77 73 20 53 51 4c     * @throws SQL
11520 45 78 63 65 70 74 69 6f 6e 20 69 66 20 74 68 65  Exception if the
11530 20 53 51 4c 20 73 74 72 69 6e 67 20 69 73 20 69   SQL string is i
11540 6e 76 61 6c 69 64 0a 20 20 20 20 20 2a 2f 0a 20  nvalid.     */. 
11550 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20 65     public void e
11560 78 65 63 53 51 4c 28 53 74 72 69 6e 67 20 73 71  xecSQL(String sq
11570 6c 29 20 74 68 72 6f 77 73 20 53 51 4c 45 78 63  l) throws SQLExc
11580 65 70 74 69 6f 6e 20 7b 0a 20 20 20 20 20 20 20  eption {.       
11590 20 65 78 65 63 75 74 65 53 71 6c 28 73 71 6c 2c   executeSql(sql,
115a0 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20   null);.    }.. 
115b0 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 45 78     /**.     * Ex
115c0 65 63 75 74 65 20 61 20 73 69 6e 67 6c 65 20 53  ecute a single S
115d0 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 68 61  QL statement tha
115e0 74 20 69 73 20 4e 4f 54 20 61 20 53 45 4c 45 43  t is NOT a SELEC
115f0 54 2f 49 4e 53 45 52 54 2f 55 50 44 41 54 45 2f  T/INSERT/UPDATE/
11600 44 45 4c 45 54 45 2e 0a 20 20 20 20 20 2a 20 3c  DELETE..     * <
11610 70 3e 0a 20 20 20 20 20 2a 20 46 6f 72 20 49 4e  p>.     * For IN
11620 53 45 52 54 20 73 74 61 74 65 6d 65 6e 74 73 2c  SERT statements,
11630 20 75 73 65 20 61 6e 79 20 6f 66 20 74 68 65 20   use any of the 
11640 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 65 61  following instea
11650 64 2e 0a 20 20 20 20 20 2a 20 3c 75 6c 3e 0a 20  d..     * <ul>. 
11660 20 20 20 20 2a 20 20 20 3c 6c 69 3e 7b 40 6c 69      *   <li>{@li
11670 6e 6b 20 23 69 6e 73 65 72 74 28 53 74 72 69 6e  nk #insert(Strin
11680 67 2c 20 53 74 72 69 6e 67 2c 20 43 6f 6e 74 65  g, String, Conte
11690 6e 74 56 61 6c 75 65 73 29 7d 3c 2f 6c 69 3e 0a  ntValues)}</li>.
116a0 20 20 20 20 20 2a 20 20 20 3c 6c 69 3e 7b 40 6c       *   <li>{@l
116b0 69 6e 6b 20 23 69 6e 73 65 72 74 4f 72 54 68 72  ink #insertOrThr
116c0 6f 77 28 53 74 72 69 6e 67 2c 20 53 74 72 69 6e  ow(String, Strin
116d0 67 2c 20 43 6f 6e 74 65 6e 74 56 61 6c 75 65 73  g, ContentValues
116e0 29 7d 3c 2f 6c 69 3e 0a 20 20 20 20 20 2a 20 20  )}</li>.     *  
116f0 20 3c 6c 69 3e 7b 40 6c 69 6e 6b 20 23 69 6e 73   <li>{@link #ins
11700 65 72 74 57 69 74 68 4f 6e 43 6f 6e 66 6c 69 63  ertWithOnConflic
11710 74 28 53 74 72 69 6e 67 2c 20 53 74 72 69 6e 67  t(String, String
11720 2c 20 43 6f 6e 74 65 6e 74 56 61 6c 75 65 73 2c  , ContentValues,
11730 20 69 6e 74 29 7d 3c 2f 6c 69 3e 0a 20 20 20 20   int)}</li>.    
11740 20 2a 20 3c 2f 75 6c 3e 0a 20 20 20 20 20 2a 20   * </ul>.     * 
11750 3c 70 3e 0a 20 20 20 20 20 2a 20 46 6f 72 20 55  <p>.     * For U
11760 50 44 41 54 45 20 73 74 61 74 65 6d 65 6e 74 73  PDATE statements
11770 2c 20 75 73 65 20 61 6e 79 20 6f 66 20 74 68 65  , use any of the
11780 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 65   following inste
11790 61 64 2e 0a 20 20 20 20 20 2a 20 3c 75 6c 3e 0a  ad..     * <ul>.
117a0 20 20 20 20 20 2a 20 20 20 3c 6c 69 3e 7b 40 6c       *   <li>{@l
117b0 69 6e 6b 20 23 75 70 64 61 74 65 28 53 74 72 69  ink #update(Stri
117c0 6e 67 2c 20 43 6f 6e 74 65 6e 74 56 61 6c 75 65  ng, ContentValue
117d0 73 2c 20 53 74 72 69 6e 67 2c 20 53 74 72 69 6e  s, String, Strin
117e0 67 5b 5d 29 7d 3c 2f 6c 69 3e 0a 20 20 20 20 20  g[])}</li>.     
117f0 2a 20 20 20 3c 6c 69 3e 7b 40 6c 69 6e 6b 20 23  *   <li>{@link #
11800 75 70 64 61 74 65 57 69 74 68 4f 6e 43 6f 6e 66  updateWithOnConf
11810 6c 69 63 74 28 53 74 72 69 6e 67 2c 20 43 6f 6e  lict(String, Con
11820 74 65 6e 74 56 61 6c 75 65 73 2c 20 53 74 72 69  tentValues, Stri
11830 6e 67 2c 20 53 74 72 69 6e 67 5b 5d 2c 20 69 6e  ng, String[], in
11840 74 29 7d 3c 2f 6c 69 3e 0a 20 20 20 20 20 2a 20  t)}</li>.     * 
11850 3c 2f 75 6c 3e 0a 20 20 20 20 20 2a 20 3c 70 3e  </ul>.     * <p>
11860 0a 20 20 20 20 20 2a 20 46 6f 72 20 44 45 4c 45  .     * For DELE
11870 54 45 20 73 74 61 74 65 6d 65 6e 74 73 2c 20 75  TE statements, u
11880 73 65 20 61 6e 79 20 6f 66 20 74 68 65 20 66 6f  se any of the fo
11890 6c 6c 6f 77 69 6e 67 20 69 6e 73 74 65 61 64 2e  llowing instead.
118a0 0a 20 20 20 20 20 2a 20 3c 75 6c 3e 0a 20 20 20  .     * <ul>.   
118b0 20 20 2a 20 20 20 3c 6c 69 3e 7b 40 6c 69 6e 6b    *   <li>{@link
118c0 20 23 64 65 6c 65 74 65 28 53 74 72 69 6e 67 2c   #delete(String,
118d0 20 53 74 72 69 6e 67 2c 20 53 74 72 69 6e 67 5b   String, String[
118e0 5d 29 7d 3c 2f 6c 69 3e 0a 20 20 20 20 20 2a 20  ])}</li>.     * 
118f0 3c 2f 75 6c 3e 0a 20 20 20 20 20 2a 20 3c 70 3e  </ul>.     * <p>
11900 0a 20 20 20 20 20 2a 20 46 6f 72 20 65 78 61 6d  .     * For exam
11910 70 6c 65 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69  ple, the followi
11920 6e 67 20 61 72 65 20 67 6f 6f 64 20 63 61 6e 64  ng are good cand
11930 69 64 61 74 65 73 20 66 6f 72 20 75 73 69 6e 67  idates for using
11940 20 74 68 69 73 20 6d 65 74 68 6f 64 3a 0a 20 20   this method:.  
11950 20 20 20 2a 20 3c 75 6c 3e 0a 20 20 20 20 20 2a     * <ul>.     *
11960 20 20 20 3c 6c 69 3e 41 4c 54 45 52 20 54 41 42     <li>ALTER TAB
11970 4c 45 3c 2f 6c 69 3e 0a 20 20 20 20 20 2a 20 20  LE</li>.     *  
11980 20 3c 6c 69 3e 43 52 45 41 54 45 20 6f 72 20 44   <li>CREATE or D
11990 52 4f 50 20 74 61 62 6c 65 20 2f 20 74 72 69 67  ROP table / trig
119a0 67 65 72 20 2f 20 76 69 65 77 20 2f 20 69 6e 64  ger / view / ind
119b0 65 78 20 2f 20 76 69 72 74 75 61 6c 20 74 61 62  ex / virtual tab
119c0 6c 65 3c 2f 6c 69 3e 0a 20 20 20 20 20 2a 20 20  le</li>.     *  
119d0 20 3c 6c 69 3e 52 45 49 4e 44 45 58 3c 2f 6c 69   <li>REINDEX</li
119e0 3e 0a 20 20 20 20 20 2a 20 20 20 3c 6c 69 3e 52  >.     *   <li>R
119f0 45 4c 45 41 53 45 3c 2f 6c 69 3e 0a 20 20 20 20  ELEASE</li>.    
11a00 20 2a 20 20 20 3c 6c 69 3e 53 41 56 45 50 4f 49   *   <li>SAVEPOI
11a10 4e 54 3c 2f 6c 69 3e 0a 20 20 20 20 20 2a 20 20  NT</li>.     *  
11a20 20 3c 6c 69 3e 50 52 41 47 4d 41 20 74 68 61 74   <li>PRAGMA that
11a30 20 72 65 74 75 72 6e 73 20 6e 6f 20 64 61 74 61   returns no data
11a40 3c 2f 6c 69 3e 0a 20 20 20 20 20 2a 20 3c 2f 75  </li>.     * </u
11a50 6c 3e 0a 20 20 20 20 20 2a 20 3c 2f 70 3e 0a 20  l>.     * </p>. 
11a60 20 20 20 20 2a 20 3c 70 3e 0a 20 20 20 20 20 2a      * <p>.     *
11a70 20 57 68 65 6e 20 75 73 69 6e 67 20 7b 40 6c 69   When using {@li
11a80 6e 6b 20 23 65 6e 61 62 6c 65 57 72 69 74 65 41  nk #enableWriteA
11a90 68 65 61 64 4c 6f 67 67 69 6e 67 28 29 7d 2c 20  headLogging()}, 
11aa0 6a 6f 75 72 6e 61 6c 5f 6d 6f 64 65 20 69 73 0a  journal_mode is.
11ab0 20 20 20 20 20 2a 20 61 75 74 6f 6d 61 74 69 63       * automatic
11ac0 61 6c 6c 79 20 6d 61 6e 61 67 65 64 20 62 79 20  ally managed by 
11ad0 74 68 69 73 20 63 6c 61 73 73 2e 20 53 6f 2c 20  this class. So, 
11ae0 64 6f 20 6e 6f 74 20 73 65 74 20 6a 6f 75 72 6e  do not set journ
11af0 61 6c 5f 6d 6f 64 65 0a 20 20 20 20 20 2a 20 75  al_mode.     * u
11b00 73 69 6e 67 20 22 50 52 41 47 4d 41 20 6a 6f 75  sing "PRAGMA jou
11b10 72 6e 61 6c 5f 6d 6f 64 65 27 3c 76 61 6c 75 65  rnal_mode'<value
11b20 3e 22 20 73 74 61 74 65 6d 65 6e 74 20 69 66 20  >" statement if 
11b30 79 6f 75 72 20 61 70 70 20 69 73 20 75 73 69 6e  your app is usin
11b40 67 0a 20 20 20 20 20 2a 20 7b 40 6c 69 6e 6b 20  g.     * {@link 
11b50 23 65 6e 61 62 6c 65 57 72 69 74 65 41 68 65 61  #enableWriteAhea
11b60 64 4c 6f 67 67 69 6e 67 28 29 7d 0a 20 20 20 20  dLogging()}.    
11b70 20 2a 20 3c 2f 70 3e 0a 20 20 20 20 20 2a 0a 20   * </p>.     *. 
11b80 20 20 20 20 2a 20 40 70 61 72 61 6d 20 73 71 6c      * @param sql
11b90 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65   the SQL stateme
11ba0 6e 74 20 74 6f 20 62 65 20 65 78 65 63 75 74 65  nt to be execute
11bb0 64 2e 20 4d 75 6c 74 69 70 6c 65 20 73 74 61 74  d. Multiple stat
11bc0 65 6d 65 6e 74 73 20 73 65 70 61 72 61 74 65 64  ements separated
11bd0 20 62 79 20 73 65 6d 69 63 6f 6c 6f 6e 73 20 61   by semicolons a
11be0 72 65 0a 20 20 20 20 20 2a 20 6e 6f 74 20 73 75  re.     * not su
11bf0 70 70 6f 72 74 65 64 2e 0a 20 20 20 20 20 2a 20  pported..     * 
11c00 40 70 61 72 61 6d 20 62 69 6e 64 41 72 67 73 20  @param bindArgs 
11c10 6f 6e 6c 79 20 62 79 74 65 5b 5d 2c 20 53 74 72  only byte[], Str
11c20 69 6e 67 2c 20 4c 6f 6e 67 20 61 6e 64 20 44 6f  ing, Long and Do
11c30 75 62 6c 65 20 61 72 65 20 73 75 70 70 6f 72 74  uble are support
11c40 65 64 20 69 6e 20 62 69 6e 64 41 72 67 73 2e 0a  ed in bindArgs..
11c50 20 20 20 20 20 2a 20 40 74 68 72 6f 77 73 20 53       * @throws S
11c60 51 4c 45 78 63 65 70 74 69 6f 6e 20 69 66 20 74  QLException if t
11c70 68 65 20 53 51 4c 20 73 74 72 69 6e 67 20 69 73  he SQL string is
11c80 20 69 6e 76 61 6c 69 64 0a 20 20 20 20 20 2a 2f   invalid.     */
11c90 0a 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64  .    public void
11ca0 20 65 78 65 63 53 51 4c 28 53 74 72 69 6e 67 20   execSQL(String 
11cb0 73 71 6c 2c 20 4f 62 6a 65 63 74 5b 5d 20 62 69  sql, Object[] bi
11cc0 6e 64 41 72 67 73 29 20 74 68 72 6f 77 73 20 53  ndArgs) throws S
11cd0 51 4c 45 78 63 65 70 74 69 6f 6e 20 7b 0a 20 20  QLException {.  
11ce0 20 20 20 20 20 20 69 66 20 28 62 69 6e 64 41 72        if (bindAr
11cf0 67 73 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20  gs == null) {.  
11d00 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20            throw 
11d10 6e 65 77 20 49 6c 6c 65 67 61 6c 41 72 67 75 6d  new IllegalArgum
11d20 65 6e 74 45 78 63 65 70 74 69 6f 6e 28 22 45 6d  entException("Em
11d30 70 74 79 20 62 69 6e 64 41 72 67 73 22 29 3b 0a  pty bindArgs");.
11d40 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11d50 20 20 65 78 65 63 75 74 65 53 71 6c 28 73 71 6c    executeSql(sql
11d60 2c 20 62 69 6e 64 41 72 67 73 29 3b 0a 20 20 20  , bindArgs);.   
11d70 20 7d 0a 0a 20 20 20 20 70 72 69 76 61 74 65 20   }..    private 
11d80 69 6e 74 20 65 78 65 63 75 74 65 53 71 6c 28 53  int executeSql(S
11d90 74 72 69 6e 67 20 73 71 6c 2c 20 4f 62 6a 65 63  tring sql, Objec
11da0 74 5b 5d 20 62 69 6e 64 41 72 67 73 29 20 74 68  t[] bindArgs) th
11db0 72 6f 77 73 20 53 51 4c 45 78 63 65 70 74 69 6f  rows SQLExceptio
11dc0 6e 20 7b 0a 20 20 20 20 20 20 20 20 61 63 71 75  n {.        acqu
11dd0 69 72 65 52 65 66 65 72 65 6e 63 65 28 29 3b 0a  ireReference();.
11de0 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20          try {.  
11df0 20 20 20 20 20 20 20 20 20 20 69 66 20 28 44 61            if (Da
11e00 74 61 62 61 73 65 55 74 69 6c 73 2e 67 65 74 53  tabaseUtils.getS
11e10 71 6c 53 74 61 74 65 6d 65 6e 74 54 79 70 65 28  qlStatementType(
11e20 73 71 6c 29 20 3d 3d 20 44 61 74 61 62 61 73 65  sql) == Database
11e30 55 74 69 6c 73 2e 53 54 41 54 45 4d 45 4e 54 5f  Utils.STATEMENT_
11e40 41 54 54 41 43 48 29 20 7b 0a 20 20 20 20 20 20  ATTACH) {.      
11e50 20 20 20 20 20 20 20 20 20 20 62 6f 6f 6c 65 61            boolea
11e60 6e 20 64 69 73 61 62 6c 65 57 61 6c 20 3d 20 66  n disableWal = f
11e70 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20  alse;.          
11e80 20 20 20 20 20 20 73 79 6e 63 68 72 6f 6e 69 7a        synchroniz
11e90 65 64 20 28 6d 4c 6f 63 6b 29 20 7b 0a 20 20 20  ed (mLock) {.   
11ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11eb0 20 69 66 20 28 21 6d 48 61 73 41 74 74 61 63 68   if (!mHasAttach
11ec0 65 64 44 62 73 4c 6f 63 6b 65 64 29 20 7b 0a 20  edDbsLocked) {. 
11ed0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11ee0 20 20 20 20 20 20 20 6d 48 61 73 41 74 74 61 63         mHasAttac
11ef0 68 65 64 44 62 73 4c 6f 63 6b 65 64 20 3d 20 74  hedDbsLocked = t
11f00 72 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rue;.           
11f10 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69 73               dis
11f20 61 62 6c 65 57 61 6c 20 3d 20 74 72 75 65 3b 0a  ableWal = true;.
11f30 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11f40 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
11f50 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
11f60 20 20 20 20 20 20 20 20 69 66 20 28 64 69 73 61          if (disa
11f70 62 6c 65 57 61 6c 29 20 7b 0a 20 20 20 20 20 20  bleWal) {.      
11f80 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 69                di
11f90 73 61 62 6c 65 57 72 69 74 65 41 68 65 61 64 4c  sableWriteAheadL
11fa0 6f 67 67 69 6e 67 28 29 3b 0a 20 20 20 20 20 20  ogging();.      
11fb0 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
11fc0 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
11fd0 20 20 20 20 20 20 20 53 51 4c 69 74 65 53 74 61         SQLiteSta
11fe0 74 65 6d 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  tement statement
11ff0 20 3d 20 6e 65 77 20 53 51 4c 69 74 65 53 74 61   = new SQLiteSta
12000 74 65 6d 65 6e 74 28 74 68 69 73 2c 20 73 71 6c  tement(this, sql
12010 2c 20 62 69 6e 64 41 72 67 73 29 3b 0a 20 20 20  , bindArgs);.   
12020 20 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20           try {. 
12030 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
12040 65 74 75 72 6e 20 73 74 61 74 65 6d 65 6e 74 2e  eturn statement.
12050 65 78 65 63 75 74 65 55 70 64 61 74 65 44 65 6c  executeUpdateDel
12060 65 74 65 28 29 3b 0a 20 20 20 20 20 20 20 20 20  ete();.         
12070 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a 20     } finally {. 
12080 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
12090 74 61 74 65 6d 65 6e 74 2e 63 6c 6f 73 65 28 29  tatement.close()
120a0 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
120b0 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c          } finall
120c0 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y {.            
120d0 72 65 6c 65 61 73 65 52 65 66 65 72 65 6e 63 65  releaseReference
120e0 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ();.        }.  
120f0 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20    }..    /**.   
12100 20 20 2a 20 56 65 72 69 66 69 65 73 20 74 68 61    * Verifies tha
12110 74 20 61 20 53 51 4c 20 53 45 4c 45 43 54 20 73  t a SQL SELECT s
12120 74 61 74 65 6d 65 6e 74 20 69 73 20 76 61 6c 69  tatement is vali
12130 64 20 62 79 20 63 6f 6d 70 69 6c 69 6e 67 20 69  d by compiling i
12140 74 2e 0a 20 20 20 20 20 2a 20 49 66 20 74 68 65  t..     * If the
12150 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 69   SQL statement i
12160 73 20 6e 6f 74 20 76 61 6c 69 64 2c 20 74 68 69  s not valid, thi
12170 73 20 6d 65 74 68 6f 64 20 77 69 6c 6c 20 74 68  s method will th
12180 72 6f 77 20 61 20 7b 40 6c 69 6e 6b 20 53 51 4c  row a {@link SQL
12190 69 74 65 45 78 63 65 70 74 69 6f 6e 7d 2e 0a 20  iteException}.. 
121a0 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 70 61      *.     * @pa
121b0 72 61 6d 20 73 71 6c 20 53 51 4c 20 74 6f 20 62  ram sql SQL to b
121c0 65 20 76 61 6c 69 64 61 74 65 64 0a 20 20 20 20  e validated.    
121d0 20 2a 20 40 70 61 72 61 6d 20 63 61 6e 63 65 6c   * @param cancel
121e0 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 20 41 20 73  lationSignal A s
121f0 69 67 6e 61 6c 20 74 6f 20 63 61 6e 63 65 6c 20  ignal to cancel 
12200 74 68 65 20 6f 70 65 72 61 74 69 6f 6e 20 69 6e  the operation in
12210 20 70 72 6f 67 72 65 73 73 2c 20 6f 72 20 6e 75   progress, or nu
12220 6c 6c 20 69 66 20 6e 6f 6e 65 2e 0a 20 20 20 20  ll if none..    
12230 20 2a 20 49 66 20 74 68 65 20 6f 70 65 72 61 74   * If the operat
12240 69 6f 6e 20 69 73 20 63 61 6e 63 65 6c 65 64 2c  ion is canceled,
12250 20 74 68 65 6e 20 7b 40 6c 69 6e 6b 20 4f 70 65   then {@link Ope
12260 72 61 74 69 6f 6e 43 61 6e 63 65 6c 65 64 45 78  rationCanceledEx
12270 63 65 70 74 69 6f 6e 7d 20 77 69 6c 6c 20 62 65  ception} will be
12280 20 74 68 72 6f 77 6e 0a 20 20 20 20 20 2a 20 77   thrown.     * w
12290 68 65 6e 20 74 68 65 20 71 75 65 72 79 20 69 73  hen the query is
122a0 20 65 78 65 63 75 74 65 64 2e 0a 20 20 20 20 20   executed..     
122b0 2a 20 40 74 68 72 6f 77 73 20 53 51 4c 69 74 65  * @throws SQLite
122c0 45 78 63 65 70 74 69 6f 6e 20 69 66 20 7b 40 63  Exception if {@c
122d0 6f 64 65 20 73 71 6c 7d 20 69 73 20 69 6e 76 61  ode sql} is inva
122e0 6c 69 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  lid.     */.    
122f0 70 75 62 6c 69 63 20 76 6f 69 64 20 76 61 6c 69  public void vali
12300 64 61 74 65 53 71 6c 28 53 74 72 69 6e 67 20 73  dateSql(String s
12310 71 6c 2c 20 43 61 6e 63 65 6c 6c 61 74 69 6f 6e  ql, Cancellation
12320 53 69 67 6e 61 6c 20 63 61 6e 63 65 6c 6c 61 74  Signal cancellat
12330 69 6f 6e 53 69 67 6e 61 6c 29 20 7b 0a 20 20 20  ionSignal) {.   
12340 20 20 20 20 20 67 65 74 54 68 72 65 61 64 53 65       getThreadSe
12350 73 73 69 6f 6e 28 29 2e 70 72 65 70 61 72 65 28  ssion().prepare(
12360 73 71 6c 2c 0a 20 20 20 20 20 20 20 20 20 20 20  sql,.           
12370 20 20 20 20 20 67 65 74 54 68 72 65 61 64 44 65       getThreadDe
12380 66 61 75 6c 74 43 6f 6e 6e 65 63 74 69 6f 6e 46  faultConnectionF
12390 6c 61 67 73 28 2f 2a 20 72 65 61 64 4f 6e 6c 79  lags(/* readOnly
123a0 20 3d 2a 2f 20 74 72 75 65 29 2c 20 63 61 6e 63   =*/ true), canc
123b0 65 6c 6c 61 74 69 6f 6e 53 69 67 6e 61 6c 2c 20  ellationSignal, 
123c0 6e 75 6c 6c 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  null);.    }..  
123d0 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 52 65 74    /**.     * Ret
123e0 75 72 6e 73 20 74 72 75 65 20 69 66 20 74 68 65  urns true if the
123f0 20 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65   database is ope
12400 6e 65 64 20 61 73 20 72 65 61 64 20 6f 6e 6c 79  ned as read only
12410 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20  ..     *.     * 
12420 40 72 65 74 75 72 6e 20 54 72 75 65 20 69 66 20  @return True if 
12430 64 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e  database is open
12440 65 64 20 61 73 20 72 65 61 64 20 6f 6e 6c 79 2e  ed as read only.
12450 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 75 62  .     */.    pub
12460 6c 69 63 20 62 6f 6f 6c 65 61 6e 20 69 73 52 65  lic boolean isRe
12470 61 64 4f 6e 6c 79 28 29 20 7b 0a 20 20 20 20 20  adOnly() {.     
12480 20 20 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20     synchronized 
12490 28 6d 4c 6f 63 6b 29 20 7b 0a 20 20 20 20 20 20  (mLock) {.      
124a0 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 73 52        return isR
124b0 65 61 64 4f 6e 6c 79 4c 6f 63 6b 65 64 28 29 3b  eadOnlyLocked();
124c0 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
124d0 0a 0a 20 20 20 20 70 72 69 76 61 74 65 20 62 6f  ..    private bo
124e0 6f 6c 65 61 6e 20 69 73 52 65 61 64 4f 6e 6c 79  olean isReadOnly
124f0 4c 6f 63 6b 65 64 28 29 20 7b 0a 20 20 20 20 20  Locked() {.     
12500 20 20 20 72 65 74 75 72 6e 20 28 6d 43 6f 6e 66     return (mConf
12510 69 67 75 72 61 74 69 6f 6e 4c 6f 63 6b 65 64 2e  igurationLocked.
12520 6f 70 65 6e 46 6c 61 67 73 20 26 20 4f 50 45 4e  openFlags & OPEN
12530 5f 52 45 41 44 5f 4d 41 53 4b 29 20 3d 3d 20 4f  _READ_MASK) == O
12540 50 45 4e 5f 52 45 41 44 4f 4e 4c 59 3b 0a 20 20  PEN_READONLY;.  
12550 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20    }..    /**.   
12560 20 20 2a 20 52 65 74 75 72 6e 73 20 74 72 75 65    * Returns true
12570 20 69 66 20 74 68 65 20 64 61 74 61 62 61 73 65   if the database
12580 20 69 73 20 69 6e 2d 6d 65 6d 6f 72 79 20 64 62   is in-memory db
12590 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20  ..     *.     * 
125a0 40 72 65 74 75 72 6e 20 54 72 75 65 20 69 66 20  @return True if 
125b0 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20  the database is 
125c0 69 6e 2d 6d 65 6d 6f 72 79 2e 0a 20 20 20 20 20  in-memory..     
125d0 2a 20 40 68 69 64 65 0a 20 20 20 20 20 2a 2f 0a  * @hide.     */.
125e0 20 20 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c 65      public boole
125f0 61 6e 20 69 73 49 6e 4d 65 6d 6f 72 79 44 61 74  an isInMemoryDat
12600 61 62 61 73 65 28 29 20 7b 0a 20 20 20 20 20 20  abase() {.      
12610 20 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20 28    synchronized (
12620 6d 4c 6f 63 6b 29 20 7b 0a 20 20 20 20 20 20 20  mLock) {.       
12630 20 20 20 20 20 72 65 74 75 72 6e 20 6d 43 6f 6e       return mCon
12640 66 69 67 75 72 61 74 69 6f 6e 4c 6f 63 6b 65 64  figurationLocked
12650 2e 69 73 49 6e 4d 65 6d 6f 72 79 44 62 28 29 3b  .isInMemoryDb();
12660 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
12670 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a  ..    /**.     *
12680 20 52 65 74 75 72 6e 73 20 74 72 75 65 20 69 66   Returns true if
12690 20 74 68 65 20 64 61 74 61 62 61 73 65 20 69 73   the database is
126a0 20 63 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 2e   currently open.
126b0 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40  .     *.     * @
126c0 72 65 74 75 72 6e 20 54 72 75 65 20 69 66 20 74  return True if t
126d0 68 65 20 64 61 74 61 62 61 73 65 20 69 73 20 63  he database is c
126e0 75 72 72 65 6e 74 6c 79 20 6f 70 65 6e 20 28 68  urrently open (h
126f0 61 73 20 6e 6f 74 20 62 65 65 6e 20 63 6c 6f 73  as not been clos
12700 65 64 29 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  ed)..     */.   
12710 20 70 75 62 6c 69 63 20 62 6f 6f 6c 65 61 6e 20   public boolean 
12720 69 73 4f 70 65 6e 28 29 20 7b 0a 20 20 20 20 20  isOpen() {.     
12730 20 20 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20     synchronized 
12740 28 6d 4c 6f 63 6b 29 20 7b 0a 20 20 20 20 20 20  (mLock) {.      
12750 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d 43 6f        return mCo
12760 6e 6e 65 63 74 69 6f 6e 50 6f 6f 6c 4c 6f 63 6b  nnectionPoolLock
12770 65 64 20 21 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20  ed != null;.    
12780 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
12790 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 52 65 74 75   /**.     * Retu
127a0 72 6e 73 20 74 72 75 65 20 69 66 20 74 68 65 20  rns true if the 
127b0 6e 65 77 20 76 65 72 73 69 6f 6e 20 63 6f 64 65  new version code
127c0 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
127d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74   the current dat
127e0 61 62 61 73 65 20 76 65 72 73 69 6f 6e 2e 0a 20  abase version.. 
127f0 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 70 61      *.     * @pa
12800 72 61 6d 20 6e 65 77 56 65 72 73 69 6f 6e 20 54  ram newVersion T
12810 68 65 20 6e 65 77 20 76 65 72 73 69 6f 6e 20 63  he new version c
12820 6f 64 65 2e 0a 20 20 20 20 20 2a 20 40 72 65 74  ode..     * @ret
12830 75 72 6e 20 54 72 75 65 20 69 66 20 74 68 65 20  urn True if the 
12840 6e 65 77 20 76 65 72 73 69 6f 6e 20 63 6f 64 65  new version code
12850 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
12860 20 74 68 65 20 63 75 72 72 65 6e 74 20 64 61 74   the current dat
12870 61 62 61 73 65 20 76 65 72 73 69 6f 6e 2e 20 0a  abase version. .
12880 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c       */.    publ
12890 69 63 20 62 6f 6f 6c 65 61 6e 20 6e 65 65 64 55  ic boolean needU
128a0 70 67 72 61 64 65 28 69 6e 74 20 6e 65 77 56 65  pgrade(int newVe
128b0 72 73 69 6f 6e 29 20 7b 0a 20 20 20 20 20 20 20  rsion) {.       
128c0 20 72 65 74 75 72 6e 20 6e 65 77 56 65 72 73 69   return newVersi
128d0 6f 6e 20 3e 20 67 65 74 56 65 72 73 69 6f 6e 28  on > getVersion(
128e0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
128f0 2a 0a 20 20 20 20 20 2a 20 47 65 74 73 20 74 68  *.     * Gets th
12900 65 20 70 61 74 68 20 74 6f 20 74 68 65 20 64 61  e path to the da
12910 74 61 62 61 73 65 20 66 69 6c 65 2e 0a 20 20 20  tabase file..   
12920 20 20 2a 0a 20 20 20 20 20 2a 20 40 72 65 74 75    *.     * @retu
12930 72 6e 20 54 68 65 20 70 61 74 68 20 74 6f 20 74  rn The path to t
12940 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c 65  he database file
12950 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 75  ..     */.    pu
12960 62 6c 69 63 20 66 69 6e 61 6c 20 53 74 72 69 6e  blic final Strin
12970 67 20 67 65 74 50 61 74 68 28 29 20 7b 0a 20 20  g getPath() {.  
12980 20 20 20 20 20 20 73 79 6e 63 68 72 6f 6e 69 7a        synchroniz
12990 65 64 20 28 6d 4c 6f 63 6b 29 20 7b 0a 20 20 20  ed (mLock) {.   
129a0 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
129b0 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 4c 6f  mConfigurationLo
129c0 63 6b 65 64 2e 70 61 74 68 3b 0a 20 20 20 20 20  cked.path;.     
129d0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
129e0 2f 2a 2a 0a 20 20 20 20 20 2a 20 53 65 74 73 20  /**.     * Sets 
129f0 74 68 65 20 6c 6f 63 61 6c 65 20 66 6f 72 20 74  the locale for t
12a00 68 69 73 20 64 61 74 61 62 61 73 65 2e 20 20 44  his database.  D
12a10 6f 65 73 20 6e 6f 74 68 69 6e 67 20 69 66 20 74  oes nothing if t
12a20 68 69 73 20 64 61 74 61 62 61 73 65 20 68 61 73  his database has
12a30 0a 20 20 20 20 20 2a 20 74 68 65 20 7b 40 6c 69  .     * the {@li
12a40 6e 6b 20 23 4e 4f 5f 4c 4f 43 41 4c 49 5a 45 44  nk #NO_LOCALIZED
12a50 5f 43 4f 4c 4c 41 54 4f 52 53 7d 20 66 6c 61 67  _COLLATORS} flag
12a60 20 73 65 74 20 6f 72 20 77 61 73 20 6f 70 65 6e   set or was open
12a70 65 64 20 72 65 61 64 20 6f 6e 6c 79 2e 0a 20 20  ed read only..  
12a80 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 70 61 72     *.     * @par
12a90 61 6d 20 6c 6f 63 61 6c 65 20 54 68 65 20 6e 65  am locale The ne
12aa0 77 20 6c 6f 63 61 6c 65 2e 0a 20 20 20 20 20 2a  w locale..     *
12ab0 0a 20 20 20 20 20 2a 20 40 74 68 72 6f 77 73 20  .     * @throws 
12ac0 53 51 4c 45 78 63 65 70 74 69 6f 6e 20 69 66 20  SQLException if 
12ad0 74 68 65 20 6c 6f 63 61 6c 65 20 63 6f 75 6c 64  the locale could
12ae0 20 6e 6f 74 20 62 65 20 73 65 74 2e 20 20 54 68   not be set.  Th
12af0 65 20 6d 6f 73 74 20 63 6f 6d 6d 6f 6e 20 72 65  e most common re
12b00 61 73 6f 6e 0a 20 20 20 20 20 2a 20 66 6f 72 20  ason.     * for 
12b10 74 68 69 73 20 69 73 20 74 68 61 74 20 74 68 65  this is that the
12b20 72 65 20 69 73 20 6e 6f 20 63 6f 6c 6c 61 74 6f  re is no collato
12b30 72 20 61 76 61 69 6c 61 62 6c 65 20 66 6f 72 20  r available for 
12b40 74 68 65 20 6c 6f 63 61 6c 65 20 79 6f 75 20 72  the locale you r
12b50 65 71 75 65 73 74 65 64 2e 0a 20 20 20 20 20 2a  equested..     *
12b60 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
12b70 65 20 64 61 74 61 62 61 73 65 20 72 65 6d 61 69  e database remai
12b80 6e 73 20 75 6e 63 68 61 6e 67 65 64 2e 0a 20 20  ns unchanged..  
12b90 20 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63     */.    public
12ba0 20 76 6f 69 64 20 73 65 74 4c 6f 63 61 6c 65 28   void setLocale(
12bb0 4c 6f 63 61 6c 65 20 6c 6f 63 61 6c 65 29 20 7b  Locale locale) {
12bc0 0a 20 20 20 20 20 20 20 20 69 66 20 28 6c 6f 63  .        if (loc
12bd0 61 6c 65 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20  ale == null) {. 
12be0 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77             throw
12bf0 20 6e 65 77 20 49 6c 6c 65 67 61 6c 41 72 67 75   new IllegalArgu
12c00 6d 65 6e 74 45 78 63 65 70 74 69 6f 6e 28 22 6c  mentException("l
12c10 6f 63 61 6c 65 20 6d 75 73 74 20 6e 6f 74 20 62  ocale must not b
12c20 65 20 6e 75 6c 6c 2e 22 29 3b 0a 20 20 20 20 20  e null.");.     
12c30 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 73 79     }..        sy
12c40 6e 63 68 72 6f 6e 69 7a 65 64 20 28 6d 4c 6f 63  nchronized (mLoc
12c50 6b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  k) {.           
12c60 20 74 68 72 6f 77 49 66 4e 6f 74 4f 70 65 6e 4c   throwIfNotOpenL
12c70 6f 63 6b 65 64 28 29 3b 0a 0a 20 20 20 20 20 20  ocked();..      
12c80 20 20 20 20 20 20 66 69 6e 61 6c 20 4c 6f 63 61        final Loca
12c90 6c 65 20 6f 6c 64 4c 6f 63 61 6c 65 20 3d 20 6d  le oldLocale = m
12ca0 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 4c 6f 63  ConfigurationLoc
12cb0 6b 65 64 2e 6c 6f 63 61 6c 65 3b 0a 20 20 20 20  ked.locale;.    
12cc0 20 20 20 20 20 20 20 20 6d 43 6f 6e 66 69 67 75          mConfigu
12cd0 72 61 74 69 6f 6e 4c 6f 63 6b 65 64 2e 6c 6f 63  rationLocked.loc
12ce0 61 6c 65 20 3d 20 6c 6f 63 61 6c 65 3b 0a 20 20  ale = locale;.  
12cf0 20 20 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a            try {.
12d00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
12d10 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 6f 6f 6c 4c  mConnectionPoolL
12d20 6f 63 6b 65 64 2e 72 65 63 6f 6e 66 69 67 75 72  ocked.reconfigur
12d30 65 28 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  e(mConfiguration
12d40 4c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 20 20 20  Locked);.       
12d50 20 20 20 20 20 7d 20 63 61 74 63 68 20 28 52 75       } catch (Ru
12d60 6e 74 69 6d 65 45 78 63 65 70 74 69 6f 6e 20 65  ntimeException e
12d70 78 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  x) {.           
12d80 20 20 20 20 20 6d 43 6f 6e 66 69 67 75 72 61 74       mConfigurat
12d90 69 6f 6e 4c 6f 63 6b 65 64 2e 6c 6f 63 61 6c 65  ionLocked.locale
12da0 20 3d 20 6f 6c 64 4c 6f 63 61 6c 65 3b 0a 20 20   = oldLocale;.  
12db0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
12dc0 72 6f 77 20 65 78 3b 0a 20 20 20 20 20 20 20 20  row ex;.        
12dd0 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
12de0 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20      }..    /**. 
12df0 20 20 20 20 2a 20 53 65 74 73 20 74 68 65 20 6d      * Sets the m
12e00 61 78 69 6d 75 6d 20 73 69 7a 65 20 6f 66 20 74  aximum size of t
12e10 68 65 20 70 72 65 70 61 72 65 64 2d 73 74 61 74  he prepared-stat
12e20 65 6d 65 6e 74 20 63 61 63 68 65 20 66 6f 72 20  ement cache for 
12e30 74 68 69 73 20 64 61 74 61 62 61 73 65 2e 0a 20  this database.. 
12e40 20 20 20 20 2a 20 28 73 69 7a 65 20 6f 66 20 74      * (size of t
12e50 68 65 20 63 61 63 68 65 20 3d 20 6e 75 6d 62 65  he cache = numbe
12e60 72 20 6f 66 20 63 6f 6d 70 69 6c 65 64 2d 73 71  r of compiled-sq
12e70 6c 2d 73 74 61 74 65 6d 65 6e 74 73 20 73 74 6f  l-statements sto
12e80 72 65 64 20 69 6e 20 74 68 65 20 63 61 63 68 65  red in the cache
12e90 29 2e 0a 20 20 20 20 20 2a 3c 70 3e 0a 20 20 20  )..     *<p>.   
12ea0 20 20 2a 20 4d 61 78 69 6d 75 6d 20 63 61 63 68    * Maximum cach
12eb0 65 20 73 69 7a 65 20 63 61 6e 20 4f 4e 4c 59 20  e size can ONLY 
12ec0 62 65 20 69 6e 63 72 65 61 73 65 64 20 66 72 6f  be increased fro
12ed0 6d 20 69 74 73 20 63 75 72 72 65 6e 74 20 73 69  m its current si
12ee0 7a 65 20 28 64 65 66 61 75 6c 74 20 3d 20 31 30  ze (default = 10
12ef0 29 2e 0a 20 20 20 20 20 2a 20 49 66 20 74 68 69  )..     * If thi
12f00 73 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c 6c  s method is call
12f10 65 64 20 77 69 74 68 20 73 6d 61 6c 6c 65 72 20  ed with smaller 
12f20 73 69 7a 65 20 74 68 61 6e 20 74 68 65 20 63 75  size than the cu
12f30 72 72 65 6e 74 20 6d 61 78 69 6d 75 6d 20 76 61  rrent maximum va
12f40 6c 75 65 2c 0a 20 20 20 20 20 2a 20 74 68 65 6e  lue,.     * then
12f50 20 49 6c 6c 65 67 61 6c 53 74 61 74 65 45 78 63   IllegalStateExc
12f60 65 70 74 69 6f 6e 20 69 73 20 74 68 72 6f 77 6e  eption is thrown
12f70 2e 0a 20 20 20 20 20 2a 3c 70 3e 0a 20 20 20 20  ..     *<p>.    
12f80 20 2a 20 54 68 69 73 20 6d 65 74 68 6f 64 20 69   * This method i
12f90 73 20 74 68 72 65 61 64 2d 73 61 66 65 2e 0a 20  s thread-safe.. 
12fa0 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 70 61      *.     * @pa
12fb0 72 61 6d 20 63 61 63 68 65 53 69 7a 65 20 74 68  ram cacheSize th
12fc0 65 20 73 69 7a 65 20 6f 66 20 74 68 65 20 63 61  e size of the ca
12fd0 63 68 65 2e 20 63 61 6e 20 62 65 20 28 30 20 74  che. can be (0 t
12fe0 6f 20 7b 40 6c 69 6e 6b 20 23 4d 41 58 5f 53 51  o {@link #MAX_SQ
12ff0 4c 5f 43 41 43 48 45 5f 53 49 5a 45 7d 29 0a 20  L_CACHE_SIZE}). 
13000 20 20 20 20 2a 20 40 74 68 72 6f 77 73 20 49 6c      * @throws Il
13010 6c 65 67 61 6c 53 74 61 74 65 45 78 63 65 70 74  legalStateExcept
13020 69 6f 6e 20 69 66 20 69 6e 70 75 74 20 63 61 63  ion if input cac
13030 68 65 53 69 7a 65 20 3e 20 7b 40 6c 69 6e 6b 20  heSize > {@link 
13040 23 4d 41 58 5f 53 51 4c 5f 43 41 43 48 45 5f 53  #MAX_SQL_CACHE_S
13050 49 5a 45 7d 2e 0a 20 20 20 20 20 2a 2f 0a 20 20  IZE}..     */.  
13060 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20 73 65    public void se
13070 74 4d 61 78 53 71 6c 43 61 63 68 65 53 69 7a 65  tMaxSqlCacheSize
13080 28 69 6e 74 20 63 61 63 68 65 53 69 7a 65 29 20  (int cacheSize) 
13090 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 63 61  {.        if (ca
130a0 63 68 65 53 69 7a 65 20 3e 20 4d 41 58 5f 53 51  cheSize > MAX_SQ
130b0 4c 5f 43 41 43 48 45 5f 53 49 5a 45 20 7c 7c 20  L_CACHE_SIZE || 
130c0 63 61 63 68 65 53 69 7a 65 20 3c 20 30 29 20 7b  cacheSize < 0) {
130d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72  .            thr
130e0 6f 77 20 6e 65 77 20 49 6c 6c 65 67 61 6c 53 74  ow new IllegalSt
130f0 61 74 65 45 78 63 65 70 74 69 6f 6e 28 0a 20 20  ateException(.  
13100 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
13110 20 20 22 65 78 70 65 63 74 65 64 20 76 61 6c 75    "expected valu
13120 65 20 62 65 74 77 65 65 6e 20 30 20 61 6e 64 20  e between 0 and 
13130 22 20 2b 20 4d 41 58 5f 53 51 4c 5f 43 41 43 48  " + MAX_SQL_CACH
13140 45 5f 53 49 5a 45 29 3b 0a 20 20 20 20 20 20 20  E_SIZE);.       
13150 20 7d 0a 0a 20 20 20 20 20 20 20 20 73 79 6e 63   }..        sync
13160 68 72 6f 6e 69 7a 65 64 20 28 6d 4c 6f 63 6b 29  hronized (mLock)
13170 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74   {.            t
13180 68 72 6f 77 49 66 4e 6f 74 4f 70 65 6e 4c 6f 63  hrowIfNotOpenLoc
13190 6b 65 64 28 29 3b 0a 0a 20 20 20 20 20 20 20 20  ked();..        
131a0 20 20 20 20 66 69 6e 61 6c 20 69 6e 74 20 6f 6c      final int ol
131b0 64 4d 61 78 53 71 6c 43 61 63 68 65 53 69 7a 65  dMaxSqlCacheSize
131c0 20 3d 20 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f   = mConfiguratio
131d0 6e 4c 6f 63 6b 65 64 2e 6d 61 78 53 71 6c 43 61  nLocked.maxSqlCa
131e0 63 68 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  cheSize;.       
131f0 20 20 20 20 20 6d 43 6f 6e 66 69 67 75 72 61 74       mConfigurat
13200 69 6f 6e 4c 6f 63 6b 65 64 2e 6d 61 78 53 71 6c  ionLocked.maxSql
13210 43 61 63 68 65 53 69 7a 65 20 3d 20 63 61 63 68  CacheSize = cach
13220 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20 20 20  eSize;.         
13230 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20     try {.       
13240 20 20 20 20 20 20 20 20 20 6d 43 6f 6e 6e 65 63           mConnec
13250 74 69 6f 6e 50 6f 6f 6c 4c 6f 63 6b 65 64 2e 72  tionPoolLocked.r
13260 65 63 6f 6e 66 69 67 75 72 65 28 6d 43 6f 6e 66  econfigure(mConf
13270 69 67 75 72 61 74 69 6f 6e 4c 6f 63 6b 65 64 29  igurationLocked)
13280 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ;.            } 
13290 63 61 74 63 68 20 28 52 75 6e 74 69 6d 65 45 78  catch (RuntimeEx
132a0 63 65 70 74 69 6f 6e 20 65 78 29 20 7b 0a 20 20  ception ex) {.  
132b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 43                mC
132c0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 4c 6f 63 6b  onfigurationLock
132d0 65 64 2e 6d 61 78 53 71 6c 43 61 63 68 65 53 69  ed.maxSqlCacheSi
132e0 7a 65 20 3d 20 6f 6c 64 4d 61 78 53 71 6c 43 61  ze = oldMaxSqlCa
132f0 63 68 65 53 69 7a 65 3b 0a 20 20 20 20 20 20 20  cheSize;.       
13300 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 65           throw e
13310 78 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  x;.            }
13320 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
13330 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a  ..    /**.     *
13340 20 53 65 74 73 20 77 68 65 74 68 65 72 20 66 6f   Sets whether fo
13350 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72  reign key constr
13360 61 69 6e 74 73 20 61 72 65 20 65 6e 61 62 6c 65  aints are enable
13370 64 20 66 6f 72 20 74 68 65 20 64 61 74 61 62 61  d for the databa
13380 73 65 2e 0a 20 20 20 20 20 2a 20 3c 70 3e 0a 20  se..     * <p>. 
13390 20 20 20 20 2a 20 42 79 20 64 65 66 61 75 6c 74      * By default
133a0 2c 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f  , foreign key co
133b0 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 6e 6f  nstraints are no
133c0 74 20 65 6e 66 6f 72 63 65 64 20 62 79 20 74 68  t enforced by th
133d0 65 20 64 61 74 61 62 61 73 65 2e 0a 20 20 20 20  e database..    
133e0 20 2a 20 54 68 69 73 20 6d 65 74 68 6f 64 20 61   * This method a
133f0 6c 6c 6f 77 73 20 61 6e 20 61 70 70 6c 69 63 61  llows an applica
13400 74 69 6f 6e 20 74 6f 20 65 6e 61 62 6c 65 20 66  tion to enable f
13410 6f 72 65 69 67 6e 20 6b 65 79 20 63 6f 6e 73 74  oreign key const
13420 72 61 69 6e 74 73 2e 0a 20 20 20 20 20 2a 20 49  raints..     * I
13430 74 20 6d 75 73 74 20 62 65 20 63 61 6c 6c 65 64  t must be called
13440 20 65 61 63 68 20 74 69 6d 65 20 74 68 65 20 64   each time the d
13450 61 74 61 62 61 73 65 20 69 73 20 6f 70 65 6e 65  atabase is opene
13460 64 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74  d to ensure that
13470 20 66 6f 72 65 69 67 6e 0a 20 20 20 20 20 2a 20   foreign.     * 
13480 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20  key constraints 
13490 61 72 65 20 65 6e 61 62 6c 65 64 20 66 6f 72 20  are enabled for 
134a0 74 68 65 20 73 65 73 73 69 6f 6e 2e 0a 20 20 20  the session..   
134b0 20 20 2a 20 3c 2f 70 3e 3c 70 3e 0a 20 20 20 20    * </p><p>.    
134c0 20 2a 20 41 20 67 6f 6f 64 20 74 69 6d 65 20 74   * A good time t
134d0 6f 20 63 61 6c 6c 20 74 68 69 73 20 6d 65 74 68  o call this meth
134e0 6f 64 20 69 73 20 72 69 67 68 74 20 61 66 74 65  od is right afte
134f0 72 20 63 61 6c 6c 69 6e 67 20 7b 40 6c 69 6e 6b  r calling {@link
13500 20 23 6f 70 65 6e 4f 72 43 72 65 61 74 65 44 61   #openOrCreateDa
13510 74 61 62 61 73 65 7d 0a 20 20 20 20 20 2a 20 6f  tabase}.     * o
13520 72 20 69 6e 20 74 68 65 20 7b 40 6c 69 6e 6b 20  r in the {@link 
13530 53 51 4c 69 74 65 4f 70 65 6e 48 65 6c 70 65 72  SQLiteOpenHelper
13540 23 6f 6e 43 6f 6e 66 69 67 75 72 65 7d 20 63 61  #onConfigure} ca
13550 6c 6c 62 61 63 6b 2e 0a 20 20 20 20 20 2a 20 3c  llback..     * <
13560 2f 70 3e 3c 70 3e 0a 20 20 20 20 20 2a 20 57 68  /p><p>.     * Wh
13570 65 6e 20 66 6f 72 65 69 67 6e 20 6b 65 79 20 63  en foreign key c
13580 6f 6e 73 74 72 61 69 6e 74 73 20 61 72 65 20 64  onstraints are d
13590 69 73 61 62 6c 65 64 2c 20 74 68 65 20 64 61 74  isabled, the dat
135a0 61 62 61 73 65 20 64 6f 65 73 20 6e 6f 74 20 63  abase does not c
135b0 68 65 63 6b 20 77 68 65 74 68 65 72 0a 20 20 20  heck whether.   
135c0 20 20 2a 20 63 68 61 6e 67 65 73 20 74 6f 20 74    * changes to t
135d0 68 65 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c  he database will
135e0 20 76 69 6f 6c 61 74 65 20 66 6f 72 65 69 67 6e   violate foreign
135f0 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
13600 2e 20 20 4c 69 6b 65 77 69 73 65 2c 20 77 68 65  .  Likewise, whe
13610 6e 0a 20 20 20 20 20 2a 20 66 6f 72 65 69 67 6e  n.     * foreign
13620 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e 74 73   key constraints
13630 20 61 72 65 20 64 69 73 61 62 6c 65 64 2c 20 74   are disabled, t
13640 68 65 20 64 61 74 61 62 61 73 65 20 77 69 6c 6c  he database will
13650 20 6e 6f 74 20 65 78 65 63 75 74 65 20 63 61 73   not execute cas
13660 63 61 64 65 0a 20 20 20 20 20 2a 20 64 65 6c 65  cade.     * dele
13670 74 65 20 6f 72 20 75 70 64 61 74 65 20 74 72 69  te or update tri
13680 67 67 65 72 73 2e 20 20 41 73 20 61 20 72 65 73  ggers.  As a res
13690 75 6c 74 2c 20 69 74 20 69 73 20 70 6f 73 73 69  ult, it is possi
136a0 62 6c 65 20 66 6f 72 20 74 68 65 20 64 61 74 61  ble for the data
136b0 62 61 73 65 0a 20 20 20 20 20 2a 20 73 74 61 74  base.     * stat
136c0 65 20 74 6f 20 62 65 63 6f 6d 65 20 69 6e 63 6f  e to become inco
136d0 6e 73 69 73 74 65 6e 74 2e 20 20 54 6f 20 70 65  nsistent.  To pe
136e0 72 66 6f 72 6d 20 61 20 64 61 74 61 62 61 73 65  rform a database
136f0 20 69 6e 74 65 67 72 69 74 79 20 63 68 65 63 6b   integrity check
13700 2c 0a 20 20 20 20 20 2a 20 63 61 6c 6c 20 7b 40  ,.     * call {@
13710 6c 69 6e 6b 20 23 69 73 44 61 74 61 62 61 73 65  link #isDatabase
13720 49 6e 74 65 67 72 69 74 79 4f 6b 7d 2e 0a 20 20  IntegrityOk}..  
13730 20 20 20 2a 20 3c 2f 70 3e 3c 70 3e 0a 20 20 20     * </p><p>.   
13740 20 20 2a 20 54 68 69 73 20 6d 65 74 68 6f 64 20    * This method 
13750 6d 75 73 74 20 6e 6f 74 20 62 65 20 63 61 6c 6c  must not be call
13760 65 64 20 77 68 69 6c 65 20 61 20 74 72 61 6e 73  ed while a trans
13770 61 63 74 69 6f 6e 20 69 73 20 69 6e 20 70 72 6f  action is in pro
13780 67 72 65 73 73 2e 0a 20 20 20 20 20 2a 20 3c 2f  gress..     * </
13790 70 3e 3c 70 3e 0a 20 20 20 20 20 2a 20 53 65 65  p><p>.     * See
137a0 20 61 6c 73 6f 20 3c 61 20 68 72 65 66 3d 22 68   also <a href="h
137b0 74 74 70 3a 2f 2f 73 71 6c 69 74 65 2e 6f 72 67  ttp://sqlite.org
137c0 2f 66 6f 72 65 69 67 6e 6b 65 79 73 2e 68 74 6d  /foreignkeys.htm
137d0 6c 22 3e 53 51 4c 69 74 65 20 46 6f 72 65 69 67  l">SQLite Foreig
137e0 6e 20 4b 65 79 20 43 6f 6e 73 74 72 61 69 6e 74  n Key Constraint
137f0 73 3c 2f 61 3e 0a 20 20 20 20 20 2a 20 66 6f 72  s</a>.     * for
13800 20 6d 6f 72 65 20 64 65 74 61 69 6c 73 20 61 62   more details ab
13810 6f 75 74 20 66 6f 72 65 69 67 6e 20 6b 65 79 20  out foreign key 
13820 63 6f 6e 73 74 72 61 69 6e 74 20 73 75 70 70 6f  constraint suppo
13830 72 74 2e 0a 20 20 20 20 20 2a 20 3c 2f 70 3e 0a  rt..     * </p>.
13840 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 70       *.     * @p
13850 61 72 61 6d 20 65 6e 61 62 6c 65 20 54 72 75 65  aram enable True
13860 20 74 6f 20 65 6e 61 62 6c 65 20 66 6f 72 65 69   to enable forei
13870 67 6e 20 6b 65 79 20 63 6f 6e 73 74 72 61 69 6e  gn key constrain
13880 74 73 2c 20 66 61 6c 73 65 20 74 6f 20 64 69 73  ts, false to dis
13890 61 62 6c 65 20 74 68 65 6d 2e 0a 20 20 20 20 20  able them..     
138a0 2a 0a 20 20 20 20 20 2a 20 40 74 68 72 6f 77 73  *.     * @throws
138b0 20 49 6c 6c 65 67 61 6c 53 74 61 74 65 45 78 63   IllegalStateExc
138c0 65 70 74 69 6f 6e 20 69 66 20 74 68 65 20 61 72  eption if the ar
138d0 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 69  e transactions i
138e0 73 20 69 6e 20 70 72 6f 67 72 65 73 73 0a 20 20  s in progress.  
138f0 20 20 20 2a 20 77 68 65 6e 20 74 68 69 73 20 6d     * when this m
13900 65 74 68 6f 64 20 69 73 20 63 61 6c 6c 65 64 2e  ethod is called.
13910 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 75 62  .     */.    pub
13920 6c 69 63 20 76 6f 69 64 20 73 65 74 46 6f 72 65  lic void setFore
13930 69 67 6e 4b 65 79 43 6f 6e 73 74 72 61 69 6e 74  ignKeyConstraint
13940 73 45 6e 61 62 6c 65 64 28 62 6f 6f 6c 65 61 6e  sEnabled(boolean
13950 20 65 6e 61 62 6c 65 29 20 7b 0a 20 20 20 20 20   enable) {.     
13960 20 20 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64 20     synchronized 
13970 28 6d 4c 6f 63 6b 29 20 7b 0a 20 20 20 20 20 20  (mLock) {.      
13980 20 20 20 20 20 20 74 68 72 6f 77 49 66 4e 6f 74        throwIfNot
13990 4f 70 65 6e 4c 6f 63 6b 65 64 28 29 3b 0a 0a 20  OpenLocked();.. 
139a0 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6d             if (m
139b0 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 4c 6f 63  ConfigurationLoc
139c0 6b 65 64 2e 66 6f 72 65 69 67 6e 4b 65 79 43 6f  ked.foreignKeyCo
139d0 6e 73 74 72 61 69 6e 74 73 45 6e 61 62 6c 65 64  nstraintsEnabled
139e0 20 3d 3d 20 65 6e 61 62 6c 65 29 20 7b 0a 20 20   == enable) {.  
139f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65                re
13a00 74 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  turn;.          
13a10 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
13a20 20 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 4c   mConfigurationL
13a30 6f 63 6b 65 64 2e 66 6f 72 65 69 67 6e 4b 65 79  ocked.foreignKey
13a40 43 6f 6e 73 74 72 61 69 6e 74 73 45 6e 61 62 6c  ConstraintsEnabl
13a50 65 64 20 3d 20 65 6e 61 62 6c 65 3b 0a 20 20 20  ed = enable;.   
13a60 20 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20           try {. 
13a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
13a80 43 6f 6e 6e 65 63 74 69 6f 6e 50 6f 6f 6c 4c 6f  ConnectionPoolLo
13a90 63 6b 65 64 2e 72 65 63 6f 6e 66 69 67 75 72 65  cked.reconfigure
13aa0 28 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 4c  (mConfigurationL
13ab0 6f 63 6b 65 64 29 3b 0a 20 20 20 20 20 20 20 20  ocked);.        
13ac0 20 20 20 20 7d 20 63 61 74 63 68 20 28 52 75 6e      } catch (Run
13ad0 74 69 6d 65 45 78 63 65 70 74 69 6f 6e 20 65 78  timeException ex
13ae0 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
13af0 20 20 20 20 6d 43 6f 6e 66 69 67 75 72 61 74 69      mConfigurati
13b00 6f 6e 4c 6f 63 6b 65 64 2e 66 6f 72 65 69 67 6e  onLocked.foreign
13b10 4b 65 79 43 6f 6e 73 74 72 61 69 6e 74 73 45 6e  KeyConstraintsEn
13b20 61 62 6c 65 64 20 3d 20 21 65 6e 61 62 6c 65 3b  abled = !enable;
13b30 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
13b40 20 74 68 72 6f 77 20 65 78 3b 0a 20 20 20 20 20   throw ex;.     
13b50 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
13b60 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a   }.    }..    /*
13b70 2a 0a 20 20 20 20 20 2a 20 54 68 69 73 20 6d 65  *.     * This me
13b80 74 68 6f 64 20 65 6e 61 62 6c 65 73 20 70 61 72  thod enables par
13b90 61 6c 6c 65 6c 20 65 78 65 63 75 74 69 6f 6e 20  allel execution 
13ba0 6f 66 20 71 75 65 72 69 65 73 20 66 72 6f 6d 20  of queries from 
13bb0 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73  multiple threads
13bc0 20 6f 6e 20 74 68 65 0a 20 20 20 20 20 2a 20 73   on the.     * s
13bd0 61 6d 65 20 64 61 74 61 62 61 73 65 2e 20 20 49  ame database.  I
13be0 74 20 64 6f 65 73 20 74 68 69 73 20 62 79 20 6f  t does this by o
13bf0 70 65 6e 69 6e 67 20 6d 75 6c 74 69 70 6c 65 20  pening multiple 
13c00 63 6f 6e 6e 65 63 74 69 6f 6e 73 20 74 6f 20 74  connections to t
13c10 68 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20  he database.    
13c20 20 2a 20 61 6e 64 20 75 73 69 6e 67 20 61 20 64   * and using a d
13c30 69 66 66 65 72 65 6e 74 20 64 61 74 61 62 61 73  ifferent databas
13c40 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 66 6f 72  e connection for
13c50 20 65 61 63 68 20 71 75 65 72 79 2e 20 20 54 68   each query.  Th
13c60 65 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20  e database.     
13c70 2a 20 6a 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 69  * journal mode i
13c80 73 20 61 6c 73 6f 20 63 68 61 6e 67 65 64 20 74  s also changed t
13c90 6f 20 65 6e 61 62 6c 65 20 77 72 69 74 65 73 20  o enable writes 
13ca0 74 6f 20 70 72 6f 63 65 65 64 20 63 6f 6e 63 75  to proceed concu
13cb0 72 72 65 6e 74 6c 79 20 77 69 74 68 20 72 65 61  rrently with rea
13cc0 64 73 2e 0a 20 20 20 20 20 2a 20 3c 70 3e 0a 20  ds..     * <p>. 
13cd0 20 20 20 20 2a 20 57 68 65 6e 20 77 72 69 74 65      * When write
13ce0 2d 61 68 65 61 64 20 6c 6f 67 67 69 6e 67 20 69  -ahead logging i
13cf0 73 20 6e 6f 74 20 65 6e 61 62 6c 65 64 20 28 74  s not enabled (t
13d00 68 65 20 64 65 66 61 75 6c 74 29 2c 20 69 74 20  he default), it 
13d10 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 20  is not possible 
13d20 66 6f 72 0a 20 20 20 20 20 2a 20 72 65 61 64 73  for.     * reads
13d30 20 61 6e 64 20 77 72 69 74 65 73 20 74 6f 20 6f   and writes to o
13d40 63 63 75 72 20 6f 6e 20 74 68 65 20 64 61 74 61  ccur on the data
13d50 62 61 73 65 20 61 74 20 74 68 65 20 73 61 6d 65  base at the same
13d60 20 74 69 6d 65 2e 20 20 42 65 66 6f 72 65 20 6d   time.  Before m
13d70 6f 64 69 66 79 69 6e 67 20 74 68 65 0a 20 20 20  odifying the.   
13d80 20 20 2a 20 64 61 74 61 62 61 73 65 2c 20 74 68    * database, th
13d90 65 20 77 72 69 74 65 72 20 69 6d 70 6c 69 63 69  e writer implici
13da0 74 6c 79 20 61 63 71 75 69 72 65 73 20 61 6e 20  tly acquires an 
13db0 65 78 63 6c 75 73 69 76 65 20 6c 6f 63 6b 20 6f  exclusive lock o
13dc0 6e 20 74 68 65 20 64 61 74 61 62 61 73 65 20 77  n the database w
13dd0 68 69 63 68 0a 20 20 20 20 20 2a 20 70 72 65 76  hich.     * prev
13de0 65 6e 74 73 20 72 65 61 64 65 72 73 20 66 72 6f  ents readers fro
13df0 6d 20 61 63 63 65 73 73 69 6e 67 20 74 68 65 20  m accessing the 
13e00 64 61 74 61 62 61 73 65 20 75 6e 74 69 6c 20 74  database until t
13e10 68 65 20 77 72 69 74 65 20 69 73 20 63 6f 6d 70  he write is comp
13e20 6c 65 74 65 64 2e 0a 20 20 20 20 20 2a 20 3c 2f  leted..     * </
13e30 70 3e 3c 70 3e 0a 20 20 20 20 20 2a 20 49 6e 20  p><p>.     * In 
13e40 63 6f 6e 74 72 61 73 74 2c 20 77 68 65 6e 20 77  contrast, when w
13e50 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 67 69  rite-ahead loggi
13e60 6e 67 20 69 73 20 65 6e 61 62 6c 65 64 20 28 62  ng is enabled (b
13e70 79 20 63 61 6c 6c 69 6e 67 20 74 68 69 73 20 6d  y calling this m
13e80 65 74 68 6f 64 29 2c 20 77 72 69 74 65 0a 20 20  ethod), write.  
13e90 20 20 20 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20     * operations 
13ea0 6f 63 63 75 72 20 69 6e 20 61 20 73 65 70 61 72  occur in a separ
13eb0 61 74 65 20 6c 6f 67 20 66 69 6c 65 20 77 68 69  ate log file whi
13ec0 63 68 20 61 6c 6c 6f 77 73 20 72 65 61 64 73 20  ch allows reads 
13ed0 74 6f 20 70 72 6f 63 65 65 64 20 63 6f 6e 63 75  to proceed concu
13ee0 72 72 65 6e 74 6c 79 2e 0a 20 20 20 20 20 2a 20  rrently..     * 
13ef0 57 68 69 6c 65 20 61 20 77 72 69 74 65 20 69 73  While a write is
13f00 20 69 6e 20 70 72 6f 67 72 65 73 73 2c 20 72 65   in progress, re
13f10 61 64 65 72 73 20 6f 6e 20 6f 74 68 65 72 20 74  aders on other t
13f20 68 72 65 61 64 73 20 77 69 6c 6c 20 70 65 72 63  hreads will perc
13f30 65 69 76 65 20 74 68 65 20 73 74 61 74 65 0a 20  eive the state. 
13f40 20 20 20 20 2a 20 6f 66 20 74 68 65 20 64 61 74      * of the dat
13f50 61 62 61 73 65 20 61 73 20 69 74 20 77 61 73 20  abase as it was 
13f60 62 65 66 6f 72 65 20 74 68 65 20 77 72 69 74 65  before the write
13f70 20 62 65 67 61 6e 2e 20 20 57 68 65 6e 20 74 68   began.  When th
13f80 65 20 77 72 69 74 65 20 63 6f 6d 70 6c 65 74 65  e write complete
13f90 73 2c 20 72 65 61 64 65 72 73 0a 20 20 20 20 20  s, readers.     
13fa0 2a 20 6f 6e 20 6f 74 68 65 72 20 74 68 72 65 61  * on other threa
13fb0 64 73 20 77 69 6c 6c 20 74 68 65 6e 20 70 65 72  ds will then per
13fc0 63 65 69 76 65 20 74 68 65 20 6e 65 77 20 73 74  ceive the new st
13fd0 61 74 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ate of the datab
13fe0 61 73 65 2e 0a 20 20 20 20 20 2a 20 3c 2f 70 3e  ase..     * </p>
13ff0 3c 70 3e 0a 20 20 20 20 20 2a 20 49 74 20 69 73  <p>.     * It is
14000 20 61 20 67 6f 6f 64 20 69 64 65 61 20 74 6f 20   a good idea to 
14010 65 6e 61 62 6c 65 20 77 72 69 74 65 2d 61 68 65  enable write-ahe
14020 61 64 20 6c 6f 67 67 69 6e 67 20 77 68 65 6e 65  ad logging whene
14030 76 65 72 20 61 20 64 61 74 61 62 61 73 65 20 77  ver a database w
14040 69 6c 6c 20 62 65 0a 20 20 20 20 20 2a 20 63 6f  ill be.     * co
14050 6e 63 75 72 72 65 6e 74 6c 79 20 61 63 63 65 73  ncurrently acces
14060 73 65 64 20 61 6e 64 20 6d 6f 64 69 66 69 65 64  sed and modified
14070 20 62 79 20 6d 75 6c 74 69 70 6c 65 20 74 68 72   by multiple thr
14080 65 61 64 73 20 61 74 20 74 68 65 20 73 61 6d 65  eads at the same
14090 20 74 69 6d 65 2e 0a 20 20 20 20 20 2a 20 48 6f   time..     * Ho
140a0 77 65 76 65 72 2c 20 77 72 69 74 65 2d 61 68 65  wever, write-ahe
140b0 61 64 20 6c 6f 67 67 69 6e 67 20 75 73 65 73 20  ad logging uses 
140c0 73 69 67 6e 69 66 69 63 61 6e 74 6c 79 20 6d 6f  significantly mo
140d0 72 65 20 6d 65 6d 6f 72 79 20 74 68 61 6e 20 6f  re memory than o
140e0 72 64 69 6e 61 72 79 0a 20 20 20 20 20 2a 20 6a  rdinary.     * j
140f0 6f 75 72 6e 61 6c 69 6e 67 20 62 65 63 61 75 73  ournaling becaus
14100 65 20 74 68 65 72 65 20 61 72 65 20 6d 75 6c 74  e there are mult
14110 69 70 6c 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 73  iple connections
14120 20 74 6f 20 74 68 65 20 73 61 6d 65 20 64 61 74   to the same dat
14130 61 62 61 73 65 2e 0a 20 20 20 20 20 2a 20 53 6f  abase..     * So
14140 20 69 66 20 61 20 64 61 74 61 62 61 73 65 20 77   if a database w
14150 69 6c 6c 20 6f 6e 6c 79 20 62 65 20 75 73 65 64  ill only be used
14160 20 62 79 20 61 20 73 69 6e 67 6c 65 20 74 68 72   by a single thr
14170 65 61 64 2c 20 6f 72 20 69 66 20 6f 70 74 69 6d  ead, or if optim
14180 69 7a 69 6e 67 0a 20 20 20 20 20 2a 20 63 6f 6e  izing.     * con
14190 63 75 72 72 65 6e 63 79 20 69 73 20 6e 6f 74 20  currency is not 
141a0 76 65 72 79 20 69 6d 70 6f 72 74 61 6e 74 2c 20  very important, 
141b0 74 68 65 6e 20 77 72 69 74 65 2d 61 68 65 61 64  then write-ahead
141c0 20 6c 6f 67 67 69 6e 67 20 73 68 6f 75 6c 64 20   logging should 
141d0 62 65 20 64 69 73 61 62 6c 65 64 2e 0a 20 20 20  be disabled..   
141e0 20 20 2a 20 3c 2f 70 3e 3c 70 3e 0a 20 20 20 20    * </p><p>.    
141f0 20 2a 20 41 66 74 65 72 20 63 61 6c 6c 69 6e 67   * After calling
14200 20 74 68 69 73 20 6d 65 74 68 6f 64 2c 20 65 78   this method, ex
14210 65 63 75 74 69 6f 6e 20 6f 66 20 71 75 65 72 69  ecution of queri
14220 65 73 20 69 6e 20 70 61 72 61 6c 6c 65 6c 20 69  es in parallel i
14230 73 20 65 6e 61 62 6c 65 64 20 61 73 20 6c 6f 6e  s enabled as lon
14240 67 20 61 73 0a 20 20 20 20 20 2a 20 74 68 65 20  g as.     * the 
14250 64 61 74 61 62 61 73 65 20 72 65 6d 61 69 6e 73  database remains
14260 20 6f 70 65 6e 2e 20 20 54 6f 20 64 69 73 61 62   open.  To disab
14270 6c 65 20 65 78 65 63 75 74 69 6f 6e 20 6f 66 20  le execution of 
14280 71 75 65 72 69 65 73 20 69 6e 20 70 61 72 61 6c  queries in paral
14290 6c 65 6c 2c 20 65 69 74 68 65 72 0a 20 20 20 20  lel, either.    
142a0 20 2a 20 63 61 6c 6c 20 7b 40 6c 69 6e 6b 20 23   * call {@link #
142b0 64 69 73 61 62 6c 65 57 72 69 74 65 41 68 65 61  disableWriteAhea
142c0 64 4c 6f 67 67 69 6e 67 7d 20 6f 72 20 63 6c 6f  dLogging} or clo
142d0 73 65 20 74 68 65 20 64 61 74 61 62 61 73 65 20  se the database 
142e0 61 6e 64 20 72 65 6f 70 65 6e 20 69 74 2e 0a 20  and reopen it.. 
142f0 20 20 20 20 2a 20 3c 2f 70 3e 3c 70 3e 0a 20 20      * </p><p>.  
14300 20 20 20 2a 20 54 68 65 20 6d 61 78 69 6d 75 6d     * The maximum
14310 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6e 6e 65   number of conne
14320 63 74 69 6f 6e 73 20 75 73 65 64 20 74 6f 20 65  ctions used to e
14330 78 65 63 75 74 65 20 71 75 65 72 69 65 73 20 69  xecute queries i
14340 6e 20 70 61 72 61 6c 6c 65 6c 20 69 73 0a 20 20  n parallel is.  
14350 20 20 20 2a 20 64 65 70 65 6e 64 65 6e 74 20 75     * dependent u
14360 70 6f 6e 20 74 68 65 20 64 65 76 69 63 65 20 6d  pon the device m
14370 65 6d 6f 72 79 20 61 6e 64 20 70 6f 73 73 69 62  emory and possib
14380 6c 79 20 6f 74 68 65 72 20 70 72 6f 70 65 72 74  ly other propert
14390 69 65 73 2e 0a 20 20 20 20 20 2a 20 3c 2f 70 3e  ies..     * </p>
143a0 3c 70 3e 0a 20 20 20 20 20 2a 20 49 66 20 61 20  <p>.     * If a 
143b0 71 75 65 72 79 20 69 73 20 70 61 72 74 20 6f 66  query is part of
143c0 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 2c 20   a transaction, 
143d0 74 68 65 6e 20 69 74 20 69 73 20 65 78 65 63 75  then it is execu
143e0 74 65 64 20 6f 6e 20 74 68 65 20 73 61 6d 65 20  ted on the same 
143f0 64 61 74 61 62 61 73 65 20 68 61 6e 64 6c 65 20  database handle 
14400 74 68 65 0a 20 20 20 20 20 2a 20 74 72 61 6e 73  the.     * trans
14410 61 63 74 69 6f 6e 20 77 61 73 20 62 65 67 75 6e  action was begun
14420 2e 0a 20 20 20 20 20 2a 20 3c 2f 70 3e 3c 70 3e  ..     * </p><p>
14430 0a 20 20 20 20 20 2a 20 57 72 69 74 65 72 73 20  .     * Writers 
14440 73 68 6f 75 6c 64 20 75 73 65 20 7b 40 6c 69 6e  should use {@lin
14450 6b 20 23 62 65 67 69 6e 54 72 61 6e 73 61 63 74  k #beginTransact
14460 69 6f 6e 4e 6f 6e 45 78 63 6c 75 73 69 76 65 28  ionNonExclusive(
14470 29 7d 20 6f 72 0a 20 20 20 20 20 2a 20 7b 40 6c  )} or.     * {@l
14480 69 6e 6b 20 23 62 65 67 69 6e 54 72 61 6e 73 61  ink #beginTransa
14490 63 74 69 6f 6e 57 69 74 68 4c 69 73 74 65 6e 65  ctionWithListene
144a0 72 4e 6f 6e 45 78 63 6c 75 73 69 76 65 28 53 51  rNonExclusive(SQ
144b0 4c 69 74 65 54 72 61 6e 73 61 63 74 69 6f 6e 4c  LiteTransactionL
144c0 69 73 74 65 6e 65 72 29 7d 0a 20 20 20 20 20 2a  istener)}.     *
144d0 20 74 6f 20 73 74 61 72 74 20 61 20 74 72 61 6e   to start a tran
144e0 73 61 63 74 69 6f 6e 2e 20 20 4e 6f 6e 2d 65 78  saction.  Non-ex
144f0 63 6c 75 73 69 76 65 20 6d 6f 64 65 20 61 6c 6c  clusive mode all
14500 6f 77 73 20 64 61 74 61 62 61 73 65 20 66 69 6c  ows database fil
14510 65 20 74 6f 20 62 65 20 69 6e 20 72 65 61 64 61  e to be in reada
14520 62 6c 65 0a 20 20 20 20 20 2a 20 62 79 20 6f 74  ble.     * by ot
14530 68 65 72 20 74 68 72 65 61 64 73 20 65 78 65 63  her threads exec
14540 75 74 69 6e 67 20 71 75 65 72 69 65 73 2e 0a 20  uting queries.. 
14550 20 20 20 20 2a 20 3c 2f 70 3e 3c 70 3e 0a 20 20      * </p><p>.  
14560 20 20 20 2a 20 49 66 20 74 68 65 20 64 61 74 61     * If the data
14570 62 61 73 65 20 68 61 73 20 61 6e 79 20 61 74 74  base has any att
14580 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2c  ached databases,
14590 20 74 68 65 6e 20 65 78 65 63 75 74 69 6f 6e 20   then execution 
145a0 6f 66 20 71 75 65 72 69 65 73 20 69 6e 20 70 61  of queries in pa
145b0 72 61 6c 6c 65 6c 20 69 73 20 4e 4f 54 0a 20 20  rallel is NOT.  
145c0 20 20 20 2a 20 70 6f 73 73 69 62 6c 65 2e 20 20     * possible.  
145d0 4c 69 6b 65 77 69 73 65 2c 20 77 72 69 74 65 2d  Likewise, write-
145e0 61 68 65 61 64 20 6c 6f 67 67 69 6e 67 20 69 73  ahead logging is
145f0 20 6e 6f 74 20 73 75 70 70 6f 72 74 65 64 20 66   not supported f
14600 6f 72 20 72 65 61 64 2d 6f 6e 6c 79 20 64 61 74  or read-only dat
14610 61 62 61 73 65 73 0a 20 20 20 20 20 2a 20 6f 72  abases.     * or
14620 20 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73 65   memory database
14630 73 2e 20 20 49 6e 20 73 75 63 68 20 63 61 73 65  s.  In such case
14640 73 2c 20 7b 40 6c 69 6e 6b 20 23 65 6e 61 62 6c  s, {@link #enabl
14650 65 57 72 69 74 65 41 68 65 61 64 4c 6f 67 67 69  eWriteAheadLoggi
14660 6e 67 7d 20 72 65 74 75 72 6e 73 20 66 61 6c 73  ng} returns fals
14670 65 2e 0a 20 20 20 20 20 2a 20 3c 2f 70 3e 3c 70  e..     * </p><p
14680 3e 0a 20 20 20 20 20 2a 20 54 68 65 20 62 65 73  >.     * The bes
14690 74 20 77 61 79 20 74 6f 20 65 6e 61 62 6c 65 20  t way to enable 
146a0 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 67  write-ahead logg
146b0 69 6e 67 20 69 73 20 74 6f 20 70 61 73 73 20 74  ing is to pass t
146c0 68 65 0a 20 20 20 20 20 2a 20 7b 40 6c 69 6e 6b  he.     * {@link
146d0 20 23 45 4e 41 42 4c 45 5f 57 52 49 54 45 5f 41   #ENABLE_WRITE_A
146e0 48 45 41 44 5f 4c 4f 47 47 49 4e 47 7d 20 66 6c  HEAD_LOGGING} fl
146f0 61 67 20 74 6f 20 7b 40 6c 69 6e 6b 20 23 6f 70  ag to {@link #op
14700 65 6e 44 61 74 61 62 61 73 65 7d 2e 20 20 54 68  enDatabase}.  Th
14710 69 73 20 69 73 0a 20 20 20 20 20 2a 20 6d 6f 72  is is.     * mor
14720 65 20 65 66 66 69 63 69 65 6e 74 20 74 68 61 6e  e efficient than
14730 20 63 61 6c 6c 69 6e 67 20 7b 40 6c 69 6e 6b 20   calling {@link 
14740 23 65 6e 61 62 6c 65 57 72 69 74 65 41 68 65 61  #enableWriteAhea
14750 64 4c 6f 67 67 69 6e 67 7d 2e 0a 20 20 20 20 20  dLogging}..     
14760 2a 20 3c 63 6f 64 65 3e 3c 70 72 65 3e 0a 20 20  * <code><pre>.  
14770 20 20 20 2a 20 20 20 20 20 53 51 4c 69 74 65 44     *     SQLiteD
14780 61 74 61 62 61 73 65 20 64 62 20 3d 20 53 51 4c  atabase db = SQL
14790 69 74 65 44 61 74 61 62 61 73 65 2e 6f 70 65 6e  iteDatabase.open
147a0 44 61 74 61 62 61 73 65 28 22 64 62 5f 66 69 6c  Database("db_fil
147b0 65 6e 61 6d 65 22 2c 20 63 75 72 73 6f 72 46 61  ename", cursorFa
147c0 63 74 6f 72 79 2c 0a 20 20 20 20 20 2a 20 20 20  ctory,.     *   
147d0 20 20 20 20 20 20 20 20 20 20 53 51 4c 69 74 65            SQLite
147e0 44 61 74 61 62 61 73 65 2e 43 52 45 41 54 45 5f  Database.CREATE_
147f0 49 46 5f 4e 45 43 45 53 53 41 52 59 20 7c 20 53  IF_NECESSARY | S
14800 51 4c 69 74 65 44 61 74 61 62 61 73 65 2e 45 4e  QLiteDatabase.EN
14810 41 42 4c 45 5f 57 52 49 54 45 5f 41 48 45 41 44  ABLE_WRITE_AHEAD
14820 5f 4c 4f 47 47 49 4e 47 2c 0a 20 20 20 20 20 2a  _LOGGING,.     *
14830 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 79 44               myD
14840 61 74 61 62 61 73 65 45 72 72 6f 72 48 61 6e 64  atabaseErrorHand
14850 6c 65 72 29 3b 0a 20 20 20 20 20 2a 20 20 20 20  ler);.     *    
14860 20 64 62 2e 65 6e 61 62 6c 65 57 72 69 74 65 41   db.enableWriteA
14870 68 65 61 64 4c 6f 67 67 69 6e 67 28 29 3b 0a 20  headLogging();. 
14880 20 20 20 20 2a 20 3c 2f 70 72 65 3e 3c 2f 63 6f      * </pre></co
14890 64 65 3e 0a 20 20 20 20 20 2a 20 3c 2f 70 3e 3c  de>.     * </p><
148a0 70 3e 0a 20 20 20 20 20 2a 20 41 6e 6f 74 68 65  p>.     * Anothe
148b0 72 20 77 61 79 20 74 6f 20 65 6e 61 62 6c 65 20  r way to enable 
148c0 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67 67  write-ahead logg
148d0 69 6e 67 20 69 73 20 74 6f 20 63 61 6c 6c 20 7b  ing is to call {
148e0 40 6c 69 6e 6b 20 23 65 6e 61 62 6c 65 57 72 69  @link #enableWri
148f0 74 65 41 68 65 61 64 4c 6f 67 67 69 6e 67 7d 0a  teAheadLogging}.
14900 20 20 20 20 20 2a 20 61 66 74 65 72 20 6f 70 65       * after ope
14910 6e 69 6e 67 20 74 68 65 20 64 61 74 61 62 61 73  ning the databas
14920 65 2e 0a 20 20 20 20 20 2a 20 3c 63 6f 64 65 3e  e..     * <code>
14930 3c 70 72 65 3e 0a 20 20 20 20 20 2a 20 20 20 20  <pre>.     *    
14940 20 53 51 4c 69 74 65 44 61 74 61 62 61 73 65 20   SQLiteDatabase 
14950 64 62 20 3d 20 53 51 4c 69 74 65 44 61 74 61 62  db = SQLiteDatab
14960 61 73 65 2e 6f 70 65 6e 44 61 74 61 62 61 73 65  ase.openDatabase
14970 28 22 64 62 5f 66 69 6c 65 6e 61 6d 65 22 2c 20  ("db_filename", 
14980 63 75 72 73 6f 72 46 61 63 74 6f 72 79 2c 0a 20  cursorFactory,. 
14990 20 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20      *           
149a0 20 20 53 51 4c 69 74 65 44 61 74 61 62 61 73 65    SQLiteDatabase
149b0 2e 43 52 45 41 54 45 5f 49 46 5f 4e 45 43 45 53  .CREATE_IF_NECES
149c0 53 41 52 59 2c 20 6d 79 44 61 74 61 62 61 73 65  SARY, myDatabase
149d0 45 72 72 6f 72 48 61 6e 64 6c 65 72 29 3b 0a 20  ErrorHandler);. 
149e0 20 20 20 20 2a 20 20 20 20 20 64 62 2e 65 6e 61      *     db.ena
149f0 62 6c 65 57 72 69 74 65 41 68 65 61 64 4c 6f 67  bleWriteAheadLog
14a00 67 69 6e 67 28 29 3b 0a 20 20 20 20 20 2a 20 3c  ging();.     * <
14a10 2f 70 72 65 3e 3c 2f 63 6f 64 65 3e 0a 20 20 20  /pre></code>.   
14a20 20 20 2a 20 3c 2f 70 3e 3c 70 3e 0a 20 20 20 20    * </p><p>.    
14a30 20 2a 20 53 65 65 20 61 6c 73 6f 20 3c 61 20 68   * See also <a h
14a40 72 65 66 3d 22 68 74 74 70 3a 2f 2f 73 71 6c 69  ref="http://sqli
14a50 74 65 2e 6f 72 67 2f 77 61 6c 2e 68 74 6d 6c 22  te.org/wal.html"
14a60 3e 53 51 4c 69 74 65 20 57 72 69 74 65 2d 41 68  >SQLite Write-Ah
14a70 65 61 64 20 4c 6f 67 67 69 6e 67 3c 2f 61 3e 20  ead Logging</a> 
14a80 66 6f 72 0a 20 20 20 20 20 2a 20 6d 6f 72 65 20  for.     * more 
14a90 64 65 74 61 69 6c 73 20 61 62 6f 75 74 20 68 6f  details about ho
14aa0 77 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f  w write-ahead lo
14ab0 67 67 69 6e 67 20 77 6f 72 6b 73 2e 0a 20 20 20  gging works..   
14ac0 20 20 2a 20 3c 2f 70 3e 0a 20 20 20 20 20 2a 0a    * </p>.     *.
14ad0 20 20 20 20 20 2a 20 40 72 65 74 75 72 6e 20 54       * @return T
14ae0 72 75 65 20 69 66 20 77 72 69 74 65 2d 61 68 65  rue if write-ahe
14af0 61 64 20 6c 6f 67 67 69 6e 67 20 69 73 20 65 6e  ad logging is en
14b00 61 62 6c 65 64 2e 0a 20 20 20 20 20 2a 0a 20 20  abled..     *.  
14b10 20 20 20 2a 20 40 74 68 72 6f 77 73 20 49 6c 6c     * @throws Ill
14b20 65 67 61 6c 53 74 61 74 65 45 78 63 65 70 74 69  egalStateExcepti
14b30 6f 6e 20 69 66 20 74 68 65 72 65 20 61 72 65 20  on if there are 
14b40 74 72 61 6e 73 61 63 74 69 6f 6e 73 20 69 6e 20  transactions in 
14b50 70 72 6f 67 72 65 73 73 20 61 74 20 74 68 65 0a  progress at the.
14b60 20 20 20 20 20 2a 20 74 69 6d 65 20 74 68 69 73       * time this
14b70 20 6d 65 74 68 6f 64 20 69 73 20 63 61 6c 6c 65   method is calle
14b80 64 2e 20 20 57 41 4c 20 6d 6f 64 65 20 63 61 6e  d.  WAL mode can
14b90 20 6f 6e 6c 79 20 62 65 20 63 68 61 6e 67 65 64   only be changed
14ba0 20 77 68 65 6e 20 74 68 65 72 65 20 61 72 65 20   when there are 
14bb0 6e 6f 0a 20 20 20 20 20 2a 20 74 72 61 6e 73 61  no.     * transa
14bc0 63 74 69 6f 6e 73 20 69 6e 20 70 72 6f 67 72 65  ctions in progre
14bd0 73 73 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20  ss..     *.     
14be0 2a 20 40 73 65 65 20 23 45 4e 41 42 4c 45 5f 57  * @see #ENABLE_W
14bf0 52 49 54 45 5f 41 48 45 41 44 5f 4c 4f 47 47 49  RITE_AHEAD_LOGGI
14c00 4e 47 0a 20 20 20 20 20 2a 20 40 73 65 65 20 23  NG.     * @see #
14c10 64 69 73 61 62 6c 65 57 72 69 74 65 41 68 65 61  disableWriteAhea
14c20 64 4c 6f 67 67 69 6e 67 0a 20 20 20 20 20 2a 2f  dLogging.     */
14c30 0a 20 20 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c  .    public bool
14c40 65 61 6e 20 65 6e 61 62 6c 65 57 72 69 74 65 41  ean enableWriteA
14c50 68 65 61 64 4c 6f 67 67 69 6e 67 28 29 20 7b 0a  headLogging() {.
14c60 20 20 20 20 20 20 20 20 73 79 6e 63 68 72 6f 6e          synchron
14c70 69 7a 65 64 20 28 6d 4c 6f 63 6b 29 20 7b 0a 20  ized (mLock) {. 
14c80 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77             throw
14c90 49 66 4e 6f 74 4f 70 65 6e 4c 6f 63 6b 65 64 28  IfNotOpenLocked(
14ca0 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
14cb0 69 66 20 28 28 6d 43 6f 6e 66 69 67 75 72 61 74  if ((mConfigurat
14cc0 69 6f 6e 4c 6f 63 6b 65 64 2e 6f 70 65 6e 46 6c  ionLocked.openFl
14cd0 61 67 73 20 26 20 45 4e 41 42 4c 45 5f 57 52 49  ags & ENABLE_WRI
14ce0 54 45 5f 41 48 45 41 44 5f 4c 4f 47 47 49 4e 47  TE_AHEAD_LOGGING
14cf0 29 20 21 3d 20 30 29 20 7b 0a 20 20 20 20 20 20  ) != 0) {.      
14d00 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
14d10 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20 20   true;.         
14d20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
14d30 20 20 69 66 20 28 69 73 52 65 61 64 4f 6e 6c 79    if (isReadOnly
14d40 4c 6f 63 6b 65 64 28 29 29 20 7b 0a 20 20 20 20  Locked()) {.    
14d50 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 57              // W
14d60 41 4c 20 64 6f 65 73 6e 27 74 20 6d 61 6b 65 20  AL doesn't make 
14d70 73 65 6e 73 65 20 66 6f 72 20 72 65 61 64 6f 6e  sense for readon
14d80 6c 79 2d 64 61 74 61 62 61 73 65 73 2e 0a 20 20  ly-databases..  
14d90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
14da0 20 54 4f 44 4f 3a 20 54 72 75 65 2c 20 62 75 74   TODO: True, but
14db0 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 70 6f 6f 6c   connection pool
14dc0 69 6e 67 20 64 6f 65 73 20 73 74 69 6c 6c 20 6d  ing does still m
14dd0 61 6b 65 20 73 65 6e 73 65 2e 2e 2e 0a 20 20 20  ake sense....   
14de0 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
14df0 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 20  urn false;.     
14e00 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
14e10 20 20 20 20 20 20 69 66 20 28 6d 43 6f 6e 66 69        if (mConfi
14e20 67 75 72 61 74 69 6f 6e 4c 6f 63 6b 65 64 2e 69  gurationLocked.i
14e30 73 49 6e 4d 65 6d 6f 72 79 44 62 28 29 29 20 7b  sInMemoryDb()) {
14e40 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
14e50 20 4c 6f 67 2e 69 28 54 41 47 2c 20 22 63 61 6e   Log.i(TAG, "can
14e60 27 74 20 65 6e 61 62 6c 65 20 57 41 4c 20 66 6f  't enable WAL fo
14e70 72 20 6d 65 6d 6f 72 79 20 64 61 74 61 62 61 73  r memory databas
14e80 65 73 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  es.");.         
14e90 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66 61         return fa
14ea0 6c 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  lse;.           
14eb0 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20   }..            
14ec0 2f 2f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 69  // make sure thi
14ed0 73 20 64 61 74 61 62 61 73 65 20 68 61 73 20 4e  s database has N
14ee0 4f 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62  O attached datab
14ef0 61 73 65 73 20 62 65 63 61 75 73 65 20 73 71 6c  ases because sql
14f00 69 74 65 27 73 20 77 72 69 74 65 2d 61 68 65 61  ite's write-ahea
14f10 64 2d 6c 6f 67 67 69 6e 67 0a 20 20 20 20 20 20  d-logging.      
14f20 20 20 20 20 20 20 2f 2f 20 64 6f 65 73 6e 27 74        // doesn't
14f30 20 77 6f 72 6b 20 66 6f 72 20 64 61 74 61 62 61   work for databa
14f40 73 65 73 20 77 69 74 68 20 61 74 74 61 63 68 65  ses with attache
14f50 64 20 64 61 74 61 62 61 73 65 73 0a 20 20 20 20  d databases.    
14f60 20 20 20 20 20 20 20 20 69 66 20 28 6d 48 61 73          if (mHas
14f70 41 74 74 61 63 68 65 64 44 62 73 4c 6f 63 6b 65  AttachedDbsLocke
14f80 64 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d) {.           
14f90 20 20 20 20 20 69 66 20 28 4c 6f 67 2e 69 73 4c       if (Log.isL
14fa0 6f 67 67 61 62 6c 65 28 54 41 47 2c 20 4c 6f 67  oggable(TAG, Log
14fb0 2e 44 45 42 55 47 29 29 20 7b 0a 20 20 20 20 20  .DEBUG)) {.     
14fc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
14fd0 6f 67 2e 64 28 54 41 47 2c 20 22 74 68 69 73 20  og.d(TAG, "this 
14fe0 64 61 74 61 62 61 73 65 3a 20 22 20 2b 20 6d 43  database: " + mC
14ff0 6f 6e 66 69 67 75 72 61 74 69 6f 6e 4c 6f 63 6b  onfigurationLock
15000 65 64 2e 6c 61 62 65 6c 0a 20 20 20 20 20 20 20  ed.label.       
15010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15020 20 20 20 20 20 2b 20 22 20 68 61 73 20 61 74 74       + " has att
15030 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 2e  ached databases.
15040 20 63 61 6e 27 74 20 20 65 6e 61 62 6c 65 20 57   can't  enable W
15050 41 4c 2e 22 29 3b 0a 20 20 20 20 20 20 20 20 20  AL.");.         
15060 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
15070 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
15080 66 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20 20  false;.         
15090 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20     }..          
150a0 20 20 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e    mConfiguration
150b0 4c 6f 63 6b 65 64 2e 6f 70 65 6e 46 6c 61 67 73  Locked.openFlags
150c0 20 7c 3d 20 45 4e 41 42 4c 45 5f 57 52 49 54 45   |= ENABLE_WRITE
150d0 5f 41 48 45 41 44 5f 4c 4f 47 47 49 4e 47 3b 0a  _AHEAD_LOGGING;.
150e0 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 20              try 
150f0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
15100 20 20 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 6f 6f    mConnectionPoo
15110 6c 4c 6f 63 6b 65 64 2e 72 65 63 6f 6e 66 69 67  lLocked.reconfig
15120 75 72 65 28 6d 43 6f 6e 66 69 67 75 72 61 74 69  ure(mConfigurati
15130 6f 6e 4c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 20  onLocked);.     
15140 20 20 20 20 20 20 20 7d 20 63 61 74 63 68 20 28         } catch (
15150 52 75 6e 74 69 6d 65 45 78 63 65 70 74 69 6f 6e  RuntimeException
15160 20 65 78 29 20 7b 0a 20 20 20 20 20 20 20 20 20   ex) {.         
15170 20 20 20 20 20 20 20 6d 43 6f 6e 66 69 67 75 72         mConfigur
15180 61 74 69 6f 6e 4c 6f 63 6b 65 64 2e 6f 70 65 6e  ationLocked.open
15190 46 6c 61 67 73 20 26 3d 20 7e 45 4e 41 42 4c 45  Flags &= ~ENABLE
151a0 5f 57 52 49 54 45 5f 41 48 45 41 44 5f 4c 4f 47  _WRITE_AHEAD_LOG
151b0 47 49 4e 47 3b 0a 20 20 20 20 20 20 20 20 20 20  GING;.          
151c0 20 20 20 20 20 20 74 68 72 6f 77 20 65 78 3b 0a        throw ex;.
151d0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
151e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
151f0 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20  return true;.   
15200 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20   }..    /**.    
15210 20 2a 20 54 68 69 73 20 6d 65 74 68 6f 64 20 64   * This method d
15220 69 73 61 62 6c 65 73 20 74 68 65 20 66 65 61 74  isables the feat
15230 75 72 65 73 20 65 6e 61 62 6c 65 64 20 62 79 20  ures enabled by 
15240 7b 40 6c 69 6e 6b 20 23 65 6e 61 62 6c 65 57 72  {@link #enableWr
15250 69 74 65 41 68 65 61 64 4c 6f 67 67 69 6e 67 28  iteAheadLogging(
15260 29 7d 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20  )}..     *.     
15270 2a 20 40 74 68 72 6f 77 73 20 49 6c 6c 65 67 61  * @throws Illega
15280 6c 53 74 61 74 65 45 78 63 65 70 74 69 6f 6e 20  lStateException 
15290 69 66 20 74 68 65 72 65 20 61 72 65 20 74 72 61  if there are tra
152a0 6e 73 61 63 74 69 6f 6e 73 20 69 6e 20 70 72 6f  nsactions in pro
152b0 67 72 65 73 73 20 61 74 20 74 68 65 0a 20 20 20  gress at the.   
152c0 20 20 2a 20 74 69 6d 65 20 74 68 69 73 20 6d 65    * time this me
152d0 74 68 6f 64 20 69 73 20 63 61 6c 6c 65 64 2e 20  thod is called. 
152e0 20 57 41 4c 20 6d 6f 64 65 20 63 61 6e 20 6f 6e   WAL mode can on
152f0 6c 79 20 62 65 20 63 68 61 6e 67 65 64 20 77 68  ly be changed wh
15300 65 6e 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a  en there are no.
15310 20 20 20 20 20 2a 20 74 72 61 6e 73 61 63 74 69       * transacti
15320 6f 6e 73 20 69 6e 20 70 72 6f 67 72 65 73 73 2e  ons in progress.
15330 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40  .     *.     * @
15340 73 65 65 20 23 65 6e 61 62 6c 65 57 72 69 74 65  see #enableWrite
15350 41 68 65 61 64 4c 6f 67 67 69 6e 67 0a 20 20 20  AheadLogging.   
15360 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20    */.    public 
15370 76 6f 69 64 20 64 69 73 61 62 6c 65 57 72 69 74  void disableWrit
15380 65 41 68 65 61 64 4c 6f 67 67 69 6e 67 28 29 20  eAheadLogging() 
15390 7b 0a 20 20 20 20 20 20 20 20 73 79 6e 63 68 72  {.        synchr
153a0 6f 6e 69 7a 65 64 20 28 6d 4c 6f 63 6b 29 20 7b  onized (mLock) {
153b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72  .            thr
153c0 6f 77 49 66 4e 6f 74 4f 70 65 6e 4c 6f 63 6b 65  owIfNotOpenLocke
153d0 64 28 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  d();..          
153e0 20 20 69 66 20 28 28 6d 43 6f 6e 66 69 67 75 72    if ((mConfigur
153f0 61 74 69 6f 6e 4c 6f 63 6b 65 64 2e 6f 70 65 6e  ationLocked.open
15400 46 6c 61 67 73 20 26 20 45 4e 41 42 4c 45 5f 57  Flags & ENABLE_W
15410 52 49 54 45 5f 41 48 45 41 44 5f 4c 4f 47 47 49  RITE_AHEAD_LOGGI
15420 4e 47 29 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20  NG) == 0) {.    
15430 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
15440 72 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  rn;.            
15450 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  }..            m
15460 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 4c 6f 63  ConfigurationLoc
15470 6b 65 64 2e 6f 70 65 6e 46 6c 61 67 73 20 26 3d  ked.openFlags &=
15480 20 7e 45 4e 41 42 4c 45 5f 57 52 49 54 45 5f 41   ~ENABLE_WRITE_A
15490 48 45 41 44 5f 4c 4f 47 47 49 4e 47 3b 0a 20 20  HEAD_LOGGING;.  
154a0 20 20 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a            try {.
154b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
154c0 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 6f 6f 6c 4c  mConnectionPoolL
154d0 6f 63 6b 65 64 2e 72 65 63 6f 6e 66 69 67 75 72  ocked.reconfigur
154e0 65 28 6d 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e  e(mConfiguration
154f0 4c 6f 63 6b 65 64 29 3b 0a 20 20 20 20 20 20 20  Locked);.       
15500 20 20 20 20 20 7d 20 63 61 74 63 68 20 28 52 75       } catch (Ru
15510 6e 74 69 6d 65 45 78 63 65 70 74 69 6f 6e 20 65  ntimeException e
15520 78 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  x) {.           
15530 20 20 20 20 20 6d 43 6f 6e 66 69 67 75 72 61 74       mConfigurat
15540 69 6f 6e 4c 6f 63 6b 65 64 2e 6f 70 65 6e 46 6c  ionLocked.openFl
15550 61 67 73 20 7c 3d 20 45 4e 41 42 4c 45 5f 57 52  ags |= ENABLE_WR
15560 49 54 45 5f 41 48 45 41 44 5f 4c 4f 47 47 49 4e  ITE_AHEAD_LOGGIN
15570 47 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  G;.             
15580 20 20 20 74 68 72 6f 77 20 65 78 3b 0a 20 20 20     throw ex;.   
15590 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
155a0 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
155b0 2f 2a 2a 0a 20 20 20 20 20 2a 20 52 65 74 75 72  /**.     * Retur
155c0 6e 73 20 74 72 75 65 20 69 66 20 77 72 69 74 65  ns true if write
155d0 2d 61 68 65 61 64 20 6c 6f 67 67 69 6e 67 20 68  -ahead logging h
155e0 61 73 20 62 65 65 6e 20 65 6e 61 62 6c 65 64 20  as been enabled 
155f0 66 6f 72 20 74 68 69 73 20 64 61 74 61 62 61 73  for this databas
15600 65 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a  e..     *.     *
15610 20 40 72 65 74 75 72 6e 20 54 72 75 65 20 69 66   @return True if
15620 20 77 72 69 74 65 2d 61 68 65 61 64 20 6c 6f 67   write-ahead log
15630 67 69 6e 67 20 68 61 73 20 62 65 65 6e 20 65 6e  ging has been en
15640 61 62 6c 65 64 20 66 6f 72 20 74 68 69 73 20 64  abled for this d
15650 61 74 61 62 61 73 65 2e 0a 20 20 20 20 20 2a 0a  atabase..     *.
15660 20 20 20 20 20 2a 20 40 73 65 65 20 23 65 6e 61       * @see #ena
15670 62 6c 65 57 72 69 74 65 41 68 65 61 64 4c 6f 67  bleWriteAheadLog
15680 67 69 6e 67 0a 20 20 20 20 20 2a 20 40 73 65 65  ging.     * @see
15690 20 23 45 4e 41 42 4c 45 5f 57 52 49 54 45 5f 41   #ENABLE_WRITE_A
156a0 48 45 41 44 5f 4c 4f 47 47 49 4e 47 0a 20 20 20  HEAD_LOGGING.   
156b0 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20    */.    public 
156c0 62 6f 6f 6c 65 61 6e 20 69 73 57 72 69 74 65 41  boolean isWriteA
156d0 68 65 61 64 4c 6f 67 67 69 6e 67 45 6e 61 62 6c  headLoggingEnabl
156e0 65 64 28 29 20 7b 0a 20 20 20 20 20 20 20 20 73  ed() {.        s
156f0 79 6e 63 68 72 6f 6e 69 7a 65 64 20 28 6d 4c 6f  ynchronized (mLo
15700 63 6b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ck) {.          
15710 20 20 74 68 72 6f 77 49 66 4e 6f 74 4f 70 65 6e    throwIfNotOpen
15720 4c 6f 63 6b 65 64 28 29 3b 0a 0a 20 20 20 20 20  Locked();..     
15730 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 28 6d         return (m
15740 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 4c 6f 63  ConfigurationLoc
15750 6b 65 64 2e 6f 70 65 6e 46 6c 61 67 73 20 26 20  ked.openFlags & 
15760 45 4e 41 42 4c 45 5f 57 52 49 54 45 5f 41 48 45  ENABLE_WRITE_AHE
15770 41 44 5f 4c 4f 47 47 49 4e 47 29 20 21 3d 20 30  AD_LOGGING) != 0
15780 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
15790 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20  }..    /**.     
157a0 2a 20 43 6f 6c 6c 65 63 74 20 73 74 61 74 69 73  * Collect statis
157b0 74 69 63 73 20 61 62 6f 75 74 20 61 6c 6c 20 6f  tics about all o
157c0 70 65 6e 20 64 61 74 61 62 61 73 65 73 20 69 6e  pen databases in
157d0 20 74 68 65 20 63 75 72 72 65 6e 74 20 70 72 6f   the current pro
157e0 63 65 73 73 2e 0a 20 20 20 20 20 2a 20 55 73 65  cess..     * Use
157f0 64 20 62 79 20 62 75 67 20 72 65 70 6f 72 74 2e  d by bug report.
15800 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 73 74 61  .     */.    sta
15810 74 69 63 20 41 72 72 61 79 4c 69 73 74 3c 44 62  tic ArrayList<Db
15820 53 74 61 74 73 3e 20 67 65 74 44 62 53 74 61 74  Stats> getDbStat
15830 73 28 29 20 7b 0a 20 20 20 20 20 20 20 20 41 72  s() {.        Ar
15840 72 61 79 4c 69 73 74 3c 44 62 53 74 61 74 73 3e  rayList<DbStats>
15850 20 64 62 53 74 61 74 73 4c 69 73 74 20 3d 20 6e   dbStatsList = n
15860 65 77 20 41 72 72 61 79 4c 69 73 74 3c 44 62 53  ew ArrayList<DbS
15870 74 61 74 73 3e 28 29 3b 0a 20 20 20 20 20 20 20  tats>();.       
15880 20 66 6f 72 20 28 53 51 4c 69 74 65 44 61 74 61   for (SQLiteData
15890 62 61 73 65 20 64 62 20 3a 20 67 65 74 41 63 74  base db : getAct
158a0 69 76 65 44 61 74 61 62 61 73 65 73 28 29 29 20  iveDatabases()) 
158b0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62  {.            db
158c0 2e 63 6f 6c 6c 65 63 74 44 62 53 74 61 74 73 28  .collectDbStats(
158d0 64 62 53 74 61 74 73 4c 69 73 74 29 3b 0a 20 20  dbStatsList);.  
158e0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
158f0 72 65 74 75 72 6e 20 64 62 53 74 61 74 73 4c 69  return dbStatsLi
15900 73 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  st;.    }..    p
15910 72 69 76 61 74 65 20 76 6f 69 64 20 63 6f 6c 6c  rivate void coll
15920 65 63 74 44 62 53 74 61 74 73 28 41 72 72 61 79  ectDbStats(Array
15930 4c 69 73 74 3c 44 62 53 74 61 74 73 3e 20 64 62  List<DbStats> db
15940 53 74 61 74 73 4c 69 73 74 29 20 7b 0a 20 20 20  StatsList) {.   
15950 20 20 20 20 20 73 79 6e 63 68 72 6f 6e 69 7a 65       synchronize
15960 64 20 28 6d 4c 6f 63 6b 29 20 7b 0a 20 20 20 20  d (mLock) {.    
15970 20 20 20 20 20 20 20 20 69 66 20 28 6d 43 6f 6e          if (mCon
15980 6e 65 63 74 69 6f 6e 50 6f 6f 6c 4c 6f 63 6b 65  nectionPoolLocke
15990 64 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20  d != null) {.   
159a0 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 43 6f               mCo
159b0 6e 6e 65 63 74 69 6f 6e 50 6f 6f 6c 4c 6f 63 6b  nnectionPoolLock
159c0 65 64 2e 63 6f 6c 6c 65 63 74 44 62 53 74 61 74  ed.collectDbStat
159d0 73 28 64 62 53 74 61 74 73 4c 69 73 74 29 3b 0a  s(dbStatsList);.
159e0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
159f0 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
15a00 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69     private stati
15a10 63 20 41 72 72 61 79 4c 69 73 74 3c 53 51 4c 69  c ArrayList<SQLi
15a20 74 65 44 61 74 61 62 61 73 65 3e 20 67 65 74 41  teDatabase> getA
15a30 63 74 69 76 65 44 61 74 61 62 61 73 65 73 28 29  ctiveDatabases()
15a40 20 7b 0a 20 20 20 20 20 20 20 20 41 72 72 61 79   {.        Array
15a50 4c 69 73 74 3c 53 51 4c 69 74 65 44 61 74 61 62  List<SQLiteDatab
15a60 61 73 65 3e 20 64 61 74 61 62 61 73 65 73 20 3d  ase> databases =
15a70 20 6e 65 77 20 41 72 72 61 79 4c 69 73 74 3c 53   new ArrayList<S
15a80 51 4c 69 74 65 44 61 74 61 62 61 73 65 3e 28 29  QLiteDatabase>()
15a90 3b 0a 20 20 20 20 20 20 20 20 73 79 6e 63 68 72  ;.        synchr
15aa0 6f 6e 69 7a 65 64 20 28 73 41 63 74 69 76 65 44  onized (sActiveD
15ab0 61 74 61 62 61 73 65 73 29 20 7b 0a 20 20 20 20  atabases) {.    
15ac0 20 20 20 20 20 20 20 20 64 61 74 61 62 61 73 65          database
15ad0 73 2e 61 64 64 41 6c 6c 28 73 41 63 74 69 76 65  s.addAll(sActive
15ae0 44 61 74 61 62 61 73 65 73 2e 6b 65 79 53 65 74  Databases.keySet
15af0 28 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ());.        }. 
15b00 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 64 61         return da
15b10 74 61 62 61 73 65 73 3b 0a 20 20 20 20 7d 0a 0a  tabases;.    }..
15b20 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 44      /**.     * D
15b30 75 6d 70 20 64 65 74 61 69 6c 65 64 20 69 6e 66  ump detailed inf
15b40 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61  ormation about a
15b50 6c 6c 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  ll open database
15b60 73 20 69 6e 20 74 68 65 20 63 75 72 72 65 6e 74  s in the current
15b70 20 70 72 6f 63 65 73 73 2e 0a 20 20 20 20 20 2a   process..     *
15b80 20 55 73 65 64 20 62 79 20 62 75 67 20 72 65 70   Used by bug rep
15b90 6f 72 74 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  ort..     */.   
15ba0 20 73 74 61 74 69 63 20 76 6f 69 64 20 64 75 6d   static void dum
15bb0 70 41 6c 6c 28 50 72 69 6e 74 65 72 20 70 72 69  pAll(Printer pri
15bc0 6e 74 65 72 2c 20 62 6f 6f 6c 65 61 6e 20 76 65  nter, boolean ve
15bd0 72 62 6f 73 65 29 20 7b 0a 20 20 20 20 20 20 20  rbose) {.       
15be0 20 66 6f 72 20 28 53 51 4c 69 74 65 44 61 74 61   for (SQLiteData
15bf0 62 61 73 65 20 64 62 20 3a 20 67 65 74 41 63 74  base db : getAct
15c00 69 76 65 44 61 74 61 62 61 73 65 73 28 29 29 20  iveDatabases()) 
15c10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 62  {.            db
15c20 2e 64 75 6d 70 28 70 72 69 6e 74 65 72 2c 20 76  .dump(printer, v
15c30 65 72 62 6f 73 65 29 3b 0a 20 20 20 20 20 20 20  erbose);.       
15c40 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72   }.    }..    pr
15c50 69 76 61 74 65 20 76 6f 69 64 20 64 75 6d 70 28  ivate void dump(
15c60 50 72 69 6e 74 65 72 20 70 72 69 6e 74 65 72 2c  Printer printer,
15c70 20 62 6f 6f 6c 65 61 6e 20 76 65 72 62 6f 73 65   boolean verbose
15c80 29 20 7b 0a 20 20 20 20 20 20 20 20 73 79 6e 63  ) {.        sync
15c90 68 72 6f 6e 69 7a 65 64 20 28 6d 4c 6f 63 6b 29  hronized (mLock)
15ca0 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   {.            i
15cb0 66 20 28 6d 43 6f 6e 6e 65 63 74 69 6f 6e 50 6f  f (mConnectionPo
15cc0 6f 6c 4c 6f 63 6b 65 64 20 21 3d 20 6e 75 6c 6c  olLocked != null
15cd0 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
15ce0 20 20 20 20 70 72 69 6e 74 65 72 2e 70 72 69 6e      printer.prin
15cf0 74 6c 6e 28 22 22 29 3b 0a 20 20 20 20 20 20 20  tln("");.       
15d00 20 20 20 20 20 20 20 20 20 6d 43 6f 6e 6e 65 63           mConnec
15d10 74 69 6f 6e 50 6f 6f 6c 4c 6f 63 6b 65 64 2e 64  tionPoolLocked.d
15d20 75 6d 70 28 70 72 69 6e 74 65 72 2c 20 76 65 72  ump(printer, ver
15d30 62 6f 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  bose);.         
15d40 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
15d50 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20     }..    /**.  
15d60 20 20 20 2a 20 52 65 74 75 72 6e 73 20 6c 69 73     * Returns lis
15d70 74 20 6f 66 20 66 75 6c 6c 20 70 61 74 68 6e 61  t of full pathna
15d80 6d 65 73 20 6f 66 20 61 6c 6c 20 61 74 74 61 63  mes of all attac
15d90 68 65 64 20 64 61 74 61 62 61 73 65 73 20 69 6e  hed databases in
15da0 63 6c 75 64 69 6e 67 20 74 68 65 20 6d 61 69 6e  cluding the main
15db0 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 2a   database.     *
15dc0 20 62 79 20 65 78 65 63 75 74 69 6e 67 20 27 70   by executing 'p
15dd0 72 61 67 6d 61 20 64 61 74 61 62 61 73 65 5f 6c  ragma database_l
15de0 69 73 74 27 20 6f 6e 20 74 68 65 20 64 61 74 61  ist' on the data
15df0 62 61 73 65 2e 0a 20 20 20 20 20 2a 0a 20 20 20  base..     *.   
15e00 20 20 2a 20 40 72 65 74 75 72 6e 20 41 72 72 61    * @return Arra
15e10 79 4c 69 73 74 20 6f 66 20 70 61 69 72 73 20 6f  yList of pairs o
15e20 66 20 28 64 61 74 61 62 61 73 65 20 6e 61 6d 65  f (database name
15e30 2c 20 64 61 74 61 62 61 73 65 20 66 69 6c 65 20  , database file 
15e40 70 61 74 68 29 20 6f 72 20 6e 75 6c 6c 20 69 66  path) or null if
15e50 20 74 68 65 20 64 61 74 61 62 61 73 65 0a 20 20   the database.  
15e60 20 20 20 2a 20 69 73 20 6e 6f 74 20 6f 70 65 6e     * is not open
15e70 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 75  ..     */.    pu
15e80 62 6c 69 63 20 4c 69 73 74 3c 50 61 69 72 3c 53  blic List<Pair<S
15e90 74 72 69 6e 67 2c 20 53 74 72 69 6e 67 3e 3e 20  tring, String>> 
15ea0 67 65 74 41 74 74 61 63 68 65 64 44 62 73 28 29  getAttachedDbs()
15eb0 20 7b 0a 20 20 20 20 20 20 20 20 41 72 72 61 79   {.        Array
15ec0 4c 69 73 74 3c 50 61 69 72 3c 53 74 72 69 6e 67  List<Pair<String
15ed0 2c 20 53 74 72 69 6e 67 3e 3e 20 61 74 74 61 63  , String>> attac
15ee0 68 65 64 44 62 73 20 3d 20 6e 65 77 20 41 72 72  hedDbs = new Arr
15ef0 61 79 4c 69 73 74 3c 50 61 69 72 3c 53 74 72 69  ayList<Pair<Stri
15f00 6e 67 2c 20 53 74 72 69 6e 67 3e 3e 28 29 3b 0a  ng, String>>();.
15f10 20 20 20 20 20 20 20 20 73 79 6e 63 68 72 6f 6e          synchron
15f20 69 7a 65 64 20 28 6d 4c 6f 63 6b 29 20 7b 0a 20  ized (mLock) {. 
15f30 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6d             if (m
15f40 43 6f 6e 6e 65 63 74 69 6f 6e 50 6f 6f 6c 4c 6f  ConnectionPoolLo
15f50 63 6b 65 64 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a  cked == null) {.
15f60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15f70 72 65 74 75 72 6e 20 6e 75 6c 6c 3b 20 2f 2f 20  return null; // 
15f80 6e 6f 74 20 6f 70 65 6e 0a 20 20 20 20 20 20 20  not open.       
15f90 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
15fa0 20 20 20 20 69 66 20 28 21 6d 48 61 73 41 74 74      if (!mHasAtt
15fb0 61 63 68 65 64 44 62 73 4c 6f 63 6b 65 64 29 20  achedDbsLocked) 
15fc0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
15fd0 20 20 2f 2f 20 4e 6f 20 61 74 74 61 63 68 65 64    // No attached
15fe0 20 64 61 74 61 62 61 73 65 73 2e 0a 20 20 20 20   databases..    
15ff0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 54              // T
16000 68 65 72 65 20 69 73 20 61 20 73 6d 61 6c 6c 20  here is a small 
16010 77 69 6e 64 6f 77 20 77 68 65 72 65 20 61 74 74  window where att
16020 61 63 68 65 64 20 64 61 74 61 62 61 73 65 73 20  ached databases 
16030 65 78 69 73 74 20 62 75 74 20 74 68 69 73 20 66  exist but this f
16040 6c 61 67 20 69 73 20 6e 6f 74 0a 20 20 20 20 20  lag is not.     
16050 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73 65             // se
16060 74 20 79 65 74 2e 20 20 54 68 69 73 20 63 61 6e  t yet.  This can
16070 20 6f 63 63 75 72 20 77 68 65 6e 20 74 68 69 73   occur when this
16080 20 74 68 72 65 61 64 20 69 73 20 69 6e 20 61 20   thread is in a 
16090 72 61 63 65 20 63 6f 6e 64 69 74 69 6f 6e 20 77  race condition w
160a0 69 74 68 20 61 6e 6f 74 68 65 72 0a 20 20 20 20  ith another.    
160b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 74              // t
160c0 68 72 65 61 64 20 74 68 61 74 20 69 73 20 65 78  hread that is ex
160d0 65 63 75 74 69 6e 67 20 74 68 65 20 53 51 4c 20  ecuting the SQL 
160e0 73 74 61 74 65 6d 65 6e 74 3a 20 22 61 74 74 61  statement: "atta
160f0 63 68 20 64 61 74 61 62 61 73 65 20 3c 62 6c 61  ch database <bla
16100 68 3e 20 61 73 20 3c 66 6f 6f 3e 22 0a 20 20 20  h> as <foo>".   
16110 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
16120 49 66 20 74 68 69 73 20 74 68 72 65 61 64 20 69  If this thread i
16130 73 20 4e 4f 54 20 6f 6b 20 77 69 74 68 20 73 75  s NOT ok with su
16140 63 68 20 61 20 72 61 63 65 20 63 6f 6e 64 69 74  ch a race condit
16150 69 6f 6e 20 28 61 6e 64 20 74 68 75 73 20 70 6f  ion (and thus po
16160 73 73 69 62 6c 79 20 6e 6f 74 0a 20 20 20 20 20  ssibly not.     
16170 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 72 65             // re
16180 63 65 69 76 65 74 68 65 20 65 6e 74 69 72 65 20  ceivethe entire 
16190 6c 69 73 74 20 6f 66 20 61 74 74 61 63 68 65 64  list of attached
161a0 20 64 61 74 61 62 61 73 65 73 29 2c 20 74 68 65   databases), the
161b0 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 73 68 6f  n the caller sho
161c0 75 6c 64 20 65 6e 73 75 72 65 0a 20 20 20 20 20  uld ensure.     
161d0 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 74 68             // th
161e0 61 74 20 6e 6f 20 74 68 72 65 61 64 20 69 73 20  at no thread is 
161f0 65 78 65 63 75 74 69 6e 67 20 61 6e 79 20 53 51  executing any SQ
16200 4c 20 73 74 61 74 65 6d 65 6e 74 73 20 77 68 69  L statements whi
16210 6c 65 20 61 20 74 68 72 65 61 64 20 69 73 20 63  le a thread is c
16220 61 6c 6c 69 6e 67 20 74 68 69 73 0a 20 20 20 20  alling this.    
16230 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 6d              // m
16240 65 74 68 6f 64 2e 20 20 54 79 70 69 63 61 6c 6c  ethod.  Typicall
16250 79 2c 20 74 68 69 73 20 6d 65 74 68 6f 64 20 69  y, this method i
16260 73 20 63 61 6c 6c 65 64 20 77 68 65 6e 20 27 61  s called when 'a
16270 64 62 20 62 75 67 72 65 70 6f 72 74 27 20 69 73  db bugreport' is
16280 20 64 6f 6e 65 20 6f 72 20 74 68 65 0a 20 20 20   done or the.   
16290 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
162a0 63 61 6c 6c 65 72 20 77 61 6e 74 73 20 74 6f 20  caller wants to 
162b0 63 6f 6c 6c 65 63 74 20 73 74 61 74 73 20 6f 6e  collect stats on
162c0 20 74 68 65 20 64 61 74 61 62 61 73 65 20 61 6e   the database an
162d0 64 20 61 6c 6c 20 69 74 73 20 61 74 74 61 63 68  d all its attach
162e0 65 64 20 64 61 74 61 62 61 73 65 73 2e 0a 20 20  ed databases..  
162f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 74                at
16300 74 61 63 68 65 64 44 62 73 2e 61 64 64 28 6e 65  tachedDbs.add(ne
16310 77 20 50 61 69 72 3c 53 74 72 69 6e 67 2c 20 53  w Pair<String, S
16320 74 72 69 6e 67 3e 28 22 6d 61 69 6e 22 2c 20 6d  tring>("main", m
16330 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 4c 6f 63  ConfigurationLoc
16340 6b 65 64 2e 70 61 74 68 29 29 3b 0a 20 20 20 20  ked.path));.    
16350 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
16360 72 6e 20 61 74 74 61 63 68 65 64 44 62 73 3b 0a  rn attachedDbs;.
16370 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
16380 20 20 20 20 20 20 20 20 20 20 20 61 63 71 75 69             acqui
16390 72 65 52 65 66 65 72 65 6e 63 65 28 29 3b 0a 20  reReference();. 
163a0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
163b0 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20    try {.        
163c0 20 20 20 20 2f 2f 20 68 61 73 20 61 74 74 61 63      // has attac
163d0 68 65 64 20 64 61 74 61 62 61 73 65 73 2e 20 71  hed databases. q
163e0 75 65 72 79 20 73 71 6c 69 74 65 20 74 6f 20 67  uery sqlite to g
163f0 65 74 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  et the list of a
16400 74 74 61 63 68 65 64 20 64 61 74 61 62 61 73 65  ttached database
16410 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 43  s..            C
16420 75 72 73 6f 72 20 63 20 3d 20 6e 75 6c 6c 3b 0a  ursor c = null;.
16430 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79 20              try 
16440 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
16450 20 20 63 20 3d 20 72 61 77 51 75 65 72 79 28 22    c = rawQuery("
16460 70 72 61 67 6d 61 20 64 61 74 61 62 61 73 65 5f  pragma database_
16470 6c 69 73 74 3b 22 2c 20 6e 75 6c 6c 29 3b 0a 20  list;", null);. 
16480 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 77                 w
16490 68 69 6c 65 20 28 63 2e 6d 6f 76 65 54 6f 4e 65  hile (c.moveToNe
164a0 78 74 28 29 29 20 7b 0a 20 20 20 20 20 20 20 20  xt()) {.        
164b0 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 73              // s
164c0 71 6c 69 74 65 20 72 65 74 75 72 6e 73 20 61 20  qlite returns a 
164d0 72 6f 77 20 66 6f 72 20 65 61 63 68 20 64 61 74  row for each dat
164e0 61 62 61 73 65 20 69 6e 20 74 68 65 20 72 65 74  abase in the ret
164f0 75 72 6e 65 64 20 6c 69 73 74 20 6f 66 20 64 61  urned list of da
16500 74 61 62 61 73 65 73 2e 0a 20 20 20 20 20 20 20  tabases..       
16510 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20               // 
16520 20 20 69 6e 20 65 61 63 68 20 72 6f 77 2c 0a 20    in each row,. 
16530 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16540 20 20 20 2f 2f 20 20 20 20 20 20 20 31 73 74 20     //       1st 
16550 63 6f 6c 75 6d 6e 20 69 73 20 74 68 65 20 64 61  column is the da
16560 74 61 62 61 73 65 20 6e 61 6d 65 20 73 75 63 68  tabase name such
16570 20 61 73 20 6d 61 69 6e 2c 20 6f 72 20 74 68 65   as main, or the
16580 20 64 61 74 61 62 61 73 65 0a 20 20 20 20 20 20   database.      
16590 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f                //
165a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
165b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 61                na
165c0 6d 65 20 73 70 65 63 69 66 69 65 64 20 6f 6e 20  me specified on 
165d0 74 68 65 20 22 41 54 54 41 43 48 22 20 63 6f 6d  the "ATTACH" com
165e0 6d 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  mand.           
165f0 20 20 20 20 20 20 20 20 20 2f 2f 20 20 20 20 20           //     
16600 20 20 32 6e 64 20 63 6f 6c 75 6d 6e 20 69 73 20    2nd column is 
16610 74 68 65 20 64 61 74 61 62 61 73 65 20 66 69 6c  the database fil
16620 65 20 70 61 74 68 2e 0a 20 20 20 20 20 20 20 20  e path..        
16630 20 20 20 20 20 20 20 20 20 20 20 20 61 74 74 61              atta
16640 63 68 65 64 44 62 73 2e 61 64 64 28 6e 65 77 20  chedDbs.add(new 
16650 50 61 69 72 3c 53 74 72 69 6e 67 2c 20 53 74 72  Pair<String, Str
16660 69 6e 67 3e 28 63 2e 67 65 74 53 74 72 69 6e 67  ing>(c.getString
16670 28 31 29 2c 20 63 2e 67 65 74 53 74 72 69 6e 67  (1), c.getString
16680 28 32 29 29 29 3b 0a 20 20 20 20 20 20 20 20 20  (2)));.         
16690 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
166a0 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b       } finally {
166b0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
166c0 20 69 66 20 28 63 20 21 3d 20 6e 75 6c 6c 29 20   if (c != null) 
166d0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
166e0 20 20 20 20 20 20 63 2e 63 6c 6f 73 65 28 29 3b        c.close();
166f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
16700 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d   }.            }
16710 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
16720 75 72 6e 20 61 74 74 61 63 68 65 64 44 62 73 3b  urn attachedDbs;
16730 0a 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c  .        } final
16740 6c 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ly {.           
16750 20 72 65 6c 65 61 73 65 52 65 66 65 72 65 6e 63   releaseReferenc
16760 65 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  e();.        }. 
16770 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20     }..    /**.  
16780 20 20 20 2a 20 52 75 6e 73 20 27 70 72 61 67 6d     * Runs 'pragm
16790 61 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  a integrity_chec
167a0 6b 27 20 6f 6e 20 74 68 65 20 67 69 76 65 6e 20  k' on the given 
167b0 64 61 74 61 62 61 73 65 20 28 61 6e 64 20 61 6c  database (and al
167c0 6c 20 74 68 65 20 61 74 74 61 63 68 65 64 20 64  l the attached d
167d0 61 74 61 62 61 73 65 73 29 0a 20 20 20 20 20 2a  atabases).     *
167e0 20 61 6e 64 20 72 65 74 75 72 6e 73 20 74 72 75   and returns tru
167f0 65 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 64  e if the given d
16800 61 74 61 62 61 73 65 20 28 61 6e 64 20 61 6c 6c  atabase (and all
16810 20 69 74 73 20 61 74 74 61 63 68 65 64 20 64 61   its attached da
16820 74 61 62 61 73 65 73 29 20 70 61 73 73 20 69 6e  tabases) pass in
16830 74 65 67 72 69 74 79 5f 63 68 65 63 6b 2c 0a 20  tegrity_check,. 
16840 20 20 20 20 2a 20 66 61 6c 73 65 20 6f 74 68 65      * false othe
16850 72 77 69 73 65 2e 0a 20 20 20 20 20 2a 3c 70 3e  rwise..     *<p>
16860 0a 20 20 20 20 20 2a 20 49 66 20 74 68 65 20 72  .     * If the r
16870 65 73 75 6c 74 20 69 73 20 66 61 6c 73 65 2c 20  esult is false, 
16880 74 68 65 6e 20 74 68 69 73 20 6d 65 74 68 6f 64  then this method
16890 20 6c 6f 67 73 20 74 68 65 20 65 72 72 6f 72 73   logs the errors
168a0 20 72 65 70 6f 72 74 65 64 20 62 79 20 74 68 65   reported by the
168b0 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63 6b   integrity_check
168c0 0a 20 20 20 20 20 2a 20 63 6f 6d 6d 61 6e 64 20  .     * command 
168d0 65 78 65 63 75 74 69 6f 6e 2e 0a 20 20 20 20 20  execution..     
168e0 2a 3c 70 3e 0a 20 20 20 20 20 2a 20 4e 6f 74 65  *<p>.     * Note
168f0 20 74 68 61 74 20 27 70 72 61 67 6d 61 20 69 6e   that 'pragma in
16900 74 65 67 72 69 74 79 5f 63 68 65 63 6b 27 20 6f  tegrity_check' o
16910 6e 20 61 20 64 61 74 61 62 61 73 65 20 63 61 6e  n a database can
16920 20 74 61 6b 65 20 61 20 6c 6f 6e 67 20 74 69 6d   take a long tim
16930 65 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a  e..     *.     *
16940 20 40 72 65 74 75 72 6e 20 74 72 75 65 20 69 66   @return true if
16950 20 74 68 65 20 67 69 76 65 6e 20 64 61 74 61 62   the given datab
16960 61 73 65 20 28 61 6e 64 20 61 6c 6c 20 69 74 73  ase (and all its
16970 20 61 74 74 61 63 68 65 64 20 64 61 74 61 62 61   attached databa
16980 73 65 73 29 20 70 61 73 73 20 69 6e 74 65 67 72  ses) pass integr
16990 69 74 79 5f 63 68 65 63 6b 2c 0a 20 20 20 20 20  ity_check,.     
169a0 2a 20 66 61 6c 73 65 20 6f 74 68 65 72 77 69 73  * false otherwis
169b0 65 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70  e..     */.    p
169c0 75 62 6c 69 63 20 62 6f 6f 6c 65 61 6e 20 69 73  ublic boolean is
169d0 44 61 74 61 62 61 73 65 49 6e 74 65 67 72 69 74  DatabaseIntegrit
169e0 79 4f 6b 28 29 20 7b 0a 20 20 20 20 20 20 20 20  yOk() {.        
169f0 61 63 71 75 69 72 65 52 65 66 65 72 65 6e 63 65  acquireReference
16a00 28 29 3b 0a 20 20 20 20 20 20 20 20 74 72 79 20  ();.        try 
16a10 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 4c 69  {.            Li
16a20 73 74 3c 50 61 69 72 3c 53 74 72 69 6e 67 2c 20  st<Pair<String, 
16a30 53 74 72 69 6e 67 3e 3e 20 61 74 74 61 63 68 65  String>> attache
16a40 64 44 62 73 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20  dDbs = null;.   
16a50 20 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20           try {. 
16a60 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
16a70 74 74 61 63 68 65 64 44 62 73 20 3d 20 67 65 74  ttachedDbs = get
16a80 41 74 74 61 63 68 65 64 44 62 73 28 29 3b 0a 20  AttachedDbs();. 
16a90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
16aa0 66 20 28 61 74 74 61 63 68 65 64 44 62 73 20 3d  f (attachedDbs =
16ab0 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20  = null) {.      
16ac0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
16ad0 72 6f 77 20 6e 65 77 20 49 6c 6c 65 67 61 6c 53  row new IllegalS
16ae0 74 61 74 65 45 78 63 65 70 74 69 6f 6e 28 22 64  tateException("d
16af0 61 74 61 62 61 73 65 6c 69 73 74 20 66 6f 72 3a  atabaselist for:
16b00 20 22 20 2b 20 67 65 74 50 61 74 68 28 29 20 2b   " + getPath() +
16b10 20 22 20 63 6f 75 6c 64 6e 27 74 20 22 20 2b 0a   " couldn't " +.
16b20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16b30 20 20 20 20 20 20 20 20 20 20 20 20 22 62 65 20              "be 
16b40 72 65 74 72 69 65 76 65 64 2e 20 70 72 6f 62 61  retrieved. proba
16b50 62 6c 79 20 62 65 63 61 75 73 65 20 74 68 65 20  bly because the 
16b60 64 61 74 61 62 61 73 65 20 69 73 20 63 6c 6f 73  database is clos
16b70 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ed");.          
16b80 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
16b90 20 20 20 20 7d 20 63 61 74 63 68 20 28 53 51 4c      } catch (SQL
16ba0 69 74 65 45 78 63 65 70 74 69 6f 6e 20 65 29 20  iteException e) 
16bb0 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
16bc0 20 20 2f 2f 20 63 61 6e 27 74 20 67 65 74 20 61    // can't get a
16bd0 74 74 61 63 68 65 64 44 62 20 6c 69 73 74 2e 20  ttachedDb list. 
16be0 64 6f 20 69 6e 74 65 67 72 69 74 79 20 63 68 65  do integrity che
16bf0 63 6b 20 6f 6e 20 74 68 65 20 6d 61 69 6e 20 64  ck on the main d
16c00 61 74 61 62 61 73 65 0a 20 20 20 20 20 20 20 20  atabase.        
16c10 20 20 20 20 20 20 20 20 61 74 74 61 63 68 65 64          attached
16c20 44 62 73 20 3d 20 6e 65 77 20 41 72 72 61 79 4c  Dbs = new ArrayL
16c30 69 73 74 3c 50 61 69 72 3c 53 74 72 69 6e 67 2c  ist<Pair<String,
16c40 20 53 74 72 69 6e 67 3e 3e 28 29 3b 0a 20 20 20   String>>();.   
16c50 20 20 20 20 20 20 20 20 20 20 20 20 20 61 74 74               att
16c60 61 63 68 65 64 44 62 73 2e 61 64 64 28 6e 65 77  achedDbs.add(new
16c70 20 50 61 69 72 3c 53 74 72 69 6e 67 2c 20 53 74   Pair<String, St
16c80 72 69 6e 67 3e 28 22 6d 61 69 6e 22 2c 20 67 65  ring>("main", ge
16c90 74 50 61 74 68 28 29 29 29 3b 0a 20 20 20 20 20  tPath()));.     
16ca0 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
16cb0 20 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69        for (int i
16cc0 20 3d 20 30 3b 20 69 20 3c 20 61 74 74 61 63 68   = 0; i < attach
16cd0 65 64 44 62 73 2e 73 69 7a 65 28 29 3b 20 69 2b  edDbs.size(); i+
16ce0 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  +) {.           
16cf0 20 20 20 20 20 50 61 69 72 3c 53 74 72 69 6e 67       Pair<String
16d00 2c 20 53 74 72 69 6e 67 3e 20 70 20 3d 20 61 74  , String> p = at
16d10 74 61 63 68 65 64 44 62 73 2e 67 65 74 28 69 29  tachedDbs.get(i)
16d20 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
16d30 20 20 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e    SQLiteStatemen
16d40 74 20 70 72 6f 67 20 3d 20 6e 75 6c 6c 3b 0a 20  t prog = null;. 
16d50 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
16d60 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ry {.           
16d70 20 20 20 20 20 20 20 20 20 70 72 6f 67 20 3d 20           prog = 
16d80 63 6f 6d 70 69 6c 65 53 74 61 74 65 6d 65 6e 74  compileStatement
16d90 28 22 50 52 41 47 4d 41 20 22 20 2b 20 70 2e 66  ("PRAGMA " + p.f
16da0 69 72 73 74 20 2b 20 22 2e 69 6e 74 65 67 72 69  irst + ".integri
16db0 74 79 5f 63 68 65 63 6b 28 31 29 3b 22 29 3b 0a  ty_check(1);");.
16dc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16dd0 20 20 20 20 53 74 72 69 6e 67 20 72 73 6c 74 20      String rslt 
16de0 3d 20 70 72 6f 67 2e 73 69 6d 70 6c 65 51 75 65  = prog.simpleQue
16df0 72 79 46 6f 72 53 74 72 69 6e 67 28 29 3b 0a 20  ryForString();. 
16e00 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16e10 20 20 20 69 66 20 28 21 72 73 6c 74 2e 65 71 75     if (!rslt.equ
16e20 61 6c 73 49 67 6e 6f 72 65 43 61 73 65 28 22 6f  alsIgnoreCase("o
16e30 6b 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  k")) {.         
16e40 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
16e50 2f 20 69 6e 74 65 67 72 69 74 79 5f 63 68 65 63  / integrity_chec
16e60 6b 65 72 20 66 61 69 6c 65 64 20 6f 6e 20 6d 61  ker failed on ma
16e70 69 6e 20 6f 72 20 61 74 74 61 63 68 65 64 20 64  in or attached d
16e80 61 74 61 62 61 73 65 73 0a 20 20 20 20 20 20 20  atabases.       
16e90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16ea0 20 4c 6f 67 2e 65 28 54 41 47 2c 20 22 50 52 41   Log.e(TAG, "PRA
16eb0 47 4d 41 20 69 6e 74 65 67 72 69 74 79 5f 63 68  GMA integrity_ch
16ec0 65 63 6b 20 6f 6e 20 22 20 2b 20 70 2e 73 65 63  eck on " + p.sec
16ed0 6f 6e 64 20 2b 20 22 20 72 65 74 75 72 6e 65 64  ond + " returned
16ee0 3a 20 22 20 2b 20 72 73 6c 74 29 3b 0a 20 20 20  : " + rslt);.   
16ef0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
16f00 20 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73       return fals
16f10 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
16f20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16f30 20 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c           } final
16f40 6c 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ly {.           
16f50 20 20 20 20 20 20 20 20 20 69 66 20 28 70 72 6f           if (pro
16f60 67 20 21 3d 20 6e 75 6c 6c 29 20 70 72 6f 67 2e  g != null) prog.
16f70 63 6c 6f 73 65 28 29 3b 0a 20 20 20 20 20 20 20  close();.       
16f80 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
16f90 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
16fa0 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a 20 20 20   } finally {.   
16fb0 20 20 20 20 20 20 20 20 20 72 65 6c 65 61 73 65           release
16fc0 52 65 66 65 72 65 6e 63 65 28 29 3b 0a 20 20 20  Reference();.   
16fd0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
16fe0 65 74 75 72 6e 20 74 72 75 65 3b 0a 20 20 20 20  eturn true;.    
16ff0 7d 0a 0a 20 20 20 20 40 4f 76 65 72 72 69 64 65  }..    @Override
17000 0a 20 20 20 20 70 75 62 6c 69 63 20 53 74 72 69  .    public Stri
17010 6e 67 20 74 6f 53 74 72 69 6e 67 28 29 20 7b 0a  ng toString() {.
17020 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 22          return "
17030 53 51 4c 69 74 65 44 61 74 61 62 61 73 65 3a 20  SQLiteDatabase: 
17040 22 20 2b 20 67 65 74 50 61 74 68 28 29 3b 0a 20  " + getPath();. 
17050 20 20 20 7d 0a 0a 20 20 20 20 70 72 69 76 61 74     }..    privat
17060 65 20 76 6f 69 64 20 74 68 72 6f 77 49 66 4e 6f  e void throwIfNo
17070 74 4f 70 65 6e 4c 6f 63 6b 65 64 28 29 20 7b 0a  tOpenLocked() {.
17080 20 20 20 20 20 20 20 20 69 66 20 28 6d 43 6f 6e          if (mCon
17090 6e 65 63 74 69 6f 6e 50 6f 6f 6c 4c 6f 63 6b 65  nectionPoolLocke
170a0 64 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20  d == null) {.   
170b0 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e           throw n
170c0 65 77 20 49 6c 6c 65 67 61 6c 53 74 61 74 65 45  ew IllegalStateE
170d0 78 63 65 70 74 69 6f 6e 28 22 54 68 65 20 64 61  xception("The da
170e0 74 61 62 61 73 65 20 27 22 20 2b 20 6d 43 6f 6e  tabase '" + mCon
170f0 66 69 67 75 72 61 74 69 6f 6e 4c 6f 63 6b 65 64  figurationLocked
17100 2e 6c 61 62 65 6c 0a 20 20 20 20 20 20 20 20 20  .label.         
17110 20 20 20 20 20 20 20 20 20 20 20 2b 20 22 27 20             + "' 
17120 69 73 20 6e 6f 74 20 6f 70 65 6e 2e 22 29 3b 0a  is not open.");.
17130 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
17140 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20  .    /**.     * 
17150 55 73 65 64 20 74 6f 20 61 6c 6c 6f 77 20 72 65  Used to allow re
17160 74 75 72 6e 69 6e 67 20 73 75 62 2d 63 6c 61 73  turning sub-clas
17170 73 65 73 20 6f 66 20 7b 40 6c 69 6e 6b 20 43 75  ses of {@link Cu
17180 72 73 6f 72 7d 20 77 68 65 6e 20 63 61 6c 6c 69  rsor} when calli
17190 6e 67 20 71 75 65 72 79 2e 0a 20 20 20 20 20 2a  ng query..     *
171a0 2f 0a 20 20 20 20 70 75 62 6c 69 63 20 69 6e 74  /.    public int
171b0 65 72 66 61 63 65 20 43 75 72 73 6f 72 46 61 63  erface CursorFac
171c0 74 6f 72 79 20 7b 0a 20 20 20 20 20 20 20 20 2f  tory {.        /
171d0 2a 2a 0a 20 20 20 20 20 20 20 20 20 2a 20 53 65  **.         * Se
171e0 65 20 7b 40 6c 69 6e 6b 20 53 51 4c 69 74 65 43  e {@link SQLiteC
171f0 75 72 73 6f 72 23 53 51 4c 69 74 65 43 75 72 73  ursor#SQLiteCurs
17200 6f 72 28 53 51 4c 69 74 65 43 75 72 73 6f 72 44  or(SQLiteCursorD
17210 72 69 76 65 72 2c 20 53 74 72 69 6e 67 2c 20 53  river, String, S
17220 51 4c 69 74 65 51 75 65 72 79 29 7d 2e 0a 20 20  QLiteQuery)}..  
17230 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20         */.      
17240 20 20 70 75 62 6c 69 63 20 43 75 72 73 6f 72 20    public Cursor 
17250 6e 65 77 43 75 72 73 6f 72 28 53 51 4c 69 74 65  newCursor(SQLite
17260 44 61 74 61 62 61 73 65 20 64 62 2c 0a 20 20 20  Database db,.   
17270 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
17280 69 74 65 43 75 72 73 6f 72 44 72 69 76 65 72 20  iteCursorDriver 
17290 6d 61 73 74 65 72 51 75 65 72 79 2c 20 53 74 72  masterQuery, Str
172a0 69 6e 67 20 65 64 69 74 54 61 62 6c 65 2c 0a 20  ing editTable,. 
172b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
172c0 51 4c 69 74 65 51 75 65 72 79 20 71 75 65 72 79  QLiteQuery query
172d0 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
172e0 2a 0a 20 20 20 20 20 2a 20 41 20 63 61 6c 6c 62  *.     * A callb
172f0 61 63 6b 20 69 6e 74 65 72 66 61 63 65 20 66 6f  ack interface fo
17300 72 20 61 20 63 75 73 74 6f 6d 20 73 71 6c 69 74  r a custom sqlit
17310 65 33 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20  e3 function..   
17320 20 20 2a 20 54 68 69 73 20 63 61 6e 20 62 65 20    * This can be 
17330 75 73 65 64 20 74 6f 20 63 72 65 61 74 65 20 61  used to create a
17340 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 63   function that c
17350 61 6e 20 62 65 20 63 61 6c 6c 65 64 20 66 72 6f  an be called fro
17360 6d 0a 20 20 20 20 20 2a 20 73 71 6c 69 74 65 33  m.     * sqlite3
17370 20 64 61 74 61 62 61 73 65 20 74 72 69 67 67 65   database trigge
17380 72 73 2e 0a 20 20 20 20 20 2a 20 40 68 69 64 65  rs..     * @hide
17390 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 75 62  .     */.    pub
173a0 6c 69 63 20 69 6e 74 65 72 66 61 63 65 20 43 75  lic interface Cu
173b0 73 74 6f 6d 46 75 6e 63 74 69 6f 6e 20 7b 0a 20  stomFunction {. 
173c0 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 76 6f         public vo
173d0 69 64 20 63 61 6c 6c 62 61 63 6b 28 53 74 72 69  id callback(Stri
173e0 6e 67 5b 5d 20 61 72 67 73 29 3b 0a 20 20 20 20  ng[] args);.    
173f0 7d 0a 0a 20 20 20 20 70 75 62 6c 69 63 20 73 74  }..    public st
17400 61 74 69 63 20 62 6f 6f 6c 65 61 6e 20 68 61 73  atic boolean has
17410 43 6f 64 65 63 28 29 20 7b 0a 20 20 20 20 20 20  Codec() {.      
17420 72 65 74 75 72 6e 20 53 51 4c 69 74 65 43 6f 6e  return SQLiteCon
17430 6e 65 63 74 69 6f 6e 2e 68 61 73 43 6f 64 65 63  nection.hasCodec
17440 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  ();.    }..    p
17450 75 62 6c 69 63 20 76 6f 69 64 20 65 6e 61 62 6c  ublic void enabl
17460 65 4c 6f 63 61 6c 69 7a 65 64 43 6f 6c 6c 61 74  eLocalizedCollat
17470 6f 72 73 28 29 20 7b 0a 20 20 20 20 20 20 6d 43  ors() {.      mC
17480 6f 6e 6e 65 63 74 69 6f 6e 50 6f 6f 6c 4c 6f 63  onnectionPoolLoc
17490 6b 65 64 2e 65 6e 61 62 6c 65 4c 6f 63 61 6c 69  ked.enableLocali
174a0 7a 65 64 43 6f 6c 6c 61 74 6f 72 73 28 29 3b 0a  zedCollators();.
174b0 20 20 20 20 7d 0a 7d 0a                              }.}.