SQLite Android Bindings
Hex Artifact Content
Not logged in

Artifact 9b8a621ca65ca29b18f248ea8ecd895feed837f6:


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 0a 70 61 63  icense.. */..pac
0270: 6b 61 67 65 20 6f 72 67 2e 73 71 6c 69 74 65 2e  kage org.sqlite.
0280: 64 61 74 61 62 61 73 65 3b 0a 0a 69 6d 70 6f 72  database;..impor
0290: 74 20 61 6e 64 72 6f 69 64 2e 63 6f 6e 74 65 6e  t android.conten
02a0: 74 2e 43 6f 6e 74 65 6e 74 56 61 6c 75 65 73 3b  t.ContentValues;
02b0: 0a 69 6d 70 6f 72 74 20 61 6e 64 72 6f 69 64 2e  .import android.
02c0: 63 6f 6e 74 65 6e 74 2e 43 6f 6e 74 65 78 74 3b  content.Context;
02d0: 0a 69 6d 70 6f 72 74 20 61 6e 64 72 6f 69 64 2e  .import android.
02e0: 63 6f 6e 74 65 6e 74 2e 4f 70 65 72 61 74 69 6f  content.Operatio
02f0: 6e 41 70 70 6c 69 63 61 74 69 6f 6e 45 78 63 65  nApplicationExce
0300: 70 74 69 6f 6e 3b 0a 69 6d 70 6f 72 74 20 6f 72  ption;.import or
0310: 67 2e 73 71 6c 69 74 65 2e 64 61 74 61 62 61 73  g.sqlite.databas
0320: 65 2e 73 71 6c 69 74 65 2e 53 51 4c 69 74 65 41  e.sqlite.SQLiteA
0330: 62 6f 72 74 45 78 63 65 70 74 69 6f 6e 3b 0a 69  bortException;.i
0340: 6d 70 6f 72 74 20 6f 72 67 2e 73 71 6c 69 74 65  mport org.sqlite
0350: 2e 64 61 74 61 62 61 73 65 2e 73 71 6c 69 74 65  .database.sqlite
0360: 2e 53 51 4c 69 74 65 43 6f 6e 73 74 72 61 69 6e  .SQLiteConstrain
0370: 74 45 78 63 65 70 74 69 6f 6e 3b 0a 69 6d 70 6f  tException;.impo
0380: 72 74 20 6f 72 67 2e 73 71 6c 69 74 65 2e 64 61  rt org.sqlite.da
0390: 74 61 62 61 73 65 2e 73 71 6c 69 74 65 2e 53 51  tabase.sqlite.SQ
03a0: 4c 69 74 65 44 61 74 61 62 61 73 65 3b 0a 69 6d  LiteDatabase;.im
03b0: 70 6f 72 74 20 6f 72 67 2e 73 71 6c 69 74 65 2e  port org.sqlite.
03c0: 64 61 74 61 62 61 73 65 2e 73 71 6c 69 74 65 2e  database.sqlite.
03d0: 53 51 4c 69 74 65 44 61 74 61 62 61 73 65 43 6f  SQLiteDatabaseCo
03e0: 72 72 75 70 74 45 78 63 65 70 74 69 6f 6e 3b 0a  rruptException;.
03f0: 69 6d 70 6f 72 74 20 6f 72 67 2e 73 71 6c 69 74  import org.sqlit
0400: 65 2e 64 61 74 61 62 61 73 65 2e 73 71 6c 69 74  e.database.sqlit
0410: 65 2e 53 51 4c 69 74 65 44 69 73 6b 49 4f 45 78  e.SQLiteDiskIOEx
0420: 63 65 70 74 69 6f 6e 3b 0a 69 6d 70 6f 72 74 20  ception;.import 
0430: 6f 72 67 2e 73 71 6c 69 74 65 2e 64 61 74 61 62  org.sqlite.datab
0440: 61 73 65 2e 73 71 6c 69 74 65 2e 53 51 4c 69 74  ase.sqlite.SQLit
0450: 65 45 78 63 65 70 74 69 6f 6e 3b 0a 69 6d 70 6f  eException;.impo
0460: 72 74 20 6f 72 67 2e 73 71 6c 69 74 65 2e 64 61  rt org.sqlite.da
0470: 74 61 62 61 73 65 2e 73 71 6c 69 74 65 2e 53 51  tabase.sqlite.SQ
0480: 4c 69 74 65 46 75 6c 6c 45 78 63 65 70 74 69 6f  LiteFullExceptio
0490: 6e 3b 0a 69 6d 70 6f 72 74 20 6f 72 67 2e 73 71  n;.import org.sq
04a0: 6c 69 74 65 2e 64 61 74 61 62 61 73 65 2e 73 71  lite.database.sq
04b0: 6c 69 74 65 2e 53 51 4c 69 74 65 50 72 6f 67 72  lite.SQLiteProgr
04c0: 61 6d 3b 0a 69 6d 70 6f 72 74 20 6f 72 67 2e 73  am;.import org.s
04d0: 71 6c 69 74 65 2e 64 61 74 61 62 61 73 65 2e 73  qlite.database.s
04e0: 71 6c 69 74 65 2e 53 51 4c 69 74 65 53 74 61 74  qlite.SQLiteStat
04f0: 65 6d 65 6e 74 3b 0a 0a 69 6d 70 6f 72 74 20 61  ement;..import a
0500: 6e 64 72 6f 69 64 2e 64 61 74 61 62 61 73 65 2e  ndroid.database.
0510: 43 75 72 73 6f 72 57 69 6e 64 6f 77 3b 0a 69 6d  CursorWindow;.im
0520: 70 6f 72 74 20 61 6e 64 72 6f 69 64 2e 6f 73 2e  port android.os.
0530: 4f 70 65 72 61 74 69 6f 6e 43 61 6e 63 65 6c 65  OperationCancele
0540: 64 45 78 63 65 70 74 69 6f 6e 3b 0a 69 6d 70 6f  dException;.impo
0550: 72 74 20 61 6e 64 72 6f 69 64 2e 6f 73 2e 50 61  rt android.os.Pa
0560: 72 63 65 6c 3b 0a 69 6d 70 6f 72 74 20 61 6e 64  rcel;.import and
0570: 72 6f 69 64 2e 6f 73 2e 50 61 72 63 65 6c 46 69  roid.os.ParcelFi
0580: 6c 65 44 65 73 63 72 69 70 74 6f 72 3b 0a 69 6d  leDescriptor;.im
0590: 70 6f 72 74 20 61 6e 64 72 6f 69 64 2e 74 65 78  port android.tex
05a0: 74 2e 54 65 78 74 55 74 69 6c 73 3b 0a 69 6d 70  t.TextUtils;.imp
05b0: 6f 72 74 20 61 6e 64 72 6f 69 64 2e 75 74 69 6c  ort android.util
05c0: 2e 4c 6f 67 3b 0a 0a 69 6d 70 6f 72 74 20 61 6e  .Log;..import an
05d0: 64 72 6f 69 64 2e 64 61 74 61 62 61 73 65 2e 43  droid.database.C
05e0: 75 72 73 6f 72 3b 0a 0a 69 6d 70 6f 72 74 20 6a  ursor;..import j
05f0: 61 76 61 2e 69 6f 2e 46 69 6c 65 3b 0a 69 6d 70  ava.io.File;.imp
0600: 6f 72 74 20 6a 61 76 61 2e 69 6f 2e 46 69 6c 65  ort java.io.File
0610: 4e 6f 74 46 6f 75 6e 64 45 78 63 65 70 74 69 6f  NotFoundExceptio
0620: 6e 3b 0a 69 6d 70 6f 72 74 20 6a 61 76 61 2e 69  n;.import java.i
0630: 6f 2e 50 72 69 6e 74 53 74 72 65 61 6d 3b 0a 69  o.PrintStream;.i
0640: 6d 70 6f 72 74 20 6a 61 76 61 2e 74 65 78 74 2e  mport java.text.
0650: 43 6f 6c 6c 61 74 6f 72 3b 0a 69 6d 70 6f 72 74  Collator;.import
0660: 20 6a 61 76 61 2e 75 74 69 6c 2e 48 61 73 68 4d   java.util.HashM
0670: 61 70 3b 0a 69 6d 70 6f 72 74 20 6a 61 76 61 2e  ap;.import java.
0680: 75 74 69 6c 2e 4c 6f 63 61 6c 65 3b 0a 69 6d 70  util.Locale;.imp
0690: 6f 72 74 20 6a 61 76 61 2e 75 74 69 6c 2e 4d 61  ort java.util.Ma
06a0: 70 3b 0a 0a 2f 2a 2a 0a 20 2a 20 53 74 61 74 69  p;../**. * Stati
06b0: 63 20 75 74 69 6c 69 74 79 20 6d 65 74 68 6f 64  c utility method
06c0: 73 20 66 6f 72 20 64 65 61 6c 69 6e 67 20 77 69  s for dealing wi
06d0: 74 68 20 64 61 74 61 62 61 73 65 73 20 61 6e 64  th databases and
06e0: 20 7b 40 6c 69 6e 6b 20 43 75 72 73 6f 72 7d 73   {@link Cursor}s
06f0: 2e 0a 20 2a 2f 0a 70 75 62 6c 69 63 20 63 6c 61  .. */.public cla
0700: 73 73 20 44 61 74 61 62 61 73 65 55 74 69 6c 73  ss DatabaseUtils
0710: 20 7b 0a 20 20 20 20 70 72 69 76 61 74 65 20 73   {.    private s
0720: 74 61 74 69 63 20 66 69 6e 61 6c 20 53 74 72 69  tatic final Stri
0730: 6e 67 20 54 41 47 20 3d 20 22 44 61 74 61 62 61  ng TAG = "Databa
0740: 73 65 55 74 69 6c 73 22 3b 0a 0a 20 20 20 20 70  seUtils";..    p
0750: 72 69 76 61 74 65 20 73 74 61 74 69 63 20 66 69  rivate static fi
0760: 6e 61 6c 20 62 6f 6f 6c 65 61 6e 20 44 45 42 55  nal boolean DEBU
0770: 47 20 3d 20 66 61 6c 73 65 3b 0a 0a 20 20 20 20  G = false;..    
0780: 2f 2a 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20 76  /** One of the v
0790: 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20 62  alues returned b
07a0: 79 20 7b 40 6c 69 6e 6b 20 23 67 65 74 53 71 6c  y {@link #getSql
07b0: 53 74 61 74 65 6d 65 6e 74 54 79 70 65 28 53 74  StatementType(St
07c0: 72 69 6e 67 29 7d 2e 20 2a 2f 0a 20 20 20 20 70  ring)}. */.    p
07d0: 75 62 6c 69 63 20 73 74 61 74 69 63 20 66 69 6e  ublic static fin
07e0: 61 6c 20 69 6e 74 20 53 54 41 54 45 4d 45 4e 54  al int STATEMENT
07f0: 5f 53 45 4c 45 43 54 20 3d 20 31 3b 0a 20 20 20  _SELECT = 1;.   
0800: 20 2f 2a 2a 20 4f 6e 65 20 6f 66 20 74 68 65 20   /** One of the 
0810: 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64 20  values returned 
0820: 62 79 20 7b 40 6c 69 6e 6b 20 23 67 65 74 53 71  by {@link #getSq
0830: 6c 53 74 61 74 65 6d 65 6e 74 54 79 70 65 28 53  lStatementType(S
0840: 74 72 69 6e 67 29 7d 2e 20 2a 2f 0a 20 20 20 20  tring)}. */.    
0850: 70 75 62 6c 69 63 20 73 74 61 74 69 63 20 66 69  public static fi
0860: 6e 61 6c 20 69 6e 74 20 53 54 41 54 45 4d 45 4e  nal int STATEMEN
0870: 54 5f 55 50 44 41 54 45 20 3d 20 32 3b 0a 20 20  T_UPDATE = 2;.  
0880: 20 20 2f 2a 2a 20 4f 6e 65 20 6f 66 20 74 68 65    /** One of the
0890: 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65 64   values returned
08a0: 20 62 79 20 7b 40 6c 69 6e 6b 20 23 67 65 74 53   by {@link #getS
08b0: 71 6c 53 74 61 74 65 6d 65 6e 74 54 79 70 65 28  qlStatementType(
08c0: 53 74 72 69 6e 67 29 7d 2e 20 2a 2f 0a 20 20 20  String)}. */.   
08d0: 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20 66   public static f
08e0: 69 6e 61 6c 20 69 6e 74 20 53 54 41 54 45 4d 45  inal int STATEME
08f0: 4e 54 5f 41 54 54 41 43 48 20 3d 20 33 3b 0a 20  NT_ATTACH = 3;. 
0900: 20 20 20 2f 2a 2a 20 4f 6e 65 20 6f 66 20 74 68     /** One of th
0910: 65 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65  e values returne
0920: 64 20 62 79 20 7b 40 6c 69 6e 6b 20 23 67 65 74  d by {@link #get
0930: 53 71 6c 53 74 61 74 65 6d 65 6e 74 54 79 70 65  SqlStatementType
0940: 28 53 74 72 69 6e 67 29 7d 2e 20 2a 2f 0a 20 20  (String)}. */.  
0950: 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20    public static 
0960: 66 69 6e 61 6c 20 69 6e 74 20 53 54 41 54 45 4d  final int STATEM
0970: 45 4e 54 5f 42 45 47 49 4e 20 3d 20 34 3b 0a 20  ENT_BEGIN = 4;. 
0980: 20 20 20 2f 2a 2a 20 4f 6e 65 20 6f 66 20 74 68     /** One of th
0990: 65 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65  e values returne
09a0: 64 20 62 79 20 7b 40 6c 69 6e 6b 20 23 67 65 74  d by {@link #get
09b0: 53 71 6c 53 74 61 74 65 6d 65 6e 74 54 79 70 65  SqlStatementType
09c0: 28 53 74 72 69 6e 67 29 7d 2e 20 2a 2f 0a 20 20  (String)}. */.  
09d0: 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20    public static 
09e0: 66 69 6e 61 6c 20 69 6e 74 20 53 54 41 54 45 4d  final int STATEM
09f0: 45 4e 54 5f 43 4f 4d 4d 49 54 20 3d 20 35 3b 0a  ENT_COMMIT = 5;.
0a00: 20 20 20 20 2f 2a 2a 20 4f 6e 65 20 6f 66 20 74      /** One of t
0a10: 68 65 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e  he values return
0a20: 65 64 20 62 79 20 7b 40 6c 69 6e 6b 20 23 67 65  ed by {@link #ge
0a30: 74 53 71 6c 53 74 61 74 65 6d 65 6e 74 54 79 70  tSqlStatementTyp
0a40: 65 28 53 74 72 69 6e 67 29 7d 2e 20 2a 2f 0a 20  e(String)}. */. 
0a50: 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63     public static
0a60: 20 66 69 6e 61 6c 20 69 6e 74 20 53 54 41 54 45   final int STATE
0a70: 4d 45 4e 54 5f 41 42 4f 52 54 20 3d 20 36 3b 0a  MENT_ABORT = 6;.
0a80: 20 20 20 20 2f 2a 2a 20 4f 6e 65 20 6f 66 20 74      /** One of t
0a90: 68 65 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e  he values return
0aa0: 65 64 20 62 79 20 7b 40 6c 69 6e 6b 20 23 67 65  ed by {@link #ge
0ab0: 74 53 71 6c 53 74 61 74 65 6d 65 6e 74 54 79 70  tSqlStatementTyp
0ac0: 65 28 53 74 72 69 6e 67 29 7d 2e 20 2a 2f 0a 20  e(String)}. */. 
0ad0: 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63     public static
0ae0: 20 66 69 6e 61 6c 20 69 6e 74 20 53 54 41 54 45   final int STATE
0af0: 4d 45 4e 54 5f 50 52 41 47 4d 41 20 3d 20 37 3b  MENT_PRAGMA = 7;
0b00: 0a 20 20 20 20 2f 2a 2a 20 4f 6e 65 20 6f 66 20  .    /** One of 
0b10: 74 68 65 20 76 61 6c 75 65 73 20 72 65 74 75 72  the values retur
0b20: 6e 65 64 20 62 79 20 7b 40 6c 69 6e 6b 20 23 67  ned by {@link #g
0b30: 65 74 53 71 6c 53 74 61 74 65 6d 65 6e 74 54 79  etSqlStatementTy
0b40: 70 65 28 53 74 72 69 6e 67 29 7d 2e 20 2a 2f 0a  pe(String)}. */.
0b50: 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69      public stati
0b60: 63 20 66 69 6e 61 6c 20 69 6e 74 20 53 54 41 54  c final int STAT
0b70: 45 4d 45 4e 54 5f 44 44 4c 20 3d 20 38 3b 0a 20  EMENT_DDL = 8;. 
0b80: 20 20 20 2f 2a 2a 20 4f 6e 65 20 6f 66 20 74 68     /** One of th
0b90: 65 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65  e values returne
0ba0: 64 20 62 79 20 7b 40 6c 69 6e 6b 20 23 67 65 74  d by {@link #get
0bb0: 53 71 6c 53 74 61 74 65 6d 65 6e 74 54 79 70 65  SqlStatementType
0bc0: 28 53 74 72 69 6e 67 29 7d 2e 20 2a 2f 0a 20 20  (String)}. */.  
0bd0: 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20    public static 
0be0: 66 69 6e 61 6c 20 69 6e 74 20 53 54 41 54 45 4d  final int STATEM
0bf0: 45 4e 54 5f 55 4e 50 52 45 50 41 52 45 44 20 3d  ENT_UNPREPARED =
0c00: 20 39 3b 0a 20 20 20 20 2f 2a 2a 20 4f 6e 65 20   9;.    /** One 
0c10: 6f 66 20 74 68 65 20 76 61 6c 75 65 73 20 72 65  of the values re
0c20: 74 75 72 6e 65 64 20 62 79 20 7b 40 6c 69 6e 6b  turned by {@link
0c30: 20 23 67 65 74 53 71 6c 53 74 61 74 65 6d 65 6e   #getSqlStatemen
0c40: 74 54 79 70 65 28 53 74 72 69 6e 67 29 7d 2e 20  tType(String)}. 
0c50: 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20 73 74  */.    public st
0c60: 61 74 69 63 20 66 69 6e 61 6c 20 69 6e 74 20 53  atic final int S
0c70: 54 41 54 45 4d 45 4e 54 5f 4f 54 48 45 52 20 3d  TATEMENT_OTHER =
0c80: 20 39 39 3b 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20   99;..    /**.  
0c90: 20 20 20 2a 20 53 70 65 63 69 61 6c 20 66 75 6e     * Special fun
0ca0: 63 74 69 6f 6e 20 66 6f 72 20 77 72 69 74 69 6e  ction for writin
0cb0: 67 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 72  g an exception r
0cc0: 65 73 75 6c 74 20 61 74 20 74 68 65 20 68 65 61  esult at the hea
0cd0: 64 65 72 20 6f 66 0a 20 20 20 20 20 2a 20 61 20  der of.     * a 
0ce0: 70 61 72 63 65 6c 2c 20 74 6f 20 62 65 20 75 73  parcel, to be us
0cf0: 65 64 20 77 68 65 6e 20 72 65 74 75 72 6e 69 6e  ed when returnin
0d00: 67 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 66  g an exception f
0d10: 72 6f 6d 20 61 20 74 72 61 6e 73 61 63 74 69 6f  rom a transactio
0d20: 6e 2e 0a 20 20 20 20 20 2a 20 65 78 63 65 70 74  n..     * except
0d30: 69 6f 6e 20 77 69 6c 6c 20 62 65 20 72 65 2d 74  ion will be re-t
0d40: 68 72 6f 77 6e 20 62 79 20 74 68 65 20 66 75 6e  hrown by the fun
0d50: 63 74 69 6f 6e 20 69 6e 20 61 6e 6f 74 68 65 72  ction in another
0d60: 20 70 72 6f 63 65 73 73 0a 20 20 20 20 20 2a 20   process.     * 
0d70: 40 70 61 72 61 6d 20 72 65 70 6c 79 20 50 61 72  @param reply Par
0d80: 63 65 6c 20 74 6f 20 77 72 69 74 65 20 74 6f 0a  cel to write to.
0d90: 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 65 20       * @param e 
0da0: 54 68 65 20 45 78 63 65 70 74 69 6f 6e 20 74 6f  The Exception to
0db0: 20 62 65 20 77 72 69 74 74 65 6e 2e 0a 20 20 20   be written..   
0dc0: 20 20 2a 20 40 73 65 65 20 50 61 72 63 65 6c 23    * @see Parcel#
0dd0: 77 72 69 74 65 4e 6f 45 78 63 65 70 74 69 6f 6e  writeNoException
0de0: 0a 20 20 20 20 20 2a 20 40 73 65 65 20 50 61 72  .     * @see Par
0df0: 63 65 6c 23 77 72 69 74 65 45 78 63 65 70 74 69  cel#writeExcepti
0e00: 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70  on.     */.    p
0e10: 75 62 6c 69 63 20 73 74 61 74 69 63 20 66 69 6e  ublic static fin
0e20: 61 6c 20 76 6f 69 64 20 77 72 69 74 65 45 78 63  al void writeExc
0e30: 65 70 74 69 6f 6e 54 6f 50 61 72 63 65 6c 28 50  eptionToParcel(P
0e40: 61 72 63 65 6c 20 72 65 70 6c 79 2c 20 45 78 63  arcel reply, Exc
0e50: 65 70 74 69 6f 6e 20 65 29 20 7b 0a 20 20 20 20  eption e) {.    
0e60: 20 20 20 20 69 6e 74 20 63 6f 64 65 20 3d 20 30      int code = 0
0e70: 3b 0a 20 20 20 20 20 20 20 20 62 6f 6f 6c 65 61  ;.        boolea
0e80: 6e 20 6c 6f 67 45 78 63 65 70 74 69 6f 6e 20 3d  n logException =
0e90: 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20 69   true;.        i
0ea0: 66 20 28 65 20 69 6e 73 74 61 6e 63 65 6f 66 20  f (e instanceof 
0eb0: 46 69 6c 65 4e 6f 74 46 6f 75 6e 64 45 78 63 65  FileNotFoundExce
0ec0: 70 74 69 6f 6e 29 20 7b 0a 20 20 20 20 20 20 20  ption) {.       
0ed0: 20 20 20 20 20 63 6f 64 65 20 3d 20 31 3b 0a 20       code = 1;. 
0ee0: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 67 45 78             logEx
0ef0: 63 65 70 74 69 6f 6e 20 3d 20 66 61 6c 73 65 3b  ception = false;
0f00: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
0f10: 69 66 20 28 65 20 69 6e 73 74 61 6e 63 65 6f 66  if (e instanceof
0f20: 20 49 6c 6c 65 67 61 6c 41 72 67 75 6d 65 6e 74   IllegalArgument
0f30: 45 78 63 65 70 74 69 6f 6e 29 20 7b 0a 20 20 20  Exception) {.   
0f40: 20 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20           code = 
0f50: 32 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  2;.        } els
0f60: 65 20 69 66 20 28 65 20 69 6e 73 74 61 6e 63 65  e if (e instance
0f70: 6f 66 20 55 6e 73 75 70 70 6f 72 74 65 64 4f 70  of UnsupportedOp
0f80: 65 72 61 74 69 6f 6e 45 78 63 65 70 74 69 6f 6e  erationException
0f90: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
0fa0: 63 6f 64 65 20 3d 20 33 3b 0a 20 20 20 20 20 20  code = 3;.      
0fb0: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 65 20 69    } else if (e i
0fc0: 6e 73 74 61 6e 63 65 6f 66 20 53 51 4c 69 74 65  nstanceof SQLite
0fd0: 41 62 6f 72 74 45 78 63 65 70 74 69 6f 6e 29 20  AbortException) 
0fe0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
0ff0: 64 65 20 3d 20 34 3b 0a 20 20 20 20 20 20 20 20  de = 4;.        
1000: 7d 20 65 6c 73 65 20 69 66 20 28 65 20 69 6e 73  } else if (e ins
1010: 74 61 6e 63 65 6f 66 20 53 51 4c 69 74 65 43 6f  tanceof SQLiteCo
1020: 6e 73 74 72 61 69 6e 74 45 78 63 65 70 74 69 6f  nstraintExceptio
1030: 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n) {.           
1040: 20 63 6f 64 65 20 3d 20 35 3b 0a 20 20 20 20 20   code = 5;.     
1050: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 65 20     } else if (e 
1060: 69 6e 73 74 61 6e 63 65 6f 66 20 53 51 4c 69 74  instanceof SQLit
1070: 65 44 61 74 61 62 61 73 65 43 6f 72 72 75 70 74  eDatabaseCorrupt
1080: 45 78 63 65 70 74 69 6f 6e 29 20 7b 0a 20 20 20  Exception) {.   
1090: 20 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d 20           code = 
10a0: 36 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  6;.        } els
10b0: 65 20 69 66 20 28 65 20 69 6e 73 74 61 6e 63 65  e if (e instance
10c0: 6f 66 20 53 51 4c 69 74 65 46 75 6c 6c 45 78 63  of SQLiteFullExc
10d0: 65 70 74 69 6f 6e 29 20 7b 0a 20 20 20 20 20 20  eption) {.      
10e0: 20 20 20 20 20 20 63 6f 64 65 20 3d 20 37 3b 0a        code = 7;.
10f0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69          } else i
1100: 66 20 28 65 20 69 6e 73 74 61 6e 63 65 6f 66 20  f (e instanceof 
1110: 53 51 4c 69 74 65 44 69 73 6b 49 4f 45 78 63 65  SQLiteDiskIOExce
1120: 70 74 69 6f 6e 29 20 7b 0a 20 20 20 20 20 20 20  ption) {.       
1130: 20 20 20 20 20 63 6f 64 65 20 3d 20 38 3b 0a 20       code = 8;. 
1140: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66         } else if
1150: 20 28 65 20 69 6e 73 74 61 6e 63 65 6f 66 20 53   (e instanceof S
1160: 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e 29 20  QLiteException) 
1170: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
1180: 64 65 20 3d 20 39 3b 0a 20 20 20 20 20 20 20 20  de = 9;.        
1190: 7d 20 65 6c 73 65 20 69 66 20 28 65 20 69 6e 73  } else if (e ins
11a0: 74 61 6e 63 65 6f 66 20 4f 70 65 72 61 74 69 6f  tanceof Operatio
11b0: 6e 41 70 70 6c 69 63 61 74 69 6f 6e 45 78 63 65  nApplicationExce
11c0: 70 74 69 6f 6e 29 20 7b 0a 20 20 20 20 20 20 20  ption) {.       
11d0: 20 20 20 20 20 63 6f 64 65 20 3d 20 31 30 3b 0a       code = 10;.
11e0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69          } else i
11f0: 66 20 28 65 20 69 6e 73 74 61 6e 63 65 6f 66 20  f (e instanceof 
1200: 4f 70 65 72 61 74 69 6f 6e 43 61 6e 63 65 6c 65  OperationCancele
1210: 64 45 78 63 65 70 74 69 6f 6e 29 20 7b 0a 20 20  dException) {.  
1220: 20 20 20 20 20 20 20 20 20 20 63 6f 64 65 20 3d            code =
1230: 20 31 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   11;.           
1240: 20 6c 6f 67 45 78 63 65 70 74 69 6f 6e 20 3d 20   logException = 
1250: 66 61 6c 73 65 3b 0a 20 20 20 20 20 20 20 20 7d  false;.        }
1260: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
1270: 20 20 20 20 72 65 70 6c 79 2e 77 72 69 74 65 45      reply.writeE
1280: 78 63 65 70 74 69 6f 6e 28 65 29 3b 0a 20 20 20  xception(e);.   
1290: 20 20 20 20 20 20 20 20 20 4c 6f 67 2e 65 28 54           Log.e(T
12a0: 41 47 2c 20 22 57 72 69 74 69 6e 67 20 65 78 63  AG, "Writing exc
12b0: 65 70 74 69 6f 6e 20 74 6f 20 70 61 72 63 65 6c  eption to parcel
12c0: 22 2c 20 65 29 3b 0a 20 20 20 20 20 20 20 20 20  ", e);.         
12d0: 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20 20     return;.     
12e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65 70     }.        rep
12f0: 6c 79 2e 77 72 69 74 65 49 6e 74 28 63 6f 64 65  ly.writeInt(code
1300: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 70 6c 79  );.        reply
1310: 2e 77 72 69 74 65 53 74 72 69 6e 67 28 65 2e 67  .writeString(e.g
1320: 65 74 4d 65 73 73 61 67 65 28 29 29 3b 0a 0a 20  etMessage());.. 
1330: 20 20 20 20 20 20 20 69 66 20 28 6c 6f 67 45 78         if (logEx
1340: 63 65 70 74 69 6f 6e 29 20 7b 0a 20 20 20 20 20  ception) {.     
1350: 20 20 20 20 20 20 20 4c 6f 67 2e 65 28 54 41 47         Log.e(TAG
1360: 2c 20 22 57 72 69 74 69 6e 67 20 65 78 63 65 70  , "Writing excep
1370: 74 69 6f 6e 20 74 6f 20 70 61 72 63 65 6c 22 2c  tion to parcel",
1380: 20 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   e);.        }. 
1390: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20     }..    /**.  
13a0: 20 20 20 2a 20 53 70 65 63 69 61 6c 20 66 75 6e     * Special fun
13b0: 63 74 69 6f 6e 20 66 6f 72 20 72 65 61 64 69 6e  ction for readin
13c0: 67 20 61 6e 20 65 78 63 65 70 74 69 6f 6e 20 72  g an exception r
13d0: 65 73 75 6c 74 20 66 72 6f 6d 20 74 68 65 20 68  esult from the h
13e0: 65 61 64 65 72 20 6f 66 0a 20 20 20 20 20 2a 20  eader of.     * 
13f0: 61 20 70 61 72 63 65 6c 2c 20 74 6f 20 62 65 20  a parcel, to be 
1400: 75 73 65 64 20 61 66 74 65 72 20 72 65 63 65 69  used after recei
1410: 76 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74 20  ving the result 
1420: 6f 66 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e  of a transaction
1430: 2e 20 20 54 68 69 73 0a 20 20 20 20 20 2a 20 77  .  This.     * w
1440: 69 6c 6c 20 74 68 72 6f 77 20 74 68 65 20 65 78  ill throw the ex
1450: 63 65 70 74 69 6f 6e 20 66 6f 72 20 79 6f 75 20  ception for you 
1460: 69 66 20 69 74 20 68 61 64 20 62 65 65 6e 20 77  if it had been w
1470: 72 69 74 74 65 6e 20 74 6f 20 74 68 65 20 50 61  ritten to the Pa
1480: 72 63 65 6c 2c 0a 20 20 20 20 20 2a 20 6f 74 68  rcel,.     * oth
1490: 65 72 77 69 73 65 20 72 65 74 75 72 6e 20 61 6e  erwise return an
14a0: 64 20 6c 65 74 20 79 6f 75 20 72 65 61 64 20 74  d let you read t
14b0: 68 65 20 6e 6f 72 6d 61 6c 20 72 65 73 75 6c 74  he normal result
14c0: 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 50   data from the P
14d0: 61 72 63 65 6c 2e 0a 20 20 20 20 20 2a 20 40 70  arcel..     * @p
14e0: 61 72 61 6d 20 72 65 70 6c 79 20 50 61 72 63 65  aram reply Parce
14f0: 6c 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 0a 20  l to read from. 
1500: 20 20 20 20 2a 20 40 73 65 65 20 50 61 72 63 65      * @see Parce
1510: 6c 23 77 72 69 74 65 4e 6f 45 78 63 65 70 74 69  l#writeNoExcepti
1520: 6f 6e 0a 20 20 20 20 20 2a 20 40 73 65 65 20 50  on.     * @see P
1530: 61 72 63 65 6c 23 72 65 61 64 45 78 63 65 70 74  arcel#readExcept
1540: 69 6f 6e 0a 20 20 20 20 20 2a 2f 0a 2f 2f 20 20  ion.     */.//  
1550: 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20    public static 
1560: 66 69 6e 61 6c 20 76 6f 69 64 20 72 65 61 64 45  final void readE
1570: 78 63 65 70 74 69 6f 6e 46 72 6f 6d 50 61 72 63  xceptionFromParc
1580: 65 6c 28 50 61 72 63 65 6c 20 72 65 70 6c 79 29  el(Parcel reply)
1590: 20 7b 0a 2f 2f 20 20 20 20 20 20 20 20 69 6e 74   {.//        int
15a0: 20 63 6f 64 65 20 3d 20 72 65 70 6c 79 2e 72 65   code = reply.re
15b0: 61 64 45 78 63 65 70 74 69 6f 6e 43 6f 64 65 28  adExceptionCode(
15c0: 29 3b 0a 2f 2f 20 20 20 20 20 20 20 20 69 66 20  );.//        if 
15d0: 28 63 6f 64 65 20 3d 3d 20 30 29 20 72 65 74 75  (code == 0) retu
15e0: 72 6e 3b 0a 2f 2f 20 20 20 20 20 20 20 20 53 74  rn;.//        St
15f0: 72 69 6e 67 20 6d 73 67 20 3d 20 72 65 70 6c 79  ring msg = reply
1600: 2e 72 65 61 64 53 74 72 69 6e 67 28 29 3b 0a 2f  .readString();./
1610: 2f 20 20 20 20 20 20 20 20 44 61 74 61 62 61 73  /        Databas
1620: 65 55 74 69 6c 73 2e 72 65 61 64 45 78 63 65 70  eUtils.readExcep
1630: 74 69 6f 6e 46 72 6f 6d 50 61 72 63 65 6c 28 72  tionFromParcel(r
1640: 65 70 6c 79 2c 20 6d 73 67 2c 20 63 6f 64 65 29  eply, msg, code)
1650: 3b 0a 2f 2f 20 20 20 20 7d 0a 2f 2f 0a 2f 2f 20  ;.//    }.//.// 
1660: 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63     public static
1670: 20 76 6f 69 64 20 72 65 61 64 45 78 63 65 70 74   void readExcept
1680: 69 6f 6e 57 69 74 68 46 69 6c 65 4e 6f 74 46 6f  ionWithFileNotFo
1690: 75 6e 64 45 78 63 65 70 74 69 6f 6e 46 72 6f 6d  undExceptionFrom
16a0: 50 61 72 63 65 6c 28 0a 2f 2f 20 20 20 20 20 20  Parcel(.//      
16b0: 20 20 20 20 20 20 50 61 72 63 65 6c 20 72 65 70        Parcel rep
16c0: 6c 79 29 20 74 68 72 6f 77 73 20 46 69 6c 65 4e  ly) throws FileN
16d0: 6f 74 46 6f 75 6e 64 45 78 63 65 70 74 69 6f 6e  otFoundException
16e0: 20 7b 0a 2f 2f 20 20 20 20 20 20 20 20 69 6e 74   {.//        int
16f0: 20 63 6f 64 65 20 3d 20 72 65 70 6c 79 2e 72 65   code = reply.re
1700: 61 64 45 78 63 65 70 74 69 6f 6e 43 6f 64 65 28  adExceptionCode(
1710: 29 3b 0a 2f 2f 20 20 20 20 20 20 20 20 69 66 20  );.//        if 
1720: 28 63 6f 64 65 20 3d 3d 20 30 29 20 72 65 74 75  (code == 0) retu
1730: 72 6e 3b 0a 2f 2f 20 20 20 20 20 20 20 20 53 74  rn;.//        St
1740: 72 69 6e 67 20 6d 73 67 20 3d 20 72 65 70 6c 79  ring msg = reply
1750: 2e 72 65 61 64 53 74 72 69 6e 67 28 29 3b 0a 2f  .readString();./
1760: 2f 20 20 20 20 20 20 20 20 69 66 20 28 63 6f 64  /        if (cod
1770: 65 20 3d 3d 20 31 29 20 7b 0a 2f 2f 20 20 20 20  e == 1) {.//    
1780: 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65          throw ne
1790: 77 20 46 69 6c 65 4e 6f 74 46 6f 75 6e 64 45 78  w FileNotFoundEx
17a0: 63 65 70 74 69 6f 6e 28 6d 73 67 29 3b 0a 2f 2f  ception(msg);.//
17b0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
17c0: 0a 2f 2f 20 20 20 20 20 20 20 20 20 20 20 20 44  .//            D
17d0: 61 74 61 62 61 73 65 55 74 69 6c 73 2e 72 65 61  atabaseUtils.rea
17e0: 64 45 78 63 65 70 74 69 6f 6e 46 72 6f 6d 50 61  dExceptionFromPa
17f0: 72 63 65 6c 28 72 65 70 6c 79 2c 20 6d 73 67 2c  rcel(reply, msg,
1800: 20 63 6f 64 65 29 3b 0a 2f 2f 20 20 20 20 20 20   code);.//      
1810: 20 20 7d 0a 2f 2f 20 20 20 20 7d 0a 2f 2f 0a 2f    }.//    }.//./
1820: 2f 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74  /    public stat
1830: 69 63 20 76 6f 69 64 20 72 65 61 64 45 78 63 65  ic void readExce
1840: 70 74 69 6f 6e 57 69 74 68 4f 70 65 72 61 74 69  ptionWithOperati
1850: 6f 6e 41 70 70 6c 69 63 61 74 69 6f 6e 45 78 63  onApplicationExc
1860: 65 70 74 69 6f 6e 46 72 6f 6d 50 61 72 63 65 6c  eptionFromParcel
1870: 28 0a 2f 2f 20 20 20 20 20 20 20 20 20 20 20 20  (.//            
1880: 50 61 72 63 65 6c 20 72 65 70 6c 79 29 20 74 68  Parcel reply) th
1890: 72 6f 77 73 20 4f 70 65 72 61 74 69 6f 6e 41 70  rows OperationAp
18a0: 70 6c 69 63 61 74 69 6f 6e 45 78 63 65 70 74 69  plicationExcepti
18b0: 6f 6e 20 7b 0a 2f 2f 20 20 20 20 20 20 20 20 69  on {.//        i
18c0: 6e 74 20 63 6f 64 65 20 3d 20 72 65 70 6c 79 2e  nt code = reply.
18d0: 72 65 61 64 45 78 63 65 70 74 69 6f 6e 43 6f 64  readExceptionCod
18e0: 65 28 29 3b 0a 2f 2f 20 20 20 20 20 20 20 20 69  e();.//        i
18f0: 66 20 28 63 6f 64 65 20 3d 3d 20 30 29 20 72 65  f (code == 0) re
1900: 74 75 72 6e 3b 0a 2f 2f 20 20 20 20 20 20 20 20  turn;.//        
1910: 53 74 72 69 6e 67 20 6d 73 67 20 3d 20 72 65 70  String msg = rep
1920: 6c 79 2e 72 65 61 64 53 74 72 69 6e 67 28 29 3b  ly.readString();
1930: 0a 2f 2f 20 20 20 20 20 20 20 20 69 66 20 28 63  .//        if (c
1940: 6f 64 65 20 3d 3d 20 31 30 29 20 7b 0a 2f 2f 20  ode == 10) {.// 
1950: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77             throw
1960: 20 6e 65 77 20 4f 70 65 72 61 74 69 6f 6e 41 70   new OperationAp
1970: 70 6c 69 63 61 74 69 6f 6e 45 78 63 65 70 74 69  plicationExcepti
1980: 6f 6e 28 6d 73 67 29 3b 0a 2f 2f 20 20 20 20 20  on(msg);.//     
1990: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 2f 2f 20 20     } else {.//  
19a0: 20 20 20 20 20 20 20 20 20 20 44 61 74 61 62 61            Databa
19b0: 73 65 55 74 69 6c 73 2e 72 65 61 64 45 78 63 65  seUtils.readExce
19c0: 70 74 69 6f 6e 46 72 6f 6d 50 61 72 63 65 6c 28  ptionFromParcel(
19d0: 72 65 70 6c 79 2c 20 6d 73 67 2c 20 63 6f 64 65  reply, msg, code
19e0: 29 3b 0a 2f 2f 20 20 20 20 20 20 20 20 7d 0a 2f  );.//        }./
19f0: 2f 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 69 76  /    }..    priv
1a00: 61 74 65 20 73 74 61 74 69 63 20 66 69 6e 61 6c  ate static final
1a10: 20 76 6f 69 64 20 72 65 61 64 45 78 63 65 70 74   void readExcept
1a20: 69 6f 6e 46 72 6f 6d 50 61 72 63 65 6c 28 50 61  ionFromParcel(Pa
1a30: 72 63 65 6c 20 72 65 70 6c 79 2c 20 53 74 72 69  rcel reply, Stri
1a40: 6e 67 20 6d 73 67 2c 20 69 6e 74 20 63 6f 64 65  ng msg, int code
1a50: 29 20 7b 0a 20 20 20 20 20 20 20 20 73 77 69 74  ) {.        swit
1a60: 63 68 20 28 63 6f 64 65 29 20 7b 0a 20 20 20 20  ch (code) {.    
1a70: 20 20 20 20 20 20 20 20 63 61 73 65 20 32 3a 0a          case 2:.
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a90: 74 68 72 6f 77 20 6e 65 77 20 49 6c 6c 65 67 61  throw new Illega
1aa0: 6c 41 72 67 75 6d 65 6e 74 45 78 63 65 70 74 69  lArgumentExcepti
1ab0: 6f 6e 28 6d 73 67 29 3b 0a 20 20 20 20 20 20 20  on(msg);.       
1ac0: 20 20 20 20 20 63 61 73 65 20 33 3a 0a 20 20 20       case 3:.   
1ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72               thr
1ae0: 6f 77 20 6e 65 77 20 55 6e 73 75 70 70 6f 72 74  ow new Unsupport
1af0: 65 64 4f 70 65 72 61 74 69 6f 6e 45 78 63 65 70  edOperationExcep
1b00: 74 69 6f 6e 28 6d 73 67 29 3b 0a 20 20 20 20 20  tion(msg);.     
1b10: 20 20 20 20 20 20 20 63 61 73 65 20 34 3a 0a 20         case 4:. 
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
1b30: 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74 65 41  hrow new SQLiteA
1b40: 62 6f 72 74 45 78 63 65 70 74 69 6f 6e 28 6d 73  bortException(ms
1b50: 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  g);.            
1b60: 63 61 73 65 20 35 3a 0a 20 20 20 20 20 20 20 20  case 5:.        
1b70: 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65          throw ne
1b80: 77 20 53 51 4c 69 74 65 43 6f 6e 73 74 72 61 69  w SQLiteConstrai
1b90: 6e 74 45 78 63 65 70 74 69 6f 6e 28 6d 73 67 29  ntException(msg)
1ba0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 61  ;.            ca
1bb0: 73 65 20 36 3a 0a 20 20 20 20 20 20 20 20 20 20  se 6:.          
1bc0: 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20        throw new 
1bd0: 53 51 4c 69 74 65 44 61 74 61 62 61 73 65 43 6f  SQLiteDatabaseCo
1be0: 72 72 75 70 74 45 78 63 65 70 74 69 6f 6e 28 6d  rruptException(m
1bf0: 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  sg);.           
1c00: 20 63 61 73 65 20 37 3a 0a 20 20 20 20 20 20 20   case 7:.       
1c10: 20 20 20 20 20 20 20 20 20 74 68 72 6f 77 20 6e           throw n
1c20: 65 77 20 53 51 4c 69 74 65 46 75 6c 6c 45 78 63  ew SQLiteFullExc
1c30: 65 70 74 69 6f 6e 28 6d 73 67 29 3b 0a 20 20 20  eption(msg);.   
1c40: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 38 3a           case 8:
1c50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1c60: 20 74 68 72 6f 77 20 6e 65 77 20 53 51 4c 69 74   throw new SQLit
1c70: 65 44 69 73 6b 49 4f 45 78 63 65 70 74 69 6f 6e  eDiskIOException
1c80: 28 6d 73 67 29 3b 0a 20 20 20 20 20 20 20 20 20  (msg);.         
1c90: 20 20 20 63 61 73 65 20 39 3a 0a 20 20 20 20 20     case 9:.     
1ca0: 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f 77             throw
1cb0: 20 6e 65 77 20 53 51 4c 69 74 65 45 78 63 65 70   new SQLiteExcep
1cc0: 74 69 6f 6e 28 6d 73 67 29 3b 0a 20 20 20 20 20  tion(msg);.     
1cd0: 20 20 20 20 20 20 20 63 61 73 65 20 31 31 3a 0a         case 11:.
1ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cf0: 74 68 72 6f 77 20 6e 65 77 20 4f 70 65 72 61 74  throw new Operat
1d00: 69 6f 6e 43 61 6e 63 65 6c 65 64 45 78 63 65 70  ionCanceledExcep
1d10: 74 69 6f 6e 28 6d 73 67 29 3b 0a 20 20 20 20 20  tion(msg);.     
1d20: 20 20 20 20 20 20 20 64 65 66 61 75 6c 74 3a 0a         default:.
1d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d40: 72 65 70 6c 79 2e 72 65 61 64 45 78 63 65 70 74  reply.readExcept
1d50: 69 6f 6e 28 63 6f 64 65 2c 20 6d 73 67 29 3b 0a  ion(code, msg);.
1d60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
1d70: 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20  .    /**.     * 
1d80: 42 69 6e 64 73 20 74 68 65 20 67 69 76 65 6e 20  Binds the given 
1d90: 4f 62 6a 65 63 74 20 74 6f 20 74 68 65 20 67 69  Object to the gi
1da0: 76 65 6e 20 53 51 4c 69 74 65 50 72 6f 67 72 61  ven SQLiteProgra
1db0: 6d 20 75 73 69 6e 67 20 74 68 65 20 70 72 6f 70  m using the prop
1dc0: 65 72 0a 20 20 20 20 20 2a 20 74 79 70 69 6e 67  er.     * typing
1dd0: 2e 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20 62  . For example, b
1de0: 69 6e 64 20 6e 75 6d 62 65 72 73 20 61 73 20 6c  ind numbers as l
1df0: 6f 6e 67 73 2f 64 6f 75 62 6c 65 73 2c 20 61 6e  ongs/doubles, an
1e00: 64 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73  d everything els
1e10: 65 0a 20 20 20 20 20 2a 20 61 73 20 61 20 73 74  e.     * as a st
1e20: 72 69 6e 67 20 62 79 20 63 61 6c 6c 20 74 6f 53  ring by call toS
1e30: 74 72 69 6e 67 28 29 20 6f 6e 20 69 74 2e 0a 20  tring() on it.. 
1e40: 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 70 61      *.     * @pa
1e50: 72 61 6d 20 70 72 6f 67 20 74 68 65 20 70 72 6f  ram prog the pro
1e60: 67 72 61 6d 20 74 6f 20 62 69 6e 64 20 74 68 65  gram to bind the
1e70: 20 6f 62 6a 65 63 74 20 74 6f 0a 20 20 20 20 20   object to.     
1e80: 2a 20 40 70 61 72 61 6d 20 69 6e 64 65 78 20 74  * @param index t
1e90: 68 65 20 31 2d 62 61 73 65 64 20 69 6e 64 65 78  he 1-based index
1ea0: 20 74 6f 20 62 69 6e 64 20 61 74 0a 20 20 20 20   to bind at.    
1eb0: 20 2a 20 40 70 61 72 61 6d 20 76 61 6c 75 65 20   * @param value 
1ec0: 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 69 6e  the value to bin
1ed0: 64 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 75  d.     */.    pu
1ee0: 62 6c 69 63 20 73 74 61 74 69 63 20 76 6f 69 64  blic static void
1ef0: 20 62 69 6e 64 4f 62 6a 65 63 74 54 6f 50 72 6f   bindObjectToPro
1f00: 67 72 61 6d 28 53 51 4c 69 74 65 50 72 6f 67 72  gram(SQLiteProgr
1f10: 61 6d 20 70 72 6f 67 2c 20 69 6e 74 20 69 6e 64  am prog, int ind
1f20: 65 78 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  ex,.            
1f30: 4f 62 6a 65 63 74 20 76 61 6c 75 65 29 20 7b 0a  Object value) {.
1f40: 20 20 20 20 20 20 20 20 69 66 20 28 76 61 6c 75          if (valu
1f50: 65 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20  e == null) {.   
1f60: 20 20 20 20 20 20 20 20 20 70 72 6f 67 2e 62 69           prog.bi
1f70: 6e 64 4e 75 6c 6c 28 69 6e 64 65 78 29 3b 0a 20  ndNull(index);. 
1f80: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66         } else if
1f90: 20 28 76 61 6c 75 65 20 69 6e 73 74 61 6e 63 65   (value instance
1fa0: 6f 66 20 44 6f 75 62 6c 65 20 7c 7c 20 76 61 6c  of Double || val
1fb0: 75 65 20 69 6e 73 74 61 6e 63 65 6f 66 20 46 6c  ue instanceof Fl
1fc0: 6f 61 74 29 20 7b 0a 20 20 20 20 20 20 20 20 20  oat) {.         
1fd0: 20 20 20 70 72 6f 67 2e 62 69 6e 64 44 6f 75 62     prog.bindDoub
1fe0: 6c 65 28 69 6e 64 65 78 2c 20 28 28 4e 75 6d 62  le(index, ((Numb
1ff0: 65 72 29 76 61 6c 75 65 29 2e 64 6f 75 62 6c 65  er)value).double
2000: 56 61 6c 75 65 28 29 29 3b 0a 20 20 20 20 20 20  Value());.      
2010: 20 20 7d 20 65 6c 73 65 20 69 66 20 28 76 61 6c    } else if (val
2020: 75 65 20 69 6e 73 74 61 6e 63 65 6f 66 20 4e 75  ue instanceof Nu
2030: 6d 62 65 72 29 20 7b 0a 20 20 20 20 20 20 20 20  mber) {.        
2040: 20 20 20 20 70 72 6f 67 2e 62 69 6e 64 4c 6f 6e      prog.bindLon
2050: 67 28 69 6e 64 65 78 2c 20 28 28 4e 75 6d 62 65  g(index, ((Numbe
2060: 72 29 76 61 6c 75 65 29 2e 6c 6f 6e 67 56 61 6c  r)value).longVal
2070: 75 65 28 29 29 3b 0a 20 20 20 20 20 20 20 20 7d  ue());.        }
2080: 20 65 6c 73 65 20 69 66 20 28 76 61 6c 75 65 20   else if (value 
2090: 69 6e 73 74 61 6e 63 65 6f 66 20 42 6f 6f 6c 65  instanceof Boole
20a0: 61 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  an) {.          
20b0: 20 20 42 6f 6f 6c 65 61 6e 20 62 6f 6f 6c 20 3d    Boolean bool =
20c0: 20 28 42 6f 6f 6c 65 61 6e 29 76 61 6c 75 65 3b   (Boolean)value;
20d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
20e0: 28 62 6f 6f 6c 29 20 7b 0a 20 20 20 20 20 20 20  (bool) {.       
20f0: 20 20 20 20 20 20 20 20 20 70 72 6f 67 2e 62 69           prog.bi
2100: 6e 64 4c 6f 6e 67 28 69 6e 64 65 78 2c 20 31 29  ndLong(index, 1)
2110: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ;.            } 
2120: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
2130: 20 20 20 20 20 20 20 70 72 6f 67 2e 62 69 6e 64         prog.bind
2140: 4c 6f 6e 67 28 69 6e 64 65 78 2c 20 30 29 3b 0a  Long(index, 0);.
2150: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2160: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20        } else if 
2170: 28 76 61 6c 75 65 20 69 6e 73 74 61 6e 63 65 6f  (value instanceo
2180: 66 20 62 79 74 65 5b 5d 29 7b 0a 20 20 20 20 20  f byte[]){.     
2190: 20 20 20 20 20 20 20 70 72 6f 67 2e 62 69 6e 64         prog.bind
21a0: 42 6c 6f 62 28 69 6e 64 65 78 2c 20 28 62 79 74  Blob(index, (byt
21b0: 65 5b 5d 29 20 76 61 6c 75 65 29 3b 0a 20 20 20  e[]) value);.   
21c0: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
21d0: 20 20 20 20 20 20 20 20 20 20 70 72 6f 67 2e 62            prog.b
21e0: 69 6e 64 53 74 72 69 6e 67 28 69 6e 64 65 78 2c  indString(index,
21f0: 20 76 61 6c 75 65 2e 74 6f 53 74 72 69 6e 67 28   value.toString(
2200: 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ));.        }.  
2210: 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20    }..    /**.   
2220: 20 20 2a 20 52 65 74 75 72 6e 73 20 64 61 74 61    * Returns data
2230: 20 74 79 70 65 20 6f 66 20 74 68 65 20 67 69 76   type of the giv
2240: 65 6e 20 6f 62 6a 65 63 74 27 73 20 76 61 6c 75  en object's valu
2250: 65 2e 0a 20 20 20 20 20 2a 3c 70 3e 0a 20 20 20  e..     *<p>.   
2260: 20 20 2a 20 52 65 74 75 72 6e 65 64 20 76 61 6c    * Returned val
2270: 75 65 73 20 61 72 65 0a 20 20 20 20 20 2a 20 3c  ues are.     * <
2280: 75 6c 3e 0a 20 20 20 20 20 2a 20 20 20 3c 6c 69  ul>.     *   <li
2290: 3e 7b 40 6c 69 6e 6b 20 43 75 72 73 6f 72 23 46  >{@link Cursor#F
22a0: 49 45 4c 44 5f 54 59 50 45 5f 4e 55 4c 4c 7d 3c  IELD_TYPE_NULL}<
22b0: 2f 6c 69 3e 0a 20 20 20 20 20 2a 20 20 20 3c 6c  /li>.     *   <l
22c0: 69 3e 7b 40 6c 69 6e 6b 20 43 75 72 73 6f 72 23  i>{@link Cursor#
22d0: 46 49 45 4c 44 5f 54 59 50 45 5f 49 4e 54 45 47  FIELD_TYPE_INTEG
22e0: 45 52 7d 3c 2f 6c 69 3e 0a 20 20 20 20 20 2a 20  ER}</li>.     * 
22f0: 20 20 3c 6c 69 3e 7b 40 6c 69 6e 6b 20 43 75 72    <li>{@link Cur
2300: 73 6f 72 23 46 49 45 4c 44 5f 54 59 50 45 5f 46  sor#FIELD_TYPE_F
2310: 4c 4f 41 54 7d 3c 2f 6c 69 3e 0a 20 20 20 20 20  LOAT}</li>.     
2320: 2a 20 20 20 3c 6c 69 3e 7b 40 6c 69 6e 6b 20 43  *   <li>{@link C
2330: 75 72 73 6f 72 23 46 49 45 4c 44 5f 54 59 50 45  ursor#FIELD_TYPE
2340: 5f 53 54 52 49 4e 47 7d 3c 2f 6c 69 3e 0a 20 20  _STRING}</li>.  
2350: 20 20 20 2a 20 20 20 3c 6c 69 3e 7b 40 6c 69 6e     *   <li>{@lin
2360: 6b 20 43 75 72 73 6f 72 23 46 49 45 4c 44 5f 54  k Cursor#FIELD_T
2370: 59 50 45 5f 42 4c 4f 42 7d 3c 2f 6c 69 3e 0a 20  YPE_BLOB}</li>. 
2380: 20 20 20 20 2a 3c 2f 75 6c 3e 0a 20 20 20 20 20      *</ul>.     
2390: 2a 3c 2f 70 3e 0a 20 20 20 20 20 2a 0a 20 20 20  *</p>.     *.   
23a0: 20 20 2a 20 40 70 61 72 61 6d 20 6f 62 6a 20 74    * @param obj t
23b0: 68 65 20 6f 62 6a 65 63 74 20 77 68 6f 73 65 20  he object whose 
23c0: 76 61 6c 75 65 20 74 79 70 65 20 69 73 20 74 6f  value type is to
23d0: 20 62 65 20 72 65 74 75 72 6e 65 64 0a 20 20 20   be returned.   
23e0: 20 20 2a 20 40 72 65 74 75 72 6e 20 6f 62 6a 65    * @return obje
23f0: 63 74 20 76 61 6c 75 65 20 74 79 70 65 0a 20 20  ct value type.  
2400: 20 20 20 2a 20 40 68 69 64 65 0a 20 20 20 20 20     * @hide.     
2410: 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20 73 74  */.    public st
2420: 61 74 69 63 20 69 6e 74 20 67 65 74 54 79 70 65  atic int getType
2430: 4f 66 4f 62 6a 65 63 74 28 4f 62 6a 65 63 74 20  OfObject(Object 
2440: 6f 62 6a 29 20 7b 0a 20 20 20 20 20 20 20 20 69  obj) {.        i
2450: 66 20 28 6f 62 6a 20 3d 3d 20 6e 75 6c 6c 29 20  f (obj == null) 
2460: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
2470: 74 75 72 6e 20 43 75 72 73 6f 72 2e 46 49 45 4c  turn Cursor.FIEL
2480: 44 5f 54 59 50 45 5f 4e 55 4c 4c 3b 0a 20 20 20  D_TYPE_NULL;.   
2490: 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28       } else if (
24a0: 6f 62 6a 20 69 6e 73 74 61 6e 63 65 6f 66 20 62  obj instanceof b
24b0: 79 74 65 5b 5d 29 20 7b 0a 20 20 20 20 20 20 20  yte[]) {.       
24c0: 20 20 20 20 20 72 65 74 75 72 6e 20 43 75 72 73       return Curs
24d0: 6f 72 2e 46 49 45 4c 44 5f 54 59 50 45 5f 42 4c  or.FIELD_TYPE_BL
24e0: 4f 42 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  OB;.        } el
24f0: 73 65 20 69 66 20 28 6f 62 6a 20 69 6e 73 74 61  se if (obj insta
2500: 6e 63 65 6f 66 20 46 6c 6f 61 74 20 7c 7c 20 6f  nceof Float || o
2510: 62 6a 20 69 6e 73 74 61 6e 63 65 6f 66 20 44 6f  bj instanceof Do
2520: 75 62 6c 65 29 20 7b 0a 20 20 20 20 20 20 20 20  uble) {.        
2530: 20 20 20 20 72 65 74 75 72 6e 20 43 75 72 73 6f      return Curso
2540: 72 2e 46 49 45 4c 44 5f 54 59 50 45 5f 46 4c 4f  r.FIELD_TYPE_FLO
2550: 41 54 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c  AT;.        } el
2560: 73 65 20 69 66 20 28 6f 62 6a 20 69 6e 73 74 61  se if (obj insta
2570: 6e 63 65 6f 66 20 4c 6f 6e 67 20 7c 7c 20 6f 62  nceof Long || ob
2580: 6a 20 69 6e 73 74 61 6e 63 65 6f 66 20 49 6e 74  j instanceof Int
2590: 65 67 65 72 0a 20 20 20 20 20 20 20 20 20 20 20  eger.           
25a0: 20 20 20 20 20 7c 7c 20 6f 62 6a 20 69 6e 73 74       || obj inst
25b0: 61 6e 63 65 6f 66 20 53 68 6f 72 74 20 7c 7c 20  anceof Short || 
25c0: 6f 62 6a 20 69 6e 73 74 61 6e 63 65 6f 66 20 42  obj instanceof B
25d0: 79 74 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20  yte) {.         
25e0: 20 20 20 72 65 74 75 72 6e 20 43 75 72 73 6f 72     return Cursor
25f0: 2e 46 49 45 4c 44 5f 54 59 50 45 5f 49 4e 54 45  .FIELD_TYPE_INTE
2600: 47 45 52 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  GER;.        } e
2610: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
2620: 20 20 72 65 74 75 72 6e 20 43 75 72 73 6f 72 2e    return Cursor.
2630: 46 49 45 4c 44 5f 54 59 50 45 5f 53 54 52 49 4e  FIELD_TYPE_STRIN
2640: 47 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  G;.        }.   
2650: 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20   }..    /**.    
2660: 20 2a 20 46 69 6c 6c 73 20 74 68 65 20 73 70 65   * Fills the spe
2670: 63 69 66 69 65 64 20 63 75 72 73 6f 72 20 77 69  cified cursor wi
2680: 6e 64 6f 77 20 62 79 20 69 74 65 72 61 74 69 6e  ndow by iteratin
2690: 67 20 6f 76 65 72 20 74 68 65 20 63 6f 6e 74 65  g over the conte
26a0: 6e 74 73 20 6f 66 20 74 68 65 20 63 75 72 73 6f  nts of the curso
26b0: 72 2e 0a 20 20 20 20 20 2a 20 54 68 65 20 77 69  r..     * The wi
26c0: 6e 64 6f 77 20 69 73 20 66 69 6c 6c 65 64 20 75  ndow is filled u
26d0: 6e 74 69 6c 20 74 68 65 20 63 75 72 73 6f 72 20  ntil the cursor 
26e0: 69 73 20 65 78 68 61 75 73 74 65 64 20 6f 72 20  is exhausted or 
26f0: 74 68 65 20 77 69 6e 64 6f 77 20 72 75 6e 73 20  the window runs 
2700: 6f 75 74 0a 20 20 20 20 20 2a 20 6f 66 20 73 70  out.     * of sp
2710: 61 63 65 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20  ace..     *.    
2720: 20 2a 20 54 68 65 20 6f 72 69 67 69 6e 61 6c 20   * The original 
2730: 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20  position of the 
2740: 63 75 72 73 6f 72 20 69 73 20 6c 65 66 74 20 75  cursor is left u
2750: 6e 63 68 61 6e 67 65 64 20 62 79 20 74 68 69 73  nchanged by this
2760: 20 6f 70 65 72 61 74 69 6f 6e 2e 0a 20 20 20 20   operation..    
2770: 20 2a 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d   *.     * @param
2780: 20 63 75 72 73 6f 72 20 54 68 65 20 63 75 72 73   cursor The curs
2790: 6f 72 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73  or that contains
27a0: 20 74 68 65 20 64 61 74 61 20 74 6f 20 70 75 74   the data to put
27b0: 20 69 6e 20 74 68 65 20 77 69 6e 64 6f 77 2e 0a   in the window..
27c0: 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 70 6f       * @param po
27d0: 73 69 74 69 6f 6e 20 54 68 65 20 73 74 61 72 74  sition The start
27e0: 20 70 6f 73 69 74 69 6f 6e 20 66 6f 72 20 66 69   position for fi
27f0: 6c 6c 69 6e 67 20 74 68 65 20 77 69 6e 64 6f 77  lling the window
2800: 2e 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20  ..     * @param 
2810: 77 69 6e 64 6f 77 20 54 68 65 20 77 69 6e 64 6f  window The windo
2820: 77 20 74 6f 20 66 69 6c 6c 2e 0a 20 20 20 20 20  w to fill..     
2830: 2a 20 40 68 69 64 65 0a 20 20 20 20 20 2a 2f 0a  * @hide.     */.
2840: 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69      public stati
2850: 63 20 76 6f 69 64 20 63 75 72 73 6f 72 46 69 6c  c void cursorFil
2860: 6c 57 69 6e 64 6f 77 28 66 69 6e 61 6c 20 43 75  lWindow(final Cu
2870: 72 73 6f 72 20 63 75 72 73 6f 72 2c 0a 20 20 20  rsor cursor,.   
2880: 20 20 20 20 20 20 20 20 20 69 6e 74 20 70 6f 73           int pos
2890: 69 74 69 6f 6e 2c 20 66 69 6e 61 6c 20 43 75 72  ition, final Cur
28a0: 73 6f 72 57 69 6e 64 6f 77 20 77 69 6e 64 6f 77  sorWindow window
28b0: 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28  ) {.        if (
28c0: 70 6f 73 69 74 69 6f 6e 20 3c 20 30 20 7c 7c 20  position < 0 || 
28d0: 70 6f 73 69 74 69 6f 6e 20 3e 3d 20 63 75 72 73  position >= curs
28e0: 6f 72 2e 67 65 74 43 6f 75 6e 74 28 29 29 20 7b  or.getCount()) {
28f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
2900: 75 72 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  urn;.        }. 
2910: 20 20 20 20 20 20 20 66 69 6e 61 6c 20 69 6e 74         final int
2920: 20 6f 6c 64 50 6f 73 20 3d 20 63 75 72 73 6f 72   oldPos = cursor
2930: 2e 67 65 74 50 6f 73 69 74 69 6f 6e 28 29 3b 0a  .getPosition();.
2940: 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20 69 6e          final in
2950: 74 20 6e 75 6d 43 6f 6c 75 6d 6e 73 20 3d 20 63  t numColumns = c
2960: 75 72 73 6f 72 2e 67 65 74 43 6f 6c 75 6d 6e 43  ursor.getColumnC
2970: 6f 75 6e 74 28 29 3b 0a 20 20 20 20 20 20 20 20  ount();.        
2980: 77 69 6e 64 6f 77 2e 63 6c 65 61 72 28 29 3b 0a  window.clear();.
2990: 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 2e 73          window.s
29a0: 65 74 53 74 61 72 74 50 6f 73 69 74 69 6f 6e 28  etStartPosition(
29b0: 70 6f 73 69 74 69 6f 6e 29 3b 0a 20 20 20 20 20  position);.     
29c0: 20 20 20 77 69 6e 64 6f 77 2e 73 65 74 4e 75 6d     window.setNum
29d0: 43 6f 6c 75 6d 6e 73 28 6e 75 6d 43 6f 6c 75 6d  Columns(numColum
29e0: 6e 73 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20  ns);.        if 
29f0: 28 63 75 72 73 6f 72 2e 6d 6f 76 65 54 6f 50 6f  (cursor.moveToPo
2a00: 73 69 74 69 6f 6e 28 70 6f 73 69 74 69 6f 6e 29  sition(position)
2a10: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
2a20: 72 6f 77 6c 6f 6f 70 3a 20 64 6f 20 7b 0a 20 20  rowloop: do {.  
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2a40: 20 28 21 77 69 6e 64 6f 77 2e 61 6c 6c 6f 63 52   (!window.allocR
2a50: 6f 77 28 29 29 20 7b 0a 20 20 20 20 20 20 20 20  ow()) {.        
2a60: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
2a70: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
2a80: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2a90: 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20       for (int i 
2aa0: 3d 20 30 3b 20 69 20 3c 20 6e 75 6d 43 6f 6c 75  = 0; i < numColu
2ab0: 6d 6e 73 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20  mns; i++) {.    
2ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ad0: 66 69 6e 61 6c 20 69 6e 74 20 74 79 70 65 20 3d  final int type =
2ae0: 20 63 75 72 73 6f 72 2e 67 65 74 54 79 70 65 28   cursor.getType(
2af0: 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  i);.            
2b00: 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20 62 6f          final bo
2b10: 6f 6c 65 61 6e 20 73 75 63 63 65 73 73 3b 0a 20  olean success;. 
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b30: 20 20 20 73 77 69 74 63 68 20 28 74 79 70 65 29     switch (type)
2b40: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
2b50: 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20             case 
2b60: 43 75 72 73 6f 72 2e 46 49 45 4c 44 5f 54 59 50  Cursor.FIELD_TYP
2b70: 45 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 20 20  E_NULL:.        
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 20 20 20 20 73 75 63 63 65 73 73 20 3d 20 77 69      success = wi
2ba0: 6e 64 6f 77 2e 70 75 74 4e 75 6c 6c 28 70 6f 73  ndow.putNull(pos
2bb0: 69 74 69 6f 6e 2c 20 69 29 3b 0a 20 20 20 20 20  ition, i);.     
2bc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bd0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20         break;.. 
2be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2bf0: 20 20 20 20 20 20 20 63 61 73 65 20 43 75 72 73         case Curs
2c00: 6f 72 2e 46 49 45 4c 44 5f 54 59 50 45 5f 49 4e  or.FIELD_TYPE_IN
2c10: 54 45 47 45 52 3a 0a 20 20 20 20 20 20 20 20 20  TEGER:.         
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c30: 20 20 20 73 75 63 63 65 73 73 20 3d 20 77 69 6e     success = win
2c40: 64 6f 77 2e 70 75 74 4c 6f 6e 67 28 63 75 72 73  dow.putLong(curs
2c50: 6f 72 2e 67 65 74 4c 6f 6e 67 28 69 29 2c 20 70  or.getLong(i), p
2c60: 6f 73 69 74 69 6f 6e 2c 20 69 29 3b 0a 20 20 20  osition, i);.   
2c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c80: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2c90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2ca0: 20 20 20 20 20 20 20 20 20 63 61 73 65 20 43 75           case Cu
2cb0: 72 73 6f 72 2e 46 49 45 4c 44 5f 54 59 50 45 5f  rsor.FIELD_TYPE_
2cc0: 46 4c 4f 41 54 3a 0a 20 20 20 20 20 20 20 20 20  FLOAT:.         
2cd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ce0: 20 20 20 73 75 63 63 65 73 73 20 3d 20 77 69 6e     success = win
2cf0: 64 6f 77 2e 70 75 74 44 6f 75 62 6c 65 28 63 75  dow.putDouble(cu
2d00: 72 73 6f 72 2e 67 65 74 44 6f 75 62 6c 65 28 69  rsor.getDouble(i
2d10: 29 2c 20 70 6f 73 69 74 69 6f 6e 2c 20 69 29 3b  ), position, i);
2d20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
2d40: 61 6b 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20  ak;..           
2d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73               cas
2d60: 65 20 43 75 72 73 6f 72 2e 46 49 45 4c 44 5f 54  e Cursor.FIELD_T
2d70: 59 50 45 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20  YPE_BLOB: {.    
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d90: 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20 62 79          final by
2da0: 74 65 5b 5d 20 76 61 6c 75 65 20 3d 20 63 75 72  te[] value = cur
2db0: 73 6f 72 2e 67 65 74 42 6c 6f 62 28 69 29 3b 0a  sor.getBlob(i);.
2dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd0: 20 20 20 20 20 20 20 20 20 20 20 20 73 75 63 63              succ
2de0: 65 73 73 20 3d 20 76 61 6c 75 65 20 21 3d 20 6e  ess = value != n
2df0: 75 6c 6c 20 3f 20 77 69 6e 64 6f 77 2e 70 75 74  ull ? window.put
2e00: 42 6c 6f 62 28 76 61 6c 75 65 2c 20 70 6f 73 69  Blob(value, posi
2e10: 74 69 6f 6e 2c 20 69 29 0a 20 20 20 20 20 20 20  tion, i).       
2e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 3a 20 77               : w
2e40: 69 6e 64 6f 77 2e 70 75 74 4e 75 6c 6c 28 70 6f  indow.putNull(po
2e50: 73 69 74 69 6f 6e 2c 20 69 29 3b 0a 20 20 20 20  sition, i);.    
2e60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e70: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e90: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
2ea0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2eb0: 20 20 64 65 66 61 75 6c 74 3a 20 2f 2f 20 61 73    default: // as
2ec0: 73 75 6d 65 20 76 61 6c 75 65 20 69 73 20 63 6f  sume value is co
2ed0: 6e 76 65 72 74 69 62 6c 65 20 74 6f 20 53 74 72  nvertible to Str
2ee0: 69 6e 67 0a 20 20 20 20 20 20 20 20 20 20 20 20  ing.            
2ef0: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
2f00: 20 43 75 72 73 6f 72 2e 46 49 45 4c 44 5f 54 59   Cursor.FIELD_TY
2f10: 50 45 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  PE_STRING: {.   
2f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f30: 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20 53           final S
2f40: 74 72 69 6e 67 20 76 61 6c 75 65 20 3d 20 63 75  tring value = cu
2f50: 72 73 6f 72 2e 67 65 74 53 74 72 69 6e 67 28 69  rsor.getString(i
2f60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
2f80: 75 63 63 65 73 73 20 3d 20 76 61 6c 75 65 20 21  uccess = value !
2f90: 3d 20 6e 75 6c 6c 20 3f 20 77 69 6e 64 6f 77 2e  = null ? window.
2fa0: 70 75 74 53 74 72 69 6e 67 28 76 61 6c 75 65 2c  putString(value,
2fb0: 20 70 6f 73 69 74 69 6f 6e 2c 20 69 29 0a 20 20   position, i).  
2fc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2fe0: 20 20 3a 20 77 69 6e 64 6f 77 2e 70 75 74 4e 75    : window.putNu
2ff0: 6c 6c 28 70 6f 73 69 74 69 6f 6e 2c 20 69 29 3b  ll(position, i);
3000: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3010: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
3020: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
3030: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
3040: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3050: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
3060: 20 20 20 20 20 20 20 20 69 66 20 28 21 73 75 63          if (!suc
3070: 63 65 73 73 29 20 7b 0a 20 20 20 20 20 20 20 20  cess) {.        
3080: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3090: 77 69 6e 64 6f 77 2e 66 72 65 65 4c 61 73 74 52  window.freeLastR
30a0: 6f 77 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ow();.          
30b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
30c0: 65 61 6b 20 72 6f 77 6c 6f 6f 70 3b 0a 20 20 20  eak rowloop;.   
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
30e0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
30f0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
3100: 20 20 20 20 20 70 6f 73 69 74 69 6f 6e 20 2b 3d       position +=
3110: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   1;.            
3120: 7d 20 77 68 69 6c 65 20 28 63 75 72 73 6f 72 2e  } while (cursor.
3130: 6d 6f 76 65 54 6f 4e 65 78 74 28 29 29 3b 0a 20  moveToNext());. 
3140: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
3150: 20 63 75 72 73 6f 72 2e 6d 6f 76 65 54 6f 50 6f   cursor.moveToPo
3160: 73 69 74 69 6f 6e 28 6f 6c 64 50 6f 73 29 3b 0a  sition(oldPos);.
3170: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20      }..    /**. 
3180: 20 20 20 20 2a 20 41 70 70 65 6e 64 73 20 61 6e      * Appends an
3190: 20 53 51 4c 20 73 74 72 69 6e 67 20 74 6f 20 74   SQL string to t
31a0: 68 65 20 67 69 76 65 6e 20 53 74 72 69 6e 67 42  he given StringB
31b0: 75 69 6c 64 65 72 2c 20 69 6e 63 6c 75 64 69 6e  uilder, includin
31c0: 67 20 74 68 65 20 6f 70 65 6e 69 6e 67 0a 20 20  g the opening.  
31d0: 20 20 20 2a 20 61 6e 64 20 63 6c 6f 73 69 6e 67     * and closing
31e0: 20 73 69 6e 67 6c 65 20 71 75 6f 74 65 73 2e 20   single quotes. 
31f0: 41 6e 79 20 73 69 6e 67 6c 65 20 71 75 6f 74 65  Any single quote
3200: 73 20 69 6e 74 65 72 6e 61 6c 20 74 6f 20 73 71  s internal to sq
3210: 6c 53 74 72 69 6e 67 20 77 69 6c 6c 0a 20 20 20  lString will.   
3220: 20 20 2a 20 62 65 20 65 73 63 61 70 65 64 2e 0a    * be escaped..
3230: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 54 68       *.     * Th
3240: 69 73 20 6d 65 74 68 6f 64 20 69 73 20 64 65 70  is method is dep
3250: 72 65 63 61 74 65 64 20 62 65 63 61 75 73 65 20  recated because 
3260: 77 65 20 77 61 6e 74 20 74 6f 20 65 6e 63 6f 75  we want to encou
3270: 72 61 67 65 20 65 76 65 72 79 6f 6e 65 0a 20 20  rage everyone.  
3280: 20 20 20 2a 20 74 6f 20 75 73 65 20 74 68 65 20     * to use the 
3290: 22 3f 22 20 62 69 6e 64 69 6e 67 20 66 6f 72 6d  "?" binding form
32a0: 2e 20 20 48 6f 77 65 76 65 72 2c 20 77 68 65 6e  .  However, when
32b0: 20 69 6d 70 6c 65 6d 65 6e 74 69 6e 67 20 61 0a   implementing a.
32c0: 20 20 20 20 20 2a 20 43 6f 6e 74 65 6e 74 50 72       * ContentPr
32d0: 6f 76 69 64 65 72 2c 20 6f 6e 65 20 6d 61 79 20  ovider, one may 
32e0: 77 61 6e 74 20 74 6f 20 61 64 64 20 57 48 45 52  want to add WHER
32f0: 45 20 63 6c 61 75 73 65 73 20 74 68 61 74 20 77  E clauses that w
3300: 65 72 65 0a 20 20 20 20 20 2a 20 6e 6f 74 20 70  ere.     * not p
3310: 72 6f 76 69 64 65 64 20 62 79 20 74 68 65 20 63  rovided by the c
3320: 61 6c 6c 65 72 2e 20 20 53 69 6e 63 65 20 22 3f  aller.  Since "?
3330: 22 20 69 73 20 61 20 70 6f 73 69 74 69 6f 6e 61  " is a positiona
3340: 6c 20 66 6f 72 6d 2c 0a 20 20 20 20 20 2a 20 75  l form,.     * u
3350: 73 69 6e 67 20 69 74 20 69 6e 20 74 68 69 73 20  sing it in this 
3360: 63 61 73 65 20 63 6f 75 6c 64 20 62 72 65 61 6b  case could break
3370: 20 74 68 65 20 63 61 6c 6c 65 72 20 62 65 63 61   the caller beca
3380: 75 73 65 20 74 68 65 0a 20 20 20 20 20 2a 20 69  use the.     * i
3390: 6e 64 65 78 65 73 20 77 6f 75 6c 64 20 62 65 20  ndexes would be 
33a0: 73 68 69 66 74 65 64 20 74 6f 20 61 63 63 6f 6d  shifted to accom
33b0: 6f 64 61 74 65 20 74 68 65 20 43 6f 6e 74 65 6e  odate the Conten
33c0: 74 50 72 6f 76 69 64 65 72 27 73 0a 20 20 20 20  tProvider's.    
33d0: 20 2a 20 69 6e 74 65 72 6e 61 6c 20 62 69 6e 64   * internal bind
33e0: 69 6e 67 73 2e 20 20 49 6e 20 74 68 61 74 20 63  ings.  In that c
33f0: 61 73 65 2c 20 69 74 20 6d 61 79 20 62 65 20 6e  ase, it may be n
3400: 65 63 65 73 73 61 72 79 20 74 6f 0a 20 20 20 20  ecessary to.    
3410: 20 2a 20 63 6f 6e 73 74 72 75 63 74 20 61 20 57   * construct a W
3420: 48 45 52 45 20 63 6c 61 75 73 65 20 6d 61 6e 75  HERE clause manu
3430: 61 6c 6c 79 2e 20 20 54 68 69 73 20 6d 65 74 68  ally.  This meth
3440: 6f 64 20 69 73 20 75 73 65 66 75 6c 20 66 6f 72  od is useful for
3450: 0a 20 20 20 20 20 2a 20 74 68 6f 73 65 20 63 61  .     * those ca
3460: 73 65 73 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20  ses..     *.    
3470: 20 2a 20 40 70 61 72 61 6d 20 73 62 20 74 68 65   * @param sb the
3480: 20 53 74 72 69 6e 67 42 75 69 6c 64 65 72 20 74   StringBuilder t
3490: 68 61 74 20 74 68 65 20 53 51 4c 20 73 74 72 69  hat the SQL stri
34a0: 6e 67 20 77 69 6c 6c 20 62 65 20 61 70 70 65 6e  ng will be appen
34b0: 64 65 64 20 74 6f 0a 20 20 20 20 20 2a 20 40 70  ded to.     * @p
34c0: 61 72 61 6d 20 73 71 6c 53 74 72 69 6e 67 20 74  aram sqlString t
34d0: 68 65 20 72 61 77 20 73 74 72 69 6e 67 20 74 6f  he raw string to
34e0: 20 62 65 20 61 70 70 65 6e 64 65 64 2c 20 77 68   be appended, wh
34f0: 69 63 68 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20  ich may contain 
3500: 73 69 6e 67 6c 65 0a 20 20 20 20 20 2a 20 20 20  single.     *   
3510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 71                 q
3520: 75 6f 74 65 73 0a 20 20 20 20 20 2a 2f 0a 20 20  uotes.     */.  
3530: 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20    public static 
3540: 76 6f 69 64 20 61 70 70 65 6e 64 45 73 63 61 70  void appendEscap
3550: 65 64 53 51 4c 53 74 72 69 6e 67 28 53 74 72 69  edSQLString(Stri
3560: 6e 67 42 75 69 6c 64 65 72 20 73 62 2c 20 53 74  ngBuilder sb, St
3570: 72 69 6e 67 20 73 71 6c 53 74 72 69 6e 67 29 20  ring sqlString) 
3580: 7b 0a 20 20 20 20 20 20 20 20 73 62 2e 61 70 70  {.        sb.app
3590: 65 6e 64 28 27 5c 27 27 29 3b 0a 20 20 20 20 20  end('\'');.     
35a0: 20 20 20 69 66 20 28 73 71 6c 53 74 72 69 6e 67     if (sqlString
35b0: 2e 69 6e 64 65 78 4f 66 28 27 5c 27 27 29 20 21  .indexOf('\'') !
35c0: 3d 20 2d 31 29 20 7b 0a 20 20 20 20 20 20 20 20  = -1) {.        
35d0: 20 20 20 20 69 6e 74 20 6c 65 6e 67 74 68 20 3d      int length =
35e0: 20 73 71 6c 53 74 72 69 6e 67 2e 6c 65 6e 67 74   sqlString.lengt
35f0: 68 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  h();.           
3600: 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b   for (int i = 0;
3610: 20 69 20 3c 20 6c 65 6e 67 74 68 3b 20 69 2b 2b   i < length; i++
3620: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
3630: 20 20 20 20 63 68 61 72 20 63 20 3d 20 73 71 6c      char c = sql
3640: 53 74 72 69 6e 67 2e 63 68 61 72 41 74 28 69 29  String.charAt(i)
3650: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3660: 20 20 69 66 20 28 63 20 3d 3d 20 27 5c 27 27 29    if (c == '\'')
3670: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
3680: 20 20 20 20 20 20 20 73 62 2e 61 70 70 65 6e 64         sb.append
3690: 28 27 5c 27 27 29 3b 0a 20 20 20 20 20 20 20 20  ('\'');.        
36a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
36b0: 20 20 20 20 20 20 20 20 20 20 73 62 2e 61 70 70            sb.app
36c0: 65 6e 64 28 63 29 3b 0a 20 20 20 20 20 20 20 20  end(c);.        
36d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20      }.        } 
36e0: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 20  else.           
36f0: 20 73 62 2e 61 70 70 65 6e 64 28 73 71 6c 53 74   sb.append(sqlSt
3700: 72 69 6e 67 29 3b 0a 20 20 20 20 20 20 20 20 73  ring);.        s
3710: 62 2e 61 70 70 65 6e 64 28 27 5c 27 27 29 3b 0a  b.append('\'');.
3720: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20      }..    /**. 
3730: 20 20 20 20 2a 20 53 51 4c 2d 65 73 63 61 70 65      * SQL-escape
3740: 20 61 20 73 74 72 69 6e 67 2e 0a 20 20 20 20 20   a string..     
3750: 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20 73 74  */.    public st
3760: 61 74 69 63 20 53 74 72 69 6e 67 20 73 71 6c 45  atic String sqlE
3770: 73 63 61 70 65 53 74 72 69 6e 67 28 53 74 72 69  scapeString(Stri
3780: 6e 67 20 76 61 6c 75 65 29 20 7b 0a 20 20 20 20  ng value) {.    
3790: 20 20 20 20 53 74 72 69 6e 67 42 75 69 6c 64 65      StringBuilde
37a0: 72 20 65 73 63 61 70 65 72 20 3d 20 6e 65 77 20  r escaper = new 
37b0: 53 74 72 69 6e 67 42 75 69 6c 64 65 72 28 29 3b  StringBuilder();
37c0: 0a 0a 20 20 20 20 20 20 20 20 44 61 74 61 62 61  ..        Databa
37d0: 73 65 55 74 69 6c 73 2e 61 70 70 65 6e 64 45 73  seUtils.appendEs
37e0: 63 61 70 65 64 53 51 4c 53 74 72 69 6e 67 28 65  capedSQLString(e
37f0: 73 63 61 70 65 72 2c 20 76 61 6c 75 65 29 3b 0a  scaper, value);.
3800: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3810: 65 73 63 61 70 65 72 2e 74 6f 53 74 72 69 6e 67  escaper.toString
3820: 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ();.    }..    /
3830: 2a 2a 0a 20 20 20 20 20 2a 20 41 70 70 65 6e 64  **.     * Append
3840: 73 20 61 6e 20 4f 62 6a 65 63 74 20 74 6f 20 61  s an Object to a
3850: 6e 20 53 51 4c 20 73 74 72 69 6e 67 20 77 69 74  n SQL string wit
3860: 68 20 74 68 65 20 70 72 6f 70 65 72 20 65 73 63  h the proper esc
3870: 61 70 69 6e 67 2c 20 65 74 63 2e 0a 20 20 20 20  aping, etc..    
3880: 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20 73   */.    public s
3890: 74 61 74 69 63 20 66 69 6e 61 6c 20 76 6f 69 64  tatic final void
38a0: 20 61 70 70 65 6e 64 56 61 6c 75 65 54 6f 53 71   appendValueToSq
38b0: 6c 28 53 74 72 69 6e 67 42 75 69 6c 64 65 72 20  l(StringBuilder 
38c0: 73 71 6c 2c 20 4f 62 6a 65 63 74 20 76 61 6c 75  sql, Object valu
38d0: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20  e) {.        if 
38e0: 28 76 61 6c 75 65 20 3d 3d 20 6e 75 6c 6c 29 20  (value == null) 
38f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
3900: 6c 2e 61 70 70 65 6e 64 28 22 4e 55 4c 4c 22 29  l.append("NULL")
3910: 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ;.        } else
3920: 20 69 66 20 28 76 61 6c 75 65 20 69 6e 73 74 61   if (value insta
3930: 6e 63 65 6f 66 20 42 6f 6f 6c 65 61 6e 29 20 7b  nceof Boolean) {
3940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 42 6f 6f  .            Boo
3950: 6c 65 61 6e 20 62 6f 6f 6c 20 3d 20 28 42 6f 6f  lean bool = (Boo
3960: 6c 65 61 6e 29 76 61 6c 75 65 3b 0a 20 20 20 20  lean)value;.    
3970: 20 20 20 20 20 20 20 20 69 66 20 28 62 6f 6f 6c          if (bool
3980: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
3990: 20 20 20 20 73 71 6c 2e 61 70 70 65 6e 64 28 27      sql.append('
39a0: 31 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  1');.           
39b0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
39c0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 2e 61 70            sql.ap
39d0: 70 65 6e 64 28 27 30 27 29 3b 0a 20 20 20 20 20  pend('0');.     
39e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
39f0: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
3a00: 20 20 20 20 20 20 61 70 70 65 6e 64 45 73 63 61        appendEsca
3a10: 70 65 64 53 51 4c 53 74 72 69 6e 67 28 73 71 6c  pedSQLString(sql
3a20: 2c 20 76 61 6c 75 65 2e 74 6f 53 74 72 69 6e 67  , value.toString
3a30: 28 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ());.        }. 
3a40: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20     }..    /**.  
3a50: 20 20 20 2a 20 43 6f 6e 63 61 74 65 6e 61 74 65     * Concatenate
3a60: 73 20 74 77 6f 20 53 51 4c 20 57 48 45 52 45 20  s two SQL WHERE 
3a70: 63 6c 61 75 73 65 73 2c 20 68 61 6e 64 6c 69 6e  clauses, handlin
3a80: 67 20 65 6d 70 74 79 20 6f 72 20 6e 75 6c 6c 20  g empty or null 
3a90: 76 61 6c 75 65 73 2e 0a 20 20 20 20 20 2a 2f 0a  values..     */.
3aa0: 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69      public stati
3ab0: 63 20 53 74 72 69 6e 67 20 63 6f 6e 63 61 74 65  c String concate
3ac0: 6e 61 74 65 57 68 65 72 65 28 53 74 72 69 6e 67  nateWhere(String
3ad0: 20 61 2c 20 53 74 72 69 6e 67 20 62 29 20 7b 0a   a, String b) {.
3ae0: 20 20 20 20 20 20 20 20 69 66 20 28 54 65 78 74          if (Text
3af0: 55 74 69 6c 73 2e 69 73 45 6d 70 74 79 28 61 29  Utils.isEmpty(a)
3b00: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
3b10: 72 65 74 75 72 6e 20 62 3b 0a 20 20 20 20 20 20  return b;.      
3b20: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 20 28    }.        if (
3b30: 54 65 78 74 55 74 69 6c 73 2e 69 73 45 6d 70 74  TextUtils.isEmpt
3b40: 79 28 62 29 29 20 7b 0a 20 20 20 20 20 20 20 20  y(b)) {.        
3b50: 20 20 20 20 72 65 74 75 72 6e 20 61 3b 0a 20 20      return a;.  
3b60: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
3b70: 20 72 65 74 75 72 6e 20 22 28 22 20 2b 20 61 20   return "(" + a 
3b80: 2b 20 22 29 20 41 4e 44 20 28 22 20 2b 20 62 20  + ") AND (" + b 
3b90: 2b 20 22 29 22 3b 0a 20 20 20 20 7d 0a 0a 20 20  + ")";.    }..  
3ba0: 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 72 65 74    /**.     * ret
3bb0: 75 72 6e 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f  urn the collatio
3bc0: 6e 20 6b 65 79 0a 20 20 20 20 20 2a 20 40 70 61  n key.     * @pa
3bd0: 72 61 6d 20 6e 61 6d 65 0a 20 20 20 20 20 2a 20  ram name.     * 
3be0: 40 72 65 74 75 72 6e 20 74 68 65 20 63 6f 6c 6c  @return the coll
3bf0: 61 74 69 6f 6e 20 6b 65 79 0a 20 20 20 20 20 2a  ation key.     *
3c00: 2f 0a 20 20 20 20 70 75 62 6c 69 63 20 73 74 61  /.    public sta
3c10: 74 69 63 20 53 74 72 69 6e 67 20 67 65 74 43 6f  tic String getCo
3c20: 6c 6c 61 74 69 6f 6e 4b 65 79 28 53 74 72 69 6e  llationKey(Strin
3c30: 67 20 6e 61 6d 65 29 20 7b 0a 20 20 20 20 20 20  g name) {.      
3c40: 20 20 62 79 74 65 20 5b 5d 20 61 72 72 20 3d 20    byte [] arr = 
3c50: 67 65 74 43 6f 6c 6c 61 74 69 6f 6e 4b 65 79 49  getCollationKeyI
3c60: 6e 42 79 74 65 73 28 6e 61 6d 65 29 3b 0a 20 20  nBytes(name);.  
3c70: 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20        try {.    
3c80: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6e          return n
3c90: 65 77 20 53 74 72 69 6e 67 28 61 72 72 2c 20 30  ew String(arr, 0
3ca0: 2c 20 67 65 74 4b 65 79 4c 65 6e 28 61 72 72 29  , getKeyLen(arr)
3cb0: 2c 20 22 49 53 4f 38 38 35 39 5f 31 22 29 3b 0a  , "ISO8859_1");.
3cc0: 20 20 20 20 20 20 20 20 7d 20 63 61 74 63 68 20          } catch 
3cd0: 28 45 78 63 65 70 74 69 6f 6e 20 65 78 29 20 7b  (Exception ex) {
3ce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
3cf0: 75 72 6e 20 22 22 3b 0a 20 20 20 20 20 20 20 20  urn "";.        
3d00: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a  }.    }..    /**
3d10: 0a 20 20 20 20 20 2a 20 72 65 74 75 72 6e 20 74  .     * return t
3d20: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 6b 65 79  he collation key
3d30: 20 69 6e 20 68 65 78 20 66 6f 72 6d 61 74 0a 20   in hex format. 
3d40: 20 20 20 20 2a 20 40 70 61 72 61 6d 20 6e 61 6d      * @param nam
3d50: 65 0a 20 20 20 20 20 2a 20 40 72 65 74 75 72 6e  e.     * @return
3d60: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 6b   the collation k
3d70: 65 79 20 69 6e 20 68 65 78 20 66 6f 72 6d 61 74  ey in hex format
3d80: 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 75 62  .     */.    pub
3d90: 6c 69 63 20 73 74 61 74 69 63 20 53 74 72 69 6e  lic static Strin
3da0: 67 20 67 65 74 48 65 78 43 6f 6c 6c 61 74 69 6f  g getHexCollatio
3db0: 6e 4b 65 79 28 53 74 72 69 6e 67 20 6e 61 6d 65  nKey(String name
3dc0: 29 20 7b 0a 20 20 20 20 20 20 20 20 62 79 74 65  ) {.        byte
3dd0: 5b 5d 20 61 72 72 20 3d 20 67 65 74 43 6f 6c 6c  [] arr = getColl
3de0: 61 74 69 6f 6e 4b 65 79 49 6e 42 79 74 65 73 28  ationKeyInBytes(
3df0: 6e 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 63  name);.        c
3e00: 68 61 72 5b 5d 20 6b 65 79 73 20 3d 20 65 6e 63  har[] keys = enc
3e10: 6f 64 65 48 65 78 28 61 72 72 29 3b 0a 20 20 20  odeHex(arr);.   
3e20: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 65 77 20       return new 
3e30: 53 74 72 69 6e 67 28 6b 65 79 73 2c 20 30 2c 20  String(keys, 0, 
3e40: 67 65 74 4b 65 79 4c 65 6e 28 61 72 72 29 20 2a  getKeyLen(arr) *
3e50: 20 32 29 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20   2);.    }...   
3e60: 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 55 73 65 64   /**.     * Used
3e70: 20 62 75 69 6c 64 69 6e 67 20 6f 75 74 70 75 74   building output
3e80: 20 61 73 20 48 65 78 0a 20 20 20 20 20 2a 2f 0a   as Hex.     */.
3e90: 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74      private stat
3ea0: 69 63 20 66 69 6e 61 6c 20 63 68 61 72 5b 5d 20  ic final char[] 
3eb0: 44 49 47 49 54 53 20 3d 20 7b 0a 20 20 20 20 20  DIGITS = {.     
3ec0: 20 20 20 20 20 20 20 27 30 27 2c 20 27 31 27 2c         '0', '1',
3ed0: 20 27 32 27 2c 20 27 33 27 2c 20 27 34 27 2c 20   '2', '3', '4', 
3ee0: 27 35 27 2c 20 27 36 27 2c 20 27 37 27 2c 0a 20  '5', '6', '7',. 
3ef0: 20 20 20 20 20 20 20 20 20 20 20 27 38 27 2c 20             '8', 
3f00: 27 39 27 2c 20 27 61 27 2c 20 27 62 27 2c 20 27  '9', 'a', 'b', '
3f10: 63 27 2c 20 27 64 27 2c 20 27 65 27 2c 20 27 66  c', 'd', 'e', 'f
3f20: 27 0a 20 20 20 20 7d 3b 0a 0a 20 20 20 20 70 72  '.    };..    pr
3f30: 69 76 61 74 65 20 73 74 61 74 69 63 20 63 68 61  ivate static cha
3f40: 72 5b 5d 20 65 6e 63 6f 64 65 48 65 78 28 62 79  r[] encodeHex(by
3f50: 74 65 5b 5d 20 69 6e 70 75 74 29 20 7b 0a 20 20  te[] input) {.  
3f60: 20 20 20 20 20 20 69 6e 74 20 6c 20 3d 20 69 6e        int l = in
3f70: 70 75 74 2e 6c 65 6e 67 74 68 3b 0a 20 20 20 20  put.length;.    
3f80: 20 20 20 20 63 68 61 72 5b 5d 20 6f 75 74 20 3d      char[] out =
3f90: 20 6e 65 77 20 63 68 61 72 5b 6c 20 3c 3c 20 31   new char[l << 1
3fa0: 5d 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 74  ];..        // t
3fb0: 77 6f 20 63 68 61 72 61 63 74 65 72 73 20 66 6f  wo characters fo
3fc0: 72 6d 20 74 68 65 20 68 65 78 20 76 61 6c 75 65  rm the hex value
3fd0: 2e 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28 69  ..        for (i
3fe0: 6e 74 20 69 20 3d 20 30 2c 20 6a 20 3d 20 30 3b  nt i = 0, j = 0;
3ff0: 20 69 20 3c 20 6c 3b 20 69 2b 2b 29 20 7b 0a 20   i < l; i++) {. 
4000: 20 20 20 20 20 20 20 20 20 20 20 6f 75 74 5b 6a             out[j
4010: 2b 2b 5d 20 3d 20 44 49 47 49 54 53 5b 28 30 78  ++] = DIGITS[(0x
4020: 46 30 20 26 20 69 6e 70 75 74 5b 69 5d 29 20 3e  F0 & input[i]) >
4030: 3e 3e 20 34 20 5d 3b 0a 20 20 20 20 20 20 20 20  >> 4 ];.        
4040: 20 20 20 20 6f 75 74 5b 6a 2b 2b 5d 20 3d 20 44      out[j++] = D
4050: 49 47 49 54 53 5b 20 30 78 30 46 20 26 20 69 6e  IGITS[ 0x0F & in
4060: 70 75 74 5b 69 5d 20 5d 3b 0a 20 20 20 20 20 20  put[i] ];.      
4070: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 72 65 74    }..        ret
4080: 75 72 6e 20 6f 75 74 3b 0a 20 20 20 20 7d 0a 0a  urn out;.    }..
4090: 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74      private stat
40a0: 69 63 20 69 6e 74 20 67 65 74 4b 65 79 4c 65 6e  ic int getKeyLen
40b0: 28 62 79 74 65 5b 5d 20 61 72 72 29 20 7b 0a 20  (byte[] arr) {. 
40c0: 20 20 20 20 20 20 20 69 66 20 28 61 72 72 5b 61         if (arr[a
40d0: 72 72 2e 6c 65 6e 67 74 68 20 2d 20 31 5d 20 21  rr.length - 1] !
40e0: 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20  = 0) {.         
40f0: 20 20 20 72 65 74 75 72 6e 20 61 72 72 2e 6c 65     return arr.le
4100: 6e 67 74 68 3b 0a 20 20 20 20 20 20 20 20 7d 20  ngth;.        } 
4110: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
4120: 20 20 20 2f 2f 20 72 65 6d 6f 76 65 20 7a 65 72     // remove zer
4130: 6f 20 22 74 65 72 6d 69 6e 61 74 69 6f 6e 22 0a  o "termination".
4140: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
4150: 72 6e 20 61 72 72 2e 6c 65 6e 67 74 68 2d 31 3b  rn arr.length-1;
4160: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
4170: 0a 0a 20 20 20 20 70 72 69 76 61 74 65 20 73 74  ..    private st
4180: 61 74 69 63 20 62 79 74 65 5b 5d 20 67 65 74 43  atic byte[] getC
4190: 6f 6c 6c 61 74 69 6f 6e 4b 65 79 49 6e 42 79 74  ollationKeyInByt
41a0: 65 73 28 53 74 72 69 6e 67 20 6e 61 6d 65 29 20  es(String name) 
41b0: 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 6d 43  {.        if (mC
41c0: 6f 6c 6c 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20  oll == null) {. 
41d0: 20 20 20 20 20 20 20 20 20 20 20 6d 43 6f 6c 6c             mColl
41e0: 20 3d 20 43 6f 6c 6c 61 74 6f 72 2e 67 65 74 49   = Collator.getI
41f0: 6e 73 74 61 6e 63 65 28 29 3b 0a 20 20 20 20 20  nstance();.     
4200: 20 20 20 20 20 20 20 6d 43 6f 6c 6c 2e 73 65 74         mColl.set
4210: 53 74 72 65 6e 67 74 68 28 43 6f 6c 6c 61 74 6f  Strength(Collato
4220: 72 2e 50 52 49 4d 41 52 59 29 3b 0a 20 20 20 20  r.PRIMARY);.    
4230: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72 65      }.        re
4240: 74 75 72 6e 20 6d 43 6f 6c 6c 2e 67 65 74 43 6f  turn mColl.getCo
4250: 6c 6c 61 74 69 6f 6e 4b 65 79 28 6e 61 6d 65 29  llationKey(name)
4260: 2e 74 6f 42 79 74 65 41 72 72 61 79 28 29 3b 0a  .toByteArray();.
4270: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 69 76 61      }..    priva
4280: 74 65 20 73 74 61 74 69 63 20 43 6f 6c 6c 61 74  te static Collat
4290: 6f 72 20 6d 43 6f 6c 6c 20 3d 20 6e 75 6c 6c 3b  or mColl = null;
42a0: 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20  .    /**.     * 
42b0: 50 72 69 6e 74 73 20 74 68 65 20 63 6f 6e 74 65  Prints the conte
42c0: 6e 74 73 20 6f 66 20 61 20 43 75 72 73 6f 72 20  nts of a Cursor 
42d0: 74 6f 20 53 79 73 74 65 6d 2e 6f 75 74 2e 20 54  to System.out. T
42e0: 68 65 20 70 6f 73 69 74 69 6f 6e 20 69 73 20 72  he position is r
42f0: 65 73 74 6f 72 65 64 0a 20 20 20 20 20 2a 20 61  estored.     * a
4300: 66 74 65 72 20 70 72 69 6e 74 69 6e 67 2e 0a 20  fter printing.. 
4310: 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 70 61      *.     * @pa
4320: 72 61 6d 20 63 75 72 73 6f 72 20 74 68 65 20 63  ram cursor the c
4330: 75 72 73 6f 72 20 74 6f 20 70 72 69 6e 74 0a 20  ursor to print. 
4340: 20 20 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69      */.    publi
4350: 63 20 73 74 61 74 69 63 20 76 6f 69 64 20 64 75  c static void du
4360: 6d 70 43 75 72 73 6f 72 28 43 75 72 73 6f 72 20  mpCursor(Cursor 
4370: 63 75 72 73 6f 72 29 20 7b 0a 20 20 20 20 20 20  cursor) {.      
4380: 20 20 64 75 6d 70 43 75 72 73 6f 72 28 63 75 72    dumpCursor(cur
4390: 73 6f 72 2c 20 53 79 73 74 65 6d 2e 6f 75 74 29  sor, System.out)
43a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a  ;.    }..    /**
43b0: 0a 20 20 20 20 20 2a 20 50 72 69 6e 74 73 20 74  .     * Prints t
43c0: 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61  he contents of a
43d0: 20 43 75 72 73 6f 72 20 74 6f 20 61 20 50 72 69   Cursor to a Pri
43e0: 6e 74 53 74 65 61 6d 2e 20 54 68 65 20 70 6f 73  ntSteam. The pos
43f0: 69 74 69 6f 6e 20 69 73 20 72 65 73 74 6f 72 65  ition is restore
4400: 64 0a 20 20 20 20 20 2a 20 61 66 74 65 72 20 70  d.     * after p
4410: 72 69 6e 74 69 6e 67 2e 0a 20 20 20 20 20 2a 0a  rinting..     *.
4420: 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 63 75       * @param cu
4430: 72 73 6f 72 20 74 68 65 20 63 75 72 73 6f 72 20  rsor the cursor 
4440: 74 6f 20 70 72 69 6e 74 0a 20 20 20 20 20 2a 20  to print.     * 
4450: 40 70 61 72 61 6d 20 73 74 72 65 61 6d 20 74 68  @param stream th
4460: 65 20 73 74 72 65 61 6d 20 74 6f 20 70 72 69 6e  e stream to prin
4470: 74 20 74 6f 0a 20 20 20 20 20 2a 2f 0a 20 20 20  t to.     */.   
4480: 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20 76   public static v
4490: 6f 69 64 20 64 75 6d 70 43 75 72 73 6f 72 28 43  oid dumpCursor(C
44a0: 75 72 73 6f 72 20 63 75 72 73 6f 72 2c 20 50 72  ursor cursor, Pr
44b0: 69 6e 74 53 74 72 65 61 6d 20 73 74 72 65 61 6d  intStream stream
44c0: 29 20 7b 0a 20 20 20 20 20 20 20 20 73 74 72 65  ) {.        stre
44d0: 61 6d 2e 70 72 69 6e 74 6c 6e 28 22 3e 3e 3e 3e  am.println(">>>>
44e0: 3e 20 44 75 6d 70 69 6e 67 20 63 75 72 73 6f 72  > Dumping cursor
44f0: 20 22 20 2b 20 63 75 72 73 6f 72 29 3b 0a 20 20   " + cursor);.  
4500: 20 20 20 20 20 20 69 66 20 28 63 75 72 73 6f 72        if (cursor
4510: 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20   != null) {.    
4520: 20 20 20 20 20 20 20 20 69 6e 74 20 73 74 61 72          int star
4530: 74 50 6f 73 20 3d 20 63 75 72 73 6f 72 2e 67 65  tPos = cursor.ge
4540: 74 50 6f 73 69 74 69 6f 6e 28 29 3b 0a 0a 20 20  tPosition();..  
4550: 20 20 20 20 20 20 20 20 20 20 63 75 72 73 6f 72            cursor
4560: 2e 6d 6f 76 65 54 6f 50 6f 73 69 74 69 6f 6e 28  .moveToPosition(
4570: 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  -1);.           
4580: 20 77 68 69 6c 65 20 28 63 75 72 73 6f 72 2e 6d   while (cursor.m
4590: 6f 76 65 54 6f 4e 65 78 74 28 29 29 20 7b 0a 20  oveToNext()) {. 
45a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
45b0: 75 6d 70 43 75 72 72 65 6e 74 52 6f 77 28 63 75  umpCurrentRow(cu
45c0: 72 73 6f 72 2c 20 73 74 72 65 61 6d 29 3b 0a 20  rsor, stream);. 
45d0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
45e0: 20 20 20 20 20 20 20 20 20 63 75 72 73 6f 72 2e           cursor.
45f0: 6d 6f 76 65 54 6f 50 6f 73 69 74 69 6f 6e 28 73  moveToPosition(s
4600: 74 61 72 74 50 6f 73 29 3b 0a 20 20 20 20 20 20  tartPos);.      
4610: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 74 72 65    }.        stre
4620: 61 6d 2e 70 72 69 6e 74 6c 6e 28 22 3c 3c 3c 3c  am.println("<<<<
4630: 3c 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  <");.    }..    
4640: 2f 2a 2a 0a 20 20 20 20 20 2a 20 50 72 69 6e 74  /**.     * Print
4650: 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  s the contents o
4660: 66 20 61 20 43 75 72 73 6f 72 20 74 6f 20 61 20  f a Cursor to a 
4670: 53 74 72 69 6e 67 42 75 69 6c 64 65 72 2e 20 54  StringBuilder. T
4680: 68 65 20 70 6f 73 69 74 69 6f 6e 0a 20 20 20 20  he position.    
4690: 20 2a 20 69 73 20 72 65 73 74 6f 72 65 64 20 61   * is restored a
46a0: 66 74 65 72 20 70 72 69 6e 74 69 6e 67 2e 0a 20  fter printing.. 
46b0: 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 70 61      *.     * @pa
46c0: 72 61 6d 20 63 75 72 73 6f 72 20 74 68 65 20 63  ram cursor the c
46d0: 75 72 73 6f 72 20 74 6f 20 70 72 69 6e 74 0a 20  ursor to print. 
46e0: 20 20 20 20 2a 20 40 70 61 72 61 6d 20 73 62 20      * @param sb 
46f0: 74 68 65 20 53 74 72 69 6e 67 42 75 69 6c 64 65  the StringBuilde
4700: 72 20 74 6f 20 70 72 69 6e 74 20 74 6f 0a 20 20  r to print to.  
4710: 20 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63     */.    public
4720: 20 73 74 61 74 69 63 20 76 6f 69 64 20 64 75 6d   static void dum
4730: 70 43 75 72 73 6f 72 28 43 75 72 73 6f 72 20 63  pCursor(Cursor c
4740: 75 72 73 6f 72 2c 20 53 74 72 69 6e 67 42 75 69  ursor, StringBui
4750: 6c 64 65 72 20 73 62 29 20 7b 0a 20 20 20 20 20  lder sb) {.     
4760: 20 20 20 73 62 2e 61 70 70 65 6e 64 28 22 3e 3e     sb.append(">>
4770: 3e 3e 3e 20 44 75 6d 70 69 6e 67 20 63 75 72 73  >>> Dumping curs
4780: 6f 72 20 22 20 2b 20 63 75 72 73 6f 72 20 2b 20  or " + cursor + 
4790: 22 5c 6e 22 29 3b 0a 20 20 20 20 20 20 20 20 69  "\n");.        i
47a0: 66 20 28 63 75 72 73 6f 72 20 21 3d 20 6e 75 6c  f (cursor != nul
47b0: 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l) {.           
47c0: 20 69 6e 74 20 73 74 61 72 74 50 6f 73 20 3d 20   int startPos = 
47d0: 63 75 72 73 6f 72 2e 67 65 74 50 6f 73 69 74 69  cursor.getPositi
47e0: 6f 6e 28 29 3b 0a 0a 20 20 20 20 20 20 20 20 20  on();..         
47f0: 20 20 20 63 75 72 73 6f 72 2e 6d 6f 76 65 54 6f     cursor.moveTo
4800: 50 6f 73 69 74 69 6f 6e 28 2d 31 29 3b 0a 20 20  Position(-1);.  
4810: 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 20            while 
4820: 28 63 75 72 73 6f 72 2e 6d 6f 76 65 54 6f 4e 65  (cursor.moveToNe
4830: 78 74 28 29 29 20 7b 0a 20 20 20 20 20 20 20 20  xt()) {.        
4840: 20 20 20 20 20 20 20 20 64 75 6d 70 43 75 72 72          dumpCurr
4850: 65 6e 74 52 6f 77 28 63 75 72 73 6f 72 2c 20 73  entRow(cursor, s
4860: 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  b);.            
4870: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 75  }.            cu
4880: 72 73 6f 72 2e 6d 6f 76 65 54 6f 50 6f 73 69 74  rsor.moveToPosit
4890: 69 6f 6e 28 73 74 61 72 74 50 6f 73 29 3b 0a 20  ion(startPos);. 
48a0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
48b0: 20 73 62 2e 61 70 70 65 6e 64 28 22 3c 3c 3c 3c   sb.append("<<<<
48c0: 3c 5c 6e 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  <\n");.    }..  
48d0: 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 50 72 69    /**.     * Pri
48e0: 6e 74 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  nts the contents
48f0: 20 6f 66 20 61 20 43 75 72 73 6f 72 20 74 6f 20   of a Cursor to 
4900: 61 20 53 74 72 69 6e 67 2e 20 54 68 65 20 70 6f  a String. The po
4910: 73 69 74 69 6f 6e 20 69 73 20 72 65 73 74 6f 72  sition is restor
4920: 65 64 0a 20 20 20 20 20 2a 20 61 66 74 65 72 20  ed.     * after 
4930: 70 72 69 6e 74 69 6e 67 2e 0a 20 20 20 20 20 2a  printing..     *
4940: 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 63  .     * @param c
4950: 75 72 73 6f 72 20 74 68 65 20 63 75 72 73 6f 72  ursor the cursor
4960: 20 74 6f 20 70 72 69 6e 74 0a 20 20 20 20 20 2a   to print.     *
4970: 20 40 72 65 74 75 72 6e 20 61 20 53 74 72 69 6e   @return a Strin
4980: 67 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20  g that contains 
4990: 74 68 65 20 64 75 6d 70 65 64 20 63 75 72 73 6f  the dumped curso
49a0: 72 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 75  r.     */.    pu
49b0: 62 6c 69 63 20 73 74 61 74 69 63 20 53 74 72 69  blic static Stri
49c0: 6e 67 20 64 75 6d 70 43 75 72 73 6f 72 54 6f 53  ng dumpCursorToS
49d0: 74 72 69 6e 67 28 43 75 72 73 6f 72 20 63 75 72  tring(Cursor cur
49e0: 73 6f 72 29 20 7b 0a 20 20 20 20 20 20 20 20 53  sor) {.        S
49f0: 74 72 69 6e 67 42 75 69 6c 64 65 72 20 73 62 20  tringBuilder sb 
4a00: 3d 20 6e 65 77 20 53 74 72 69 6e 67 42 75 69 6c  = new StringBuil
4a10: 64 65 72 28 29 3b 0a 20 20 20 20 20 20 20 20 64  der();.        d
4a20: 75 6d 70 43 75 72 73 6f 72 28 63 75 72 73 6f 72  umpCursor(cursor
4a30: 2c 20 73 62 29 3b 0a 20 20 20 20 20 20 20 20 72  , sb);.        r
4a40: 65 74 75 72 6e 20 73 62 2e 74 6f 53 74 72 69 6e  eturn sb.toStrin
4a50: 67 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  g();.    }..    
4a60: 2f 2a 2a 0a 20 20 20 20 20 2a 20 50 72 69 6e 74  /**.     * Print
4a70: 73 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 20 6f  s the contents o
4a80: 66 20 61 20 43 75 72 73 6f 72 27 73 20 63 75 72  f a Cursor's cur
4a90: 72 65 6e 74 20 72 6f 77 20 74 6f 20 53 79 73 74  rent row to Syst
4aa0: 65 6d 2e 6f 75 74 2e 0a 20 20 20 20 20 2a 0a 20  em.out..     *. 
4ab0: 20 20 20 20 2a 20 40 70 61 72 61 6d 20 63 75 72      * @param cur
4ac0: 73 6f 72 20 74 68 65 20 63 75 72 73 6f 72 20 74  sor the cursor t
4ad0: 6f 20 70 72 69 6e 74 20 66 72 6f 6d 0a 20 20 20  o print from.   
4ae0: 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20    */.    public 
4af0: 73 74 61 74 69 63 20 76 6f 69 64 20 64 75 6d 70  static void dump
4b00: 43 75 72 72 65 6e 74 52 6f 77 28 43 75 72 73 6f  CurrentRow(Curso
4b10: 72 20 63 75 72 73 6f 72 29 20 7b 0a 20 20 20 20  r cursor) {.    
4b20: 20 20 20 20 64 75 6d 70 43 75 72 72 65 6e 74 52      dumpCurrentR
4b30: 6f 77 28 63 75 72 73 6f 72 2c 20 53 79 73 74 65  ow(cursor, Syste
4b40: 6d 2e 6f 75 74 29 3b 0a 20 20 20 20 7d 0a 0a 20  m.out);.    }.. 
4b50: 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 50 72     /**.     * Pr
4b60: 69 6e 74 73 20 74 68 65 20 63 6f 6e 74 65 6e 74  ints the content
4b70: 73 20 6f 66 20 61 20 43 75 72 73 6f 72 27 73 20  s of a Cursor's 
4b80: 63 75 72 72 65 6e 74 20 72 6f 77 20 74 6f 20 61  current row to a
4b90: 20 50 72 69 6e 74 53 74 65 61 6d 2e 0a 20 20 20   PrintSteam..   
4ba0: 20 20 2a 0a 20 20 20 20 20 2a 20 40 70 61 72 61    *.     * @para
4bb0: 6d 20 63 75 72 73 6f 72 20 74 68 65 20 63 75 72  m cursor the cur
4bc0: 73 6f 72 20 74 6f 20 70 72 69 6e 74 0a 20 20 20  sor to print.   
4bd0: 20 20 2a 20 40 70 61 72 61 6d 20 73 74 72 65 61    * @param strea
4be0: 6d 20 74 68 65 20 73 74 72 65 61 6d 20 74 6f 20  m the stream to 
4bf0: 70 72 69 6e 74 20 74 6f 0a 20 20 20 20 20 2a 2f  print to.     */
4c00: 0a 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74  .    public stat
4c10: 69 63 20 76 6f 69 64 20 64 75 6d 70 43 75 72 72  ic void dumpCurr
4c20: 65 6e 74 52 6f 77 28 43 75 72 73 6f 72 20 63 75  entRow(Cursor cu
4c30: 72 73 6f 72 2c 20 50 72 69 6e 74 53 74 72 65 61  rsor, PrintStrea
4c40: 6d 20 73 74 72 65 61 6d 29 20 7b 0a 20 20 20 20  m stream) {.    
4c50: 20 20 20 20 53 74 72 69 6e 67 5b 5d 20 63 6f 6c      String[] col
4c60: 73 20 3d 20 63 75 72 73 6f 72 2e 67 65 74 43 6f  s = cursor.getCo
4c70: 6c 75 6d 6e 4e 61 6d 65 73 28 29 3b 0a 20 20 20  lumnNames();.   
4c80: 20 20 20 20 20 73 74 72 65 61 6d 2e 70 72 69 6e       stream.prin
4c90: 74 6c 6e 28 22 22 20 2b 20 63 75 72 73 6f 72 2e  tln("" + cursor.
4ca0: 67 65 74 50 6f 73 69 74 69 6f 6e 28 29 20 2b 20  getPosition() + 
4cb0: 22 20 7b 22 29 3b 0a 20 20 20 20 20 20 20 20 69  " {");.        i
4cc0: 6e 74 20 6c 65 6e 67 74 68 20 3d 20 63 6f 6c 73  nt length = cols
4cd0: 2e 6c 65 6e 67 74 68 3b 0a 20 20 20 20 20 20 20  .length;.       
4ce0: 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b   for (int i = 0;
4cf0: 20 69 3c 20 6c 65 6e 67 74 68 3b 20 69 2b 2b 29   i< length; i++)
4d00: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 53   {.            S
4d10: 74 72 69 6e 67 20 76 61 6c 75 65 3b 0a 20 20 20  tring value;.   
4d20: 20 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20           try {. 
4d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76                 v
4d40: 61 6c 75 65 20 3d 20 63 75 72 73 6f 72 2e 67 65  alue = cursor.ge
4d50: 74 53 74 72 69 6e 67 28 69 29 3b 0a 20 20 20 20  tString(i);.    
4d60: 20 20 20 20 20 20 20 20 7d 20 63 61 74 63 68 20          } catch 
4d70: 28 53 51 4c 69 74 65 45 78 63 65 70 74 69 6f 6e  (SQLiteException
4d80: 20 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20   e) {.          
4d90: 20 20 20 20 20 20 2f 2f 20 61 73 73 75 6d 65 20        // assume 
4da0: 74 68 61 74 20 69 66 20 74 68 65 20 67 65 74 53  that if the getS
4db0: 74 72 69 6e 67 20 74 68 72 65 77 20 74 68 69 73  tring threw this
4dc0: 20 65 78 63 65 70 74 69 6f 6e 20 74 68 65 6e 20   exception then 
4dd0: 74 68 65 20 63 6f 6c 75 6d 6e 20 69 73 20 6e 6f  the column is no
4de0: 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t.              
4df0: 20 20 2f 2f 20 72 65 70 72 65 73 65 6e 74 61 62    // representab
4e00: 6c 65 20 62 79 20 61 20 73 74 72 69 6e 67 2c 20  le by a string, 
4e10: 65 2e 67 2e 20 69 74 20 69 73 20 61 20 42 4c 4f  e.g. it is a BLO
4e20: 42 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  B..             
4e30: 20 20 20 76 61 6c 75 65 20 3d 20 22 3c 75 6e 70     value = "<unp
4e40: 72 69 6e 74 61 62 6c 65 3e 22 3b 0a 20 20 20 20  rintable>";.    
4e50: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4e60: 20 20 20 20 20 20 73 74 72 65 61 6d 2e 70 72 69        stream.pri
4e70: 6e 74 6c 6e 28 22 20 20 20 22 20 2b 20 63 6f 6c  ntln("   " + col
4e80: 73 5b 69 5d 20 2b 20 27 3d 27 20 2b 20 76 61 6c  s[i] + '=' + val
4e90: 75 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ue);.        }. 
4ea0: 20 20 20 20 20 20 20 73 74 72 65 61 6d 2e 70 72         stream.pr
4eb0: 69 6e 74 6c 6e 28 22 7d 22 29 3b 0a 20 20 20 20  intln("}");.    
4ec0: 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20  }..    /**.     
4ed0: 2a 20 50 72 69 6e 74 73 20 74 68 65 20 63 6f 6e  * Prints the con
4ee0: 74 65 6e 74 73 20 6f 66 20 61 20 43 75 72 73 6f  tents of a Curso
4ef0: 72 27 73 20 63 75 72 72 65 6e 74 20 72 6f 77 20  r's current row 
4f00: 74 6f 20 61 20 53 74 72 69 6e 67 42 75 69 6c 64  to a StringBuild
4f10: 65 72 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20  er..     *.     
4f20: 2a 20 40 70 61 72 61 6d 20 63 75 72 73 6f 72 20  * @param cursor 
4f30: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 70 72  the cursor to pr
4f40: 69 6e 74 0a 20 20 20 20 20 2a 20 40 70 61 72 61  int.     * @para
4f50: 6d 20 73 62 20 74 68 65 20 53 74 72 69 6e 67 42  m sb the StringB
4f60: 75 69 6c 64 65 72 20 74 6f 20 70 72 69 6e 74 20  uilder to print 
4f70: 74 6f 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70  to.     */.    p
4f80: 75 62 6c 69 63 20 73 74 61 74 69 63 20 76 6f 69  ublic static voi
4f90: 64 20 64 75 6d 70 43 75 72 72 65 6e 74 52 6f 77  d dumpCurrentRow
4fa0: 28 43 75 72 73 6f 72 20 63 75 72 73 6f 72 2c 20  (Cursor cursor, 
4fb0: 53 74 72 69 6e 67 42 75 69 6c 64 65 72 20 73 62  StringBuilder sb
4fc0: 29 20 7b 0a 20 20 20 20 20 20 20 20 53 74 72 69  ) {.        Stri
4fd0: 6e 67 5b 5d 20 63 6f 6c 73 20 3d 20 63 75 72 73  ng[] cols = curs
4fe0: 6f 72 2e 67 65 74 43 6f 6c 75 6d 6e 4e 61 6d 65  or.getColumnName
4ff0: 73 28 29 3b 0a 20 20 20 20 20 20 20 20 73 62 2e  s();.        sb.
5000: 61 70 70 65 6e 64 28 22 22 20 2b 20 63 75 72 73  append("" + curs
5010: 6f 72 2e 67 65 74 50 6f 73 69 74 69 6f 6e 28 29  or.getPosition()
5020: 20 2b 20 22 20 7b 5c 6e 22 29 3b 0a 20 20 20 20   + " {\n");.    
5030: 20 20 20 20 69 6e 74 20 6c 65 6e 67 74 68 20 3d      int length =
5040: 20 63 6f 6c 73 2e 6c 65 6e 67 74 68 3b 0a 20 20   cols.length;.  
5050: 20 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69        for (int i
5060: 20 3d 20 30 3b 20 69 20 3c 20 6c 65 6e 67 74 68   = 0; i < length
5070: 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20  ; i++) {.       
5080: 20 20 20 20 20 53 74 72 69 6e 67 20 76 61 6c 75       String valu
5090: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  e;.            t
50a0: 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ry {.           
50b0: 20 20 20 20 20 76 61 6c 75 65 20 3d 20 63 75 72       value = cur
50c0: 73 6f 72 2e 67 65 74 53 74 72 69 6e 67 28 69 29  sor.getString(i)
50d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ;.            } 
50e0: 63 61 74 63 68 20 28 53 51 4c 69 74 65 45 78 63  catch (SQLiteExc
50f0: 65 70 74 69 6f 6e 20 65 29 20 7b 0a 20 20 20 20  eption e) {.    
5100: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 61              // a
5110: 73 73 75 6d 65 20 74 68 61 74 20 69 66 20 74 68  ssume that if th
5120: 65 20 67 65 74 53 74 72 69 6e 67 20 74 68 72 65  e getString thre
5130: 77 20 74 68 69 73 20 65 78 63 65 70 74 69 6f 6e  w this exception
5140: 20 74 68 65 6e 20 74 68 65 20 63 6f 6c 75 6d 6e   then the column
5150: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
5160: 20 20 20 20 20 20 20 20 2f 2f 20 72 65 70 72 65          // repre
5170: 73 65 6e 74 61 62 6c 65 20 62 79 20 61 20 73 74  sentable by a st
5180: 72 69 6e 67 2c 20 65 2e 67 2e 20 69 74 20 69 73  ring, e.g. it is
5190: 20 61 20 42 4c 4f 42 2e 0a 20 20 20 20 20 20 20   a BLOB..       
51a0: 20 20 20 20 20 20 20 20 20 76 61 6c 75 65 20 3d           value =
51b0: 20 22 3c 75 6e 70 72 69 6e 74 61 62 6c 65 3e 22   "<unprintable>"
51c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
51d0: 20 20 20 20 20 20 20 20 20 20 20 20 73 62 2e 61              sb.a
51e0: 70 70 65 6e 64 28 22 20 20 20 22 20 2b 20 63 6f  ppend("   " + co
51f0: 6c 73 5b 69 5d 20 2b 20 27 3d 27 20 2b 20 76 61  ls[i] + '=' + va
5200: 6c 75 65 20 2b 20 22 5c 6e 22 29 3b 0a 20 20 20  lue + "\n");.   
5210: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
5220: 62 2e 61 70 70 65 6e 64 28 22 7d 5c 6e 22 29 3b  b.append("}\n");
5230: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a  .    }..    /**.
5240: 20 20 20 20 20 2a 20 44 75 6d 70 20 74 68 65 20       * Dump the 
5250: 63 6f 6e 74 65 6e 74 73 20 6f 66 20 61 20 43 75  contents of a Cu
5260: 72 73 6f 72 27 73 20 63 75 72 72 65 6e 74 20 72  rsor's current r
5270: 6f 77 20 74 6f 20 61 20 53 74 72 69 6e 67 2e 0a  ow to a String..
5280: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 70       *.     * @p
5290: 61 72 61 6d 20 63 75 72 73 6f 72 20 74 68 65 20  aram cursor the 
52a0: 63 75 72 73 6f 72 20 74 6f 20 70 72 69 6e 74 0a  cursor to print.
52b0: 20 20 20 20 20 2a 20 40 72 65 74 75 72 6e 20 61       * @return a
52c0: 20 53 74 72 69 6e 67 20 74 68 61 74 20 63 6f 6e   String that con
52d0: 74 61 69 6e 73 20 74 68 65 20 64 75 6d 70 65 64  tains the dumped
52e0: 20 63 75 72 73 6f 72 20 72 6f 77 0a 20 20 20 20   cursor row.    
52f0: 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20 73   */.    public s
5300: 74 61 74 69 63 20 53 74 72 69 6e 67 20 64 75 6d  tatic String dum
5310: 70 43 75 72 72 65 6e 74 52 6f 77 54 6f 53 74 72  pCurrentRowToStr
5320: 69 6e 67 28 43 75 72 73 6f 72 20 63 75 72 73 6f  ing(Cursor curso
5330: 72 29 20 7b 0a 20 20 20 20 20 20 20 20 53 74 72  r) {.        Str
5340: 69 6e 67 42 75 69 6c 64 65 72 20 73 62 20 3d 20  ingBuilder sb = 
5350: 6e 65 77 20 53 74 72 69 6e 67 42 75 69 6c 64 65  new StringBuilde
5360: 72 28 29 3b 0a 20 20 20 20 20 20 20 20 64 75 6d  r();.        dum
5370: 70 43 75 72 72 65 6e 74 52 6f 77 28 63 75 72 73  pCurrentRow(curs
5380: 6f 72 2c 20 73 62 29 3b 0a 20 20 20 20 20 20 20  or, sb);.       
5390: 20 72 65 74 75 72 6e 20 73 62 2e 74 6f 53 74 72   return sb.toStr
53a0: 69 6e 67 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  ing();.    }..  
53b0: 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 52 65 61    /**.     * Rea
53c0: 64 73 20 61 20 53 74 72 69 6e 67 20 6f 75 74 20  ds a String out 
53d0: 6f 66 20 61 20 66 69 65 6c 64 20 69 6e 20 61 20  of a field in a 
53e0: 43 75 72 73 6f 72 20 61 6e 64 20 77 72 69 74 65  Cursor and write
53f0: 73 20 69 74 20 74 6f 20 61 20 4d 61 70 2e 0a 20  s it to a Map.. 
5400: 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 70 61      *.     * @pa
5410: 72 61 6d 20 63 75 72 73 6f 72 20 54 68 65 20 63  ram cursor The c
5420: 75 72 73 6f 72 20 74 6f 20 72 65 61 64 20 66 72  ursor to read fr
5430: 6f 6d 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d  om.     * @param
5440: 20 66 69 65 6c 64 20 54 68 65 20 54 45 58 54 20   field The TEXT 
5450: 66 69 65 6c 64 20 74 6f 20 72 65 61 64 0a 20 20  field to read.  
5460: 20 20 20 2a 20 40 70 61 72 61 6d 20 76 61 6c 75     * @param valu
5470: 65 73 20 54 68 65 20 7b 40 6c 69 6e 6b 20 43 6f  es The {@link Co
5480: 6e 74 65 6e 74 56 61 6c 75 65 73 7d 20 74 6f 20  ntentValues} to 
5490: 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e  put the value in
54a0: 74 6f 2c 20 77 69 74 68 20 74 68 65 20 66 69 65  to, with the fie
54b0: 6c 64 20 61 73 20 74 68 65 20 6b 65 79 0a 20 20  ld as the key.  
54c0: 20 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63     */.    public
54d0: 20 73 74 61 74 69 63 20 76 6f 69 64 20 63 75 72   static void cur
54e0: 73 6f 72 53 74 72 69 6e 67 54 6f 43 6f 6e 74 65  sorStringToConte
54f0: 6e 74 56 61 6c 75 65 73 28 43 75 72 73 6f 72 20  ntValues(Cursor 
5500: 63 75 72 73 6f 72 2c 20 53 74 72 69 6e 67 20 66  cursor, String f
5510: 69 65 6c 64 2c 0a 20 20 20 20 20 20 20 20 20 20  ield,.          
5520: 20 20 43 6f 6e 74 65 6e 74 56 61 6c 75 65 73 20    ContentValues 
5530: 76 61 6c 75 65 73 29 20 7b 0a 20 20 20 20 20 20  values) {.      
5540: 20 20 63 75 72 73 6f 72 53 74 72 69 6e 67 54 6f    cursorStringTo
5550: 43 6f 6e 74 65 6e 74 56 61 6c 75 65 73 28 63 75  ContentValues(cu
5560: 72 73 6f 72 2c 20 66 69 65 6c 64 2c 20 76 61 6c  rsor, field, val
5570: 75 65 73 2c 20 66 69 65 6c 64 29 3b 0a 20 20 20  ues, field);.   
5580: 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20   }..    /**.    
5590: 20 2a 20 52 65 61 64 73 20 61 20 53 74 72 69 6e   * Reads a Strin
55a0: 67 20 6f 75 74 20 6f 66 20 61 20 66 69 65 6c 64  g out of a field
55b0: 20 69 6e 20 61 20 43 75 72 73 6f 72 20 61 6e 64   in a Cursor and
55c0: 20 77 72 69 74 65 73 20 69 74 20 74 6f 20 61 6e   writes it to an
55d0: 20 49 6e 73 65 72 74 48 65 6c 70 65 72 2e 0a 20   InsertHelper.. 
55e0: 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 70 61      *.     * @pa
55f0: 72 61 6d 20 63 75 72 73 6f 72 20 54 68 65 20 63  ram cursor The c
5600: 75 72 73 6f 72 20 74 6f 20 72 65 61 64 20 66 72  ursor to read fr
5610: 6f 6d 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d  om.     * @param
5620: 20 66 69 65 6c 64 20 54 68 65 20 54 45 58 54 20   field The TEXT 
5630: 66 69 65 6c 64 20 74 6f 20 72 65 61 64 0a 20 20  field to read.  
5640: 20 20 20 2a 20 40 70 61 72 61 6d 20 69 6e 73 65     * @param inse
5650: 72 74 65 72 20 54 68 65 20 49 6e 73 65 72 74 48  rter The InsertH
5660: 65 6c 70 65 72 20 74 6f 20 62 69 6e 64 20 69 6e  elper to bind in
5670: 74 6f 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d  to.     * @param
5680: 20 69 6e 64 65 78 20 74 68 65 20 69 6e 64 65 78   index the index
5690: 20 6f 66 20 74 68 65 20 62 69 6e 64 20 65 6e 74   of the bind ent
56a0: 72 79 20 69 6e 20 74 68 65 20 49 6e 73 65 72 74  ry in the Insert
56b0: 48 65 6c 70 65 72 0a 20 20 20 20 20 2a 2f 0a 20  Helper.     */. 
56c0: 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63     public static
56d0: 20 76 6f 69 64 20 63 75 72 73 6f 72 53 74 72 69   void cursorStri
56e0: 6e 67 54 6f 49 6e 73 65 72 74 48 65 6c 70 65 72  ngToInsertHelper
56f0: 28 43 75 72 73 6f 72 20 63 75 72 73 6f 72 2c 20  (Cursor cursor, 
5700: 53 74 72 69 6e 67 20 66 69 65 6c 64 2c 0a 20 20  String field,.  
5710: 20 20 20 20 20 20 20 20 20 20 49 6e 73 65 72 74            Insert
5720: 48 65 6c 70 65 72 20 69 6e 73 65 72 74 65 72 2c  Helper inserter,
5730: 20 69 6e 74 20 69 6e 64 65 78 29 20 7b 0a 20 20   int index) {.  
5740: 20 20 20 20 20 20 69 6e 73 65 72 74 65 72 2e 62        inserter.b
5750: 69 6e 64 28 69 6e 64 65 78 2c 20 63 75 72 73 6f  ind(index, curso
5760: 72 2e 67 65 74 53 74 72 69 6e 67 28 63 75 72 73  r.getString(curs
5770: 6f 72 2e 67 65 74 43 6f 6c 75 6d 6e 49 6e 64 65  or.getColumnInde
5780: 78 4f 72 54 68 72 6f 77 28 66 69 65 6c 64 29 29  xOrThrow(field))
5790: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
57a0: 2a 0a 20 20 20 20 20 2a 20 52 65 61 64 73 20 61  *.     * Reads a
57b0: 20 53 74 72 69 6e 67 20 6f 75 74 20 6f 66 20 61   String out of a
57c0: 20 66 69 65 6c 64 20 69 6e 20 61 20 43 75 72 73   field in a Curs
57d0: 6f 72 20 61 6e 64 20 77 72 69 74 65 73 20 69 74  or and writes it
57e0: 20 74 6f 20 61 20 4d 61 70 2e 0a 20 20 20 20 20   to a Map..     
57f0: 2a 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20  *.     * @param 
5800: 63 75 72 73 6f 72 20 54 68 65 20 63 75 72 73 6f  cursor The curso
5810: 72 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 0a 20  r to read from. 
5820: 20 20 20 20 2a 20 40 70 61 72 61 6d 20 66 69 65      * @param fie
5830: 6c 64 20 54 68 65 20 54 45 58 54 20 66 69 65 6c  ld The TEXT fiel
5840: 64 20 74 6f 20 72 65 61 64 0a 20 20 20 20 20 2a  d to read.     *
5850: 20 40 70 61 72 61 6d 20 76 61 6c 75 65 73 20 54   @param values T
5860: 68 65 20 7b 40 6c 69 6e 6b 20 43 6f 6e 74 65 6e  he {@link Conten
5870: 74 56 61 6c 75 65 73 7d 20 74 6f 20 70 75 74 20  tValues} to put 
5880: 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 2c 20  the value into, 
5890: 77 69 74 68 20 74 68 65 20 66 69 65 6c 64 20 61  with the field a
58a0: 73 20 74 68 65 20 6b 65 79 0a 20 20 20 20 20 2a  s the key.     *
58b0: 20 40 70 61 72 61 6d 20 6b 65 79 20 54 68 65 20   @param key The 
58c0: 6b 65 79 20 74 6f 20 73 74 6f 72 65 20 74 68 65  key to store the
58d0: 20 76 61 6c 75 65 20 77 69 74 68 20 69 6e 20 74   value with in t
58e0: 68 65 20 6d 61 70 0a 20 20 20 20 20 2a 2f 0a 20  he map.     */. 
58f0: 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63     public static
5900: 20 76 6f 69 64 20 63 75 72 73 6f 72 53 74 72 69   void cursorStri
5910: 6e 67 54 6f 43 6f 6e 74 65 6e 74 56 61 6c 75 65  ngToContentValue
5920: 73 28 43 75 72 73 6f 72 20 63 75 72 73 6f 72 2c  s(Cursor cursor,
5930: 20 53 74 72 69 6e 67 20 66 69 65 6c 64 2c 0a 20   String field,. 
5940: 20 20 20 20 20 20 20 20 20 20 20 43 6f 6e 74 65             Conte
5950: 6e 74 56 61 6c 75 65 73 20 76 61 6c 75 65 73 2c  ntValues values,
5960: 20 53 74 72 69 6e 67 20 6b 65 79 29 20 7b 0a 20   String key) {. 
5970: 20 20 20 20 20 20 20 76 61 6c 75 65 73 2e 70 75         values.pu
5980: 74 28 6b 65 79 2c 20 63 75 72 73 6f 72 2e 67 65  t(key, cursor.ge
5990: 74 53 74 72 69 6e 67 28 63 75 72 73 6f 72 2e 67  tString(cursor.g
59a0: 65 74 43 6f 6c 75 6d 6e 49 6e 64 65 78 4f 72 54  etColumnIndexOrT
59b0: 68 72 6f 77 28 66 69 65 6c 64 29 29 29 3b 0a 20  hrow(field)));. 
59c0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20     }..    /**.  
59d0: 20 20 20 2a 20 52 65 61 64 73 20 61 6e 20 49 6e     * Reads an In
59e0: 74 65 67 65 72 20 6f 75 74 20 6f 66 20 61 20 66  teger out of a f
59f0: 69 65 6c 64 20 69 6e 20 61 20 43 75 72 73 6f 72  ield in a Cursor
5a00: 20 61 6e 64 20 77 72 69 74 65 73 20 69 74 20 74   and writes it t
5a10: 6f 20 61 20 4d 61 70 2e 0a 20 20 20 20 20 2a 0a  o a Map..     *.
5a20: 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 63 75       * @param cu
5a30: 72 73 6f 72 20 54 68 65 20 63 75 72 73 6f 72 20  rsor The cursor 
5a40: 74 6f 20 72 65 61 64 20 66 72 6f 6d 0a 20 20 20  to read from.   
5a50: 20 20 2a 20 40 70 61 72 61 6d 20 66 69 65 6c 64    * @param field
5a60: 20 54 68 65 20 49 4e 54 45 47 45 52 20 66 69 65   The INTEGER fie
5a70: 6c 64 20 74 6f 20 72 65 61 64 0a 20 20 20 20 20  ld to read.     
5a80: 2a 20 40 70 61 72 61 6d 20 76 61 6c 75 65 73 20  * @param values 
5a90: 54 68 65 20 7b 40 6c 69 6e 6b 20 43 6f 6e 74 65  The {@link Conte
5aa0: 6e 74 56 61 6c 75 65 73 7d 20 74 6f 20 70 75 74  ntValues} to put
5ab0: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 2c   the value into,
5ac0: 20 77 69 74 68 20 74 68 65 20 66 69 65 6c 64 20   with the field 
5ad0: 61 73 20 74 68 65 20 6b 65 79 0a 20 20 20 20 20  as the key.     
5ae0: 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20 73 74  */.    public st
5af0: 61 74 69 63 20 76 6f 69 64 20 63 75 72 73 6f 72  atic void cursor
5b00: 49 6e 74 54 6f 43 6f 6e 74 65 6e 74 56 61 6c 75  IntToContentValu
5b10: 65 73 28 43 75 72 73 6f 72 20 63 75 72 73 6f 72  es(Cursor cursor
5b20: 2c 20 53 74 72 69 6e 67 20 66 69 65 6c 64 2c 20  , String field, 
5b30: 43 6f 6e 74 65 6e 74 56 61 6c 75 65 73 20 76 61  ContentValues va
5b40: 6c 75 65 73 29 20 7b 0a 20 20 20 20 20 20 20 20  lues) {.        
5b50: 63 75 72 73 6f 72 49 6e 74 54 6f 43 6f 6e 74 65  cursorIntToConte
5b60: 6e 74 56 61 6c 75 65 73 28 63 75 72 73 6f 72 2c  ntValues(cursor,
5b70: 20 66 69 65 6c 64 2c 20 76 61 6c 75 65 73 2c 20   field, values, 
5b80: 66 69 65 6c 64 29 3b 0a 20 20 20 20 7d 0a 0a 20  field);.    }.. 
5b90: 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 52 65     /**.     * Re
5ba0: 61 64 73 20 61 20 49 6e 74 65 67 65 72 20 6f 75  ads a Integer ou
5bb0: 74 20 6f 66 20 61 20 66 69 65 6c 64 20 69 6e 20  t of a field in 
5bc0: 61 20 43 75 72 73 6f 72 20 61 6e 64 20 77 72 69  a Cursor and wri
5bd0: 74 65 73 20 69 74 20 74 6f 20 61 20 4d 61 70 2e  tes it to a Map.
5be0: 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40  .     *.     * @
5bf0: 70 61 72 61 6d 20 63 75 72 73 6f 72 20 54 68 65  param cursor The
5c00: 20 63 75 72 73 6f 72 20 74 6f 20 72 65 61 64 20   cursor to read 
5c10: 66 72 6f 6d 0a 20 20 20 20 20 2a 20 40 70 61 72  from.     * @par
5c20: 61 6d 20 66 69 65 6c 64 20 54 68 65 20 49 4e 54  am field The INT
5c30: 45 47 45 52 20 66 69 65 6c 64 20 74 6f 20 72 65  EGER field to re
5c40: 61 64 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d  ad.     * @param
5c50: 20 76 61 6c 75 65 73 20 54 68 65 20 7b 40 6c 69   values The {@li
5c60: 6e 6b 20 43 6f 6e 74 65 6e 74 56 61 6c 75 65 73  nk ContentValues
5c70: 7d 20 74 6f 20 70 75 74 20 74 68 65 20 76 61 6c  } to put the val
5c80: 75 65 20 69 6e 74 6f 2c 20 77 69 74 68 20 74 68  ue into, with th
5c90: 65 20 66 69 65 6c 64 20 61 73 20 74 68 65 20 6b  e field as the k
5ca0: 65 79 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d  ey.     * @param
5cb0: 20 6b 65 79 20 54 68 65 20 6b 65 79 20 74 6f 20   key The key to 
5cc0: 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
5cd0: 77 69 74 68 20 69 6e 20 74 68 65 20 6d 61 70 0a  with in the map.
5ce0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c       */.    publ
5cf0: 69 63 20 73 74 61 74 69 63 20 76 6f 69 64 20 63  ic static void c
5d00: 75 72 73 6f 72 49 6e 74 54 6f 43 6f 6e 74 65 6e  ursorIntToConten
5d10: 74 56 61 6c 75 65 73 28 43 75 72 73 6f 72 20 63  tValues(Cursor c
5d20: 75 72 73 6f 72 2c 20 53 74 72 69 6e 67 20 66 69  ursor, String fi
5d30: 65 6c 64 2c 20 43 6f 6e 74 65 6e 74 56 61 6c 75  eld, ContentValu
5d40: 65 73 20 76 61 6c 75 65 73 2c 0a 20 20 20 20 20  es values,.     
5d50: 20 20 20 20 20 20 20 53 74 72 69 6e 67 20 6b 65         String ke
5d60: 79 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  y) {.        int
5d70: 20 63 6f 6c 49 6e 64 65 78 20 3d 20 63 75 72 73   colIndex = curs
5d80: 6f 72 2e 67 65 74 43 6f 6c 75 6d 6e 49 6e 64 65  or.getColumnInde
5d90: 78 28 66 69 65 6c 64 29 3b 0a 20 20 20 20 20 20  x(field);.      
5da0: 20 20 69 66 20 28 21 63 75 72 73 6f 72 2e 69 73    if (!cursor.is
5db0: 4e 75 6c 6c 28 63 6f 6c 49 6e 64 65 78 29 29 20  Null(colIndex)) 
5dc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 61  {.            va
5dd0: 6c 75 65 73 2e 70 75 74 28 6b 65 79 2c 20 63 75  lues.put(key, cu
5de0: 72 73 6f 72 2e 67 65 74 49 6e 74 28 63 6f 6c 49  rsor.getInt(colI
5df0: 6e 64 65 78 29 29 3b 0a 20 20 20 20 20 20 20 20  ndex));.        
5e00: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
5e10: 20 20 20 20 20 76 61 6c 75 65 73 2e 70 75 74 28       values.put(
5e20: 6b 65 79 2c 20 28 49 6e 74 65 67 65 72 29 20 6e  key, (Integer) n
5e30: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ull);.        }.
5e40: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20      }..    /**. 
5e50: 20 20 20 20 2a 20 52 65 61 64 73 20 61 20 4c 6f      * Reads a Lo
5e60: 6e 67 20 6f 75 74 20 6f 66 20 61 20 66 69 65 6c  ng out of a fiel
5e70: 64 20 69 6e 20 61 20 43 75 72 73 6f 72 20 61 6e  d in a Cursor an
5e80: 64 20 77 72 69 74 65 73 20 69 74 20 74 6f 20 61  d writes it to a
5e90: 20 4d 61 70 2e 0a 20 20 20 20 20 2a 0a 20 20 20   Map..     *.   
5ea0: 20 20 2a 20 40 70 61 72 61 6d 20 63 75 72 73 6f    * @param curso
5eb0: 72 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  r The cursor to 
5ec0: 72 65 61 64 20 66 72 6f 6d 0a 20 20 20 20 20 2a  read from.     *
5ed0: 20 40 70 61 72 61 6d 20 66 69 65 6c 64 20 54 68   @param field Th
5ee0: 65 20 49 4e 54 45 47 45 52 20 66 69 65 6c 64 20  e INTEGER field 
5ef0: 74 6f 20 72 65 61 64 0a 20 20 20 20 20 2a 20 40  to read.     * @
5f00: 70 61 72 61 6d 20 76 61 6c 75 65 73 20 54 68 65  param values The
5f10: 20 7b 40 6c 69 6e 6b 20 43 6f 6e 74 65 6e 74 56   {@link ContentV
5f20: 61 6c 75 65 73 7d 20 74 6f 20 70 75 74 20 74 68  alues} to put th
5f30: 65 20 76 61 6c 75 65 20 69 6e 74 6f 2c 20 77 69  e value into, wi
5f40: 74 68 20 74 68 65 20 66 69 65 6c 64 20 61 73 20  th the field as 
5f50: 74 68 65 20 6b 65 79 0a 20 20 20 20 20 2a 2f 0a  the key.     */.
5f60: 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69      public stati
5f70: 63 20 76 6f 69 64 20 63 75 72 73 6f 72 4c 6f 6e  c void cursorLon
5f80: 67 54 6f 43 6f 6e 74 65 6e 74 56 61 6c 75 65 73  gToContentValues
5f90: 28 43 75 72 73 6f 72 20 63 75 72 73 6f 72 2c 20  (Cursor cursor, 
5fa0: 53 74 72 69 6e 67 20 66 69 65 6c 64 2c 20 43 6f  String field, Co
5fb0: 6e 74 65 6e 74 56 61 6c 75 65 73 20 76 61 6c 75  ntentValues valu
5fc0: 65 73 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  es).    {.      
5fd0: 20 20 63 75 72 73 6f 72 4c 6f 6e 67 54 6f 43 6f    cursorLongToCo
5fe0: 6e 74 65 6e 74 56 61 6c 75 65 73 28 63 75 72 73  ntentValues(curs
5ff0: 6f 72 2c 20 66 69 65 6c 64 2c 20 76 61 6c 75 65  or, field, value
6000: 73 2c 20 66 69 65 6c 64 29 3b 0a 20 20 20 20 7d  s, field);.    }
6010: 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a  ..    /**.     *
6020: 20 52 65 61 64 73 20 61 20 4c 6f 6e 67 20 6f 75   Reads a Long ou
6030: 74 20 6f 66 20 61 20 66 69 65 6c 64 20 69 6e 20  t of a field in 
6040: 61 20 43 75 72 73 6f 72 20 61 6e 64 20 77 72 69  a Cursor and wri
6050: 74 65 73 20 69 74 20 74 6f 20 61 20 4d 61 70 2e  tes it to a Map.
6060: 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40  .     *.     * @
6070: 70 61 72 61 6d 20 63 75 72 73 6f 72 20 54 68 65  param cursor The
6080: 20 63 75 72 73 6f 72 20 74 6f 20 72 65 61 64 20   cursor to read 
6090: 66 72 6f 6d 0a 20 20 20 20 20 2a 20 40 70 61 72  from.     * @par
60a0: 61 6d 20 66 69 65 6c 64 20 54 68 65 20 49 4e 54  am field The INT
60b0: 45 47 45 52 20 66 69 65 6c 64 20 74 6f 20 72 65  EGER field to re
60c0: 61 64 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d  ad.     * @param
60d0: 20 76 61 6c 75 65 73 20 54 68 65 20 7b 40 6c 69   values The {@li
60e0: 6e 6b 20 43 6f 6e 74 65 6e 74 56 61 6c 75 65 73  nk ContentValues
60f0: 7d 20 74 6f 20 70 75 74 20 74 68 65 20 76 61 6c  } to put the val
6100: 75 65 20 69 6e 74 6f 0a 20 20 20 20 20 2a 20 40  ue into.     * @
6110: 70 61 72 61 6d 20 6b 65 79 20 54 68 65 20 6b 65  param key The ke
6120: 79 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20 76  y to store the v
6130: 61 6c 75 65 20 77 69 74 68 20 69 6e 20 74 68 65  alue with in the
6140: 20 6d 61 70 0a 20 20 20 20 20 2a 2f 0a 20 20 20   map.     */.   
6150: 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20 76   public static v
6160: 6f 69 64 20 63 75 72 73 6f 72 4c 6f 6e 67 54 6f  oid cursorLongTo
6170: 43 6f 6e 74 65 6e 74 56 61 6c 75 65 73 28 43 75  ContentValues(Cu
6180: 72 73 6f 72 20 63 75 72 73 6f 72 2c 20 53 74 72  rsor cursor, Str
6190: 69 6e 67 20 66 69 65 6c 64 2c 20 43 6f 6e 74 65  ing field, Conte
61a0: 6e 74 56 61 6c 75 65 73 20 76 61 6c 75 65 73 2c  ntValues values,
61b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 74 72  .            Str
61c0: 69 6e 67 20 6b 65 79 29 20 7b 0a 20 20 20 20 20  ing key) {.     
61d0: 20 20 20 69 6e 74 20 63 6f 6c 49 6e 64 65 78 20     int colIndex 
61e0: 3d 20 63 75 72 73 6f 72 2e 67 65 74 43 6f 6c 75  = cursor.getColu
61f0: 6d 6e 49 6e 64 65 78 28 66 69 65 6c 64 29 3b 0a  mnIndex(field);.
6200: 20 20 20 20 20 20 20 20 69 66 20 28 21 63 75 72          if (!cur
6210: 73 6f 72 2e 69 73 4e 75 6c 6c 28 63 6f 6c 49 6e  sor.isNull(colIn
6220: 64 65 78 29 29 20 7b 0a 20 20 20 20 20 20 20 20  dex)) {.        
6230: 20 20 20 20 4c 6f 6e 67 20 76 61 6c 75 65 20 3d      Long value =
6240: 20 4c 6f 6e 67 2e 76 61 6c 75 65 4f 66 28 63 75   Long.valueOf(cu
6250: 72 73 6f 72 2e 67 65 74 4c 6f 6e 67 28 63 6f 6c  rsor.getLong(col
6260: 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 20 20 20  Index));.       
6270: 20 20 20 20 20 76 61 6c 75 65 73 2e 70 75 74 28       values.put(
6280: 6b 65 79 2c 20 76 61 6c 75 65 29 3b 0a 20 20 20  key, value);.   
6290: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
62a0: 20 20 20 20 20 20 20 20 20 20 76 61 6c 75 65 73            values
62b0: 2e 70 75 74 28 6b 65 79 2c 20 28 4c 6f 6e 67 29  .put(key, (Long)
62c0: 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20   null);.        
62d0: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a  }.    }..    /**
62e0: 0a 20 20 20 20 20 2a 20 52 65 61 64 73 20 61 20  .     * Reads a 
62f0: 44 6f 75 62 6c 65 20 6f 75 74 20 6f 66 20 61 20  Double out of a 
6300: 66 69 65 6c 64 20 69 6e 20 61 20 43 75 72 73 6f  field in a Curso
6310: 72 20 61 6e 64 20 77 72 69 74 65 73 20 69 74 20  r and writes it 
6320: 74 6f 20 61 20 4d 61 70 2e 0a 20 20 20 20 20 2a  to a Map..     *
6330: 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 63  .     * @param c
6340: 75 72 73 6f 72 20 54 68 65 20 63 75 72 73 6f 72  ursor The cursor
6350: 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 0a 20 20   to read from.  
6360: 20 20 20 2a 20 40 70 61 72 61 6d 20 66 69 65 6c     * @param fiel
6370: 64 20 54 68 65 20 52 45 41 4c 20 66 69 65 6c 64  d The REAL field
6380: 20 74 6f 20 72 65 61 64 0a 20 20 20 20 20 2a 20   to read.     * 
6390: 40 70 61 72 61 6d 20 76 61 6c 75 65 73 20 54 68  @param values Th
63a0: 65 20 7b 40 6c 69 6e 6b 20 43 6f 6e 74 65 6e 74  e {@link Content
63b0: 56 61 6c 75 65 73 7d 20 74 6f 20 70 75 74 20 74  Values} to put t
63c0: 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 0a 20 20  he value into.  
63d0: 20 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63     */.    public
63e0: 20 73 74 61 74 69 63 20 76 6f 69 64 20 63 75 72   static void cur
63f0: 73 6f 72 44 6f 75 62 6c 65 54 6f 43 75 72 73 6f  sorDoubleToCurso
6400: 72 56 61 6c 75 65 73 28 43 75 72 73 6f 72 20 63  rValues(Cursor c
6410: 75 72 73 6f 72 2c 20 53 74 72 69 6e 67 20 66 69  ursor, String fi
6420: 65 6c 64 2c 20 43 6f 6e 74 65 6e 74 56 61 6c 75  eld, ContentValu
6430: 65 73 20 76 61 6c 75 65 73 29 0a 20 20 20 20 7b  es values).    {
6440: 0a 20 20 20 20 20 20 20 20 63 75 72 73 6f 72 44  .        cursorD
6450: 6f 75 62 6c 65 54 6f 43 6f 6e 74 65 6e 74 56 61  oubleToContentVa
6460: 6c 75 65 73 28 63 75 72 73 6f 72 2c 20 66 69 65  lues(cursor, fie
6470: 6c 64 2c 20 76 61 6c 75 65 73 2c 20 66 69 65 6c  ld, values, fiel
6480: 64 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  d);.    }..    /
6490: 2a 2a 0a 20 20 20 20 20 2a 20 52 65 61 64 73 20  **.     * Reads 
64a0: 61 20 44 6f 75 62 6c 65 20 6f 75 74 20 6f 66 20  a Double out of 
64b0: 61 20 66 69 65 6c 64 20 69 6e 20 61 20 43 75 72  a field in a Cur
64c0: 73 6f 72 20 61 6e 64 20 77 72 69 74 65 73 20 69  sor and writes i
64d0: 74 20 74 6f 20 61 20 4d 61 70 2e 0a 20 20 20 20  t to a Map..    
64e0: 20 2a 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d   *.     * @param
64f0: 20 63 75 72 73 6f 72 20 54 68 65 20 63 75 72 73   cursor The curs
6500: 6f 72 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 0a  or to read from.
6510: 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 66 69       * @param fi
6520: 65 6c 64 20 54 68 65 20 52 45 41 4c 20 66 69 65  eld The REAL fie
6530: 6c 64 20 74 6f 20 72 65 61 64 0a 20 20 20 20 20  ld to read.     
6540: 2a 20 40 70 61 72 61 6d 20 76 61 6c 75 65 73 20  * @param values 
6550: 54 68 65 20 7b 40 6c 69 6e 6b 20 43 6f 6e 74 65  The {@link Conte
6560: 6e 74 56 61 6c 75 65 73 7d 20 74 6f 20 70 75 74  ntValues} to put
6570: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 0a   the value into.
6580: 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 6b 65       * @param ke
6590: 79 20 54 68 65 20 6b 65 79 20 74 6f 20 73 74 6f  y The key to sto
65a0: 72 65 20 74 68 65 20 76 61 6c 75 65 20 77 69 74  re the value wit
65b0: 68 20 69 6e 20 74 68 65 20 6d 61 70 0a 20 20 20  h in the map.   
65c0: 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20    */.    public 
65d0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 75 72 73  static void curs
65e0: 6f 72 44 6f 75 62 6c 65 54 6f 43 6f 6e 74 65 6e  orDoubleToConten
65f0: 74 56 61 6c 75 65 73 28 43 75 72 73 6f 72 20 63  tValues(Cursor c
6600: 75 72 73 6f 72 2c 20 53 74 72 69 6e 67 20 66 69  ursor, String fi
6610: 65 6c 64 2c 0a 20 20 20 20 20 20 20 20 20 20 20  eld,.           
6620: 20 43 6f 6e 74 65 6e 74 56 61 6c 75 65 73 20 76   ContentValues v
6630: 61 6c 75 65 73 2c 20 53 74 72 69 6e 67 20 6b 65  alues, String ke
6640: 79 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  y) {.        int
6650: 20 63 6f 6c 49 6e 64 65 78 20 3d 20 63 75 72 73   colIndex = curs
6660: 6f 72 2e 67 65 74 43 6f 6c 75 6d 6e 49 6e 64 65  or.getColumnInde
6670: 78 28 66 69 65 6c 64 29 3b 0a 20 20 20 20 20 20  x(field);.      
6680: 20 20 69 66 20 28 21 63 75 72 73 6f 72 2e 69 73    if (!cursor.is
6690: 4e 75 6c 6c 28 63 6f 6c 49 6e 64 65 78 29 29 20  Null(colIndex)) 
66a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 61  {.            va
66b0: 6c 75 65 73 2e 70 75 74 28 6b 65 79 2c 20 63 75  lues.put(key, cu
66c0: 72 73 6f 72 2e 67 65 74 44 6f 75 62 6c 65 28 63  rsor.getDouble(c
66d0: 6f 6c 49 6e 64 65 78 29 29 3b 0a 20 20 20 20 20  olIndex));.     
66e0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
66f0: 20 20 20 20 20 20 20 20 76 61 6c 75 65 73 2e 70          values.p
6700: 75 74 28 6b 65 79 2c 20 28 44 6f 75 62 6c 65 29  ut(key, (Double)
6710: 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20   null);.        
6720: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a  }.    }..    /**
6730: 0a 20 20 20 20 20 2a 20 52 65 61 64 20 74 68 65  .     * Read the
6740: 20 65 6e 74 69 72 65 20 63 6f 6e 74 65 6e 74 73   entire contents
6750: 20 6f 66 20 61 20 63 75 72 73 6f 72 20 72 6f 77   of a cursor row
6760: 20 61 6e 64 20 73 74 6f 72 65 20 74 68 65 6d 20   and store them 
6770: 69 6e 20 61 20 43 6f 6e 74 65 6e 74 56 61 6c 75  in a ContentValu
6780: 65 73 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20  es..     *.     
6790: 2a 20 40 70 61 72 61 6d 20 63 75 72 73 6f 72 20  * @param cursor 
67a0: 74 68 65 20 63 75 72 73 6f 72 20 74 6f 20 72 65  the cursor to re
67b0: 61 64 20 66 72 6f 6d 2e 0a 20 20 20 20 20 2a 20  ad from..     * 
67c0: 40 70 61 72 61 6d 20 76 61 6c 75 65 73 20 74 68  @param values th
67d0: 65 20 7b 40 6c 69 6e 6b 20 43 6f 6e 74 65 6e 74  e {@link Content
67e0: 56 61 6c 75 65 73 7d 20 74 6f 20 70 75 74 20 74  Values} to put t
67f0: 68 65 20 72 6f 77 20 69 6e 74 6f 2e 0a 20 20 20  he row into..   
6800: 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20    */.    public 
6810: 73 74 61 74 69 63 20 76 6f 69 64 20 63 75 72 73  static void curs
6820: 6f 72 52 6f 77 54 6f 43 6f 6e 74 65 6e 74 56 61  orRowToContentVa
6830: 6c 75 65 73 28 43 75 72 73 6f 72 20 63 75 72 73  lues(Cursor curs
6840: 6f 72 2c 20 43 6f 6e 74 65 6e 74 56 61 6c 75 65  or, ContentValue
6850: 73 20 76 61 6c 75 65 73 29 20 7b 0a 20 20 20 20  s values) {.    
6860: 20 20 20 20 53 74 72 69 6e 67 5b 5d 20 63 6f 6c      String[] col
6870: 75 6d 6e 73 20 3d 20 63 75 72 73 6f 72 2e 67 65  umns = cursor.ge
6880: 74 43 6f 6c 75 6d 6e 4e 61 6d 65 73 28 29 3b 0a  tColumnNames();.
6890: 20 20 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 67          int leng
68a0: 74 68 20 3d 20 63 6f 6c 75 6d 6e 73 2e 6c 65 6e  th = columns.len
68b0: 67 74 68 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  gth;.        for
68c0: 20 28 69 6e 74 20 69 20 3d 20 30 3b 20 69 20 3c   (int i = 0; i <
68d0: 20 6c 65 6e 67 74 68 3b 20 69 2b 2b 29 20 7b 0a   length; i++) {.
68e0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
68f0: 63 75 72 73 6f 72 2e 67 65 74 54 79 70 65 28 69  cursor.getType(i
6900: 29 20 3d 3d 20 43 75 72 73 6f 72 2e 46 49 45 4c  ) == Cursor.FIEL
6910: 44 5f 54 59 50 45 5f 42 4c 4f 42 29 20 7b 0a 20  D_TYPE_BLOB) {. 
6920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76                 v
6930: 61 6c 75 65 73 2e 70 75 74 28 63 6f 6c 75 6d 6e  alues.put(column
6940: 73 5b 69 5d 2c 20 63 75 72 73 6f 72 2e 67 65 74  s[i], cursor.get
6950: 42 6c 6f 62 28 69 29 29 3b 0a 20 20 20 20 20 20  Blob(i));.      
6960: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
6970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76                 v
6980: 61 6c 75 65 73 2e 70 75 74 28 63 6f 6c 75 6d 6e  alues.put(column
6990: 73 5b 69 5d 2c 20 63 75 72 73 6f 72 2e 67 65 74  s[i], cursor.get
69a0: 53 74 72 69 6e 67 28 69 29 29 3b 0a 20 20 20 20  String(i));.    
69b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
69c0: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
69d0: 2a 2a 0a 20 20 20 20 20 2a 20 50 69 63 6b 73 20  **.     * Picks 
69e0: 61 20 73 74 61 72 74 20 70 6f 73 69 74 69 6f 6e  a start position
69f0: 20 66 6f 72 20 7b 40 6c 69 6e 6b 20 43 75 72 73   for {@link Curs
6a00: 6f 72 23 66 69 6c 6c 57 69 6e 64 6f 77 7d 20 73  or#fillWindow} s
6a10: 75 63 68 20 74 68 61 74 20 74 68 65 0a 20 20 20  uch that the.   
6a20: 20 20 2a 20 77 69 6e 64 6f 77 20 77 69 6c 6c 20    * window will 
6a30: 63 6f 6e 74 61 69 6e 20 74 68 65 20 72 65 71 75  contain the requ
6a40: 65 73 74 65 64 20 72 6f 77 20 61 6e 64 20 61 20  ested row and a 
6a50: 75 73 65 66 75 6c 20 72 61 6e 67 65 20 6f 66 20  useful range of 
6a60: 72 6f 77 73 0a 20 20 20 20 20 2a 20 61 72 6f 75  rows.     * arou
6a70: 6e 64 20 69 74 2e 0a 20 20 20 20 20 2a 0a 20 20  nd it..     *.  
6a80: 20 20 20 2a 20 57 68 65 6e 20 74 68 65 20 64 61     * When the da
6a90: 74 61 20 73 65 74 20 69 73 20 74 6f 6f 20 6c 61  ta set is too la
6aa0: 72 67 65 20 74 6f 20 66 69 74 20 69 6e 20 61 20  rge to fit in a 
6ab0: 63 75 72 73 6f 72 20 77 69 6e 64 6f 77 2c 20 73  cursor window, s
6ac0: 65 65 6b 69 6e 67 20 74 68 65 0a 20 20 20 20 20  eeking the.     
6ad0: 2a 20 63 75 72 73 6f 72 20 63 61 6e 20 62 65 63  * cursor can bec
6ae0: 6f 6d 65 20 61 20 76 65 72 79 20 65 78 70 65 6e  ome a very expen
6af0: 73 69 76 65 20 6f 70 65 72 61 74 69 6f 6e 20 73  sive operation s
6b00: 69 6e 63 65 20 77 65 20 68 61 76 65 20 74 6f 20  ince we have to 
6b10: 72 75 6e 20 74 68 65 0a 20 20 20 20 20 2a 20 71  run the.     * q
6b20: 75 65 72 79 20 61 67 61 69 6e 20 77 68 65 6e 20  uery again when 
6b30: 77 65 20 6d 6f 76 65 20 6f 75 74 73 69 64 65 20  we move outside 
6b40: 74 68 65 20 62 6f 75 6e 64 73 20 6f 66 20 74 68  the bounds of th
6b50: 65 20 63 75 72 72 65 6e 74 20 77 69 6e 64 6f 77  e current window
6b60: 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20  ..     *.     * 
6b70: 57 65 20 74 72 79 20 74 6f 20 63 68 6f 6f 73 65  We try to choose
6b80: 20 61 20 73 74 61 72 74 20 70 6f 73 69 74 69 6f   a start positio
6b90: 6e 20 66 6f 72 20 74 68 65 20 63 75 72 73 6f 72  n for the cursor
6ba0: 20 77 69 6e 64 6f 77 20 73 75 63 68 20 74 68 61   window such tha
6bb0: 74 0a 20 20 20 20 20 2a 20 31 2f 33 20 6f 66 20  t.     * 1/3 of 
6bc0: 74 68 65 20 77 69 6e 64 6f 77 27 73 20 63 61 70  the window's cap
6bd0: 61 63 69 74 79 20 69 73 20 75 73 65 64 20 74 6f  acity is used to
6be0: 20 68 6f 6c 64 20 72 6f 77 73 20 62 65 66 6f 72   hold rows befor
6bf0: 65 20 74 68 65 20 72 65 71 75 65 73 74 65 64 0a  e the requested.
6c00: 20 20 20 20 20 2a 20 70 6f 73 69 74 69 6f 6e 20       * position 
6c10: 61 6e 64 20 32 2f 33 20 6f 66 20 74 68 65 20 77  and 2/3 of the w
6c20: 69 6e 64 6f 77 27 73 20 63 61 70 61 63 69 74 79  indow's capacity
6c30: 20 69 73 20 75 73 65 64 20 74 6f 20 68 6f 6c 64   is used to hold
6c40: 20 72 6f 77 73 20 61 66 74 65 72 20 74 68 65 0a   rows after the.
6c50: 20 20 20 20 20 2a 20 72 65 71 75 65 73 74 65 64       * requested
6c60: 20 70 6f 73 69 74 69 6f 6e 2e 0a 20 20 20 20 20   position..     
6c70: 2a 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20  *.     * @param 
6c80: 63 75 72 73 6f 72 50 6f 73 69 74 69 6f 6e 20 54  cursorPosition T
6c90: 68 65 20 72 6f 77 20 69 6e 64 65 78 20 6f 66 20  he row index of 
6ca0: 74 68 65 20 72 6f 77 20 77 65 20 77 61 6e 74 20  the row we want 
6cb0: 74 6f 20 67 65 74 2e 0a 20 20 20 20 20 2a 20 40  to get..     * @
6cc0: 70 61 72 61 6d 20 63 75 72 73 6f 72 57 69 6e 64  param cursorWind
6cd0: 6f 77 43 61 70 61 63 69 74 79 20 54 68 65 20 65  owCapacity The e
6ce0: 73 74 69 6d 61 74 65 64 20 6e 75 6d 62 65 72 20  stimated number 
6cf0: 6f 66 20 72 6f 77 73 20 74 68 61 74 20 63 61 6e  of rows that can
6d00: 20 66 69 74 20 69 6e 0a 20 20 20 20 20 2a 20 61   fit in.     * a
6d10: 20 63 75 72 73 6f 72 20 77 69 6e 64 6f 77 2c 20   cursor window, 
6d20: 6f 72 20 30 20 69 66 20 75 6e 6b 6e 6f 77 6e 2e  or 0 if unknown.
6d30: 0a 20 20 20 20 20 2a 20 40 72 65 74 75 72 6e 20  .     * @return 
6d40: 54 68 65 20 72 65 63 6f 6d 6d 65 6e 64 65 64 20  The recommended 
6d50: 73 74 61 72 74 20 70 6f 73 69 74 69 6f 6e 2c 20  start position, 
6d60: 61 6c 77 61 79 73 20 6c 65 73 73 20 74 68 61 6e  always less than
6d70: 20 6f 72 20 65 71 75 61 6c 20 74 6f 0a 20 20 20   or equal to.   
6d80: 20 20 2a 20 74 68 65 20 72 65 71 75 65 73 74 65    * the requeste
6d90: 64 20 72 6f 77 2e 0a 20 20 20 20 20 2a 20 40 68  d row..     * @h
6da0: 69 64 65 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  ide.     */.    
6db0: 70 75 62 6c 69 63 20 73 74 61 74 69 63 20 69 6e  public static in
6dc0: 74 20 63 75 72 73 6f 72 50 69 63 6b 46 69 6c 6c  t cursorPickFill
6dd0: 57 69 6e 64 6f 77 53 74 61 72 74 50 6f 73 69 74  WindowStartPosit
6de0: 69 6f 6e 28 0a 20 20 20 20 20 20 20 20 20 20 20  ion(.           
6df0: 20 69 6e 74 20 63 75 72 73 6f 72 50 6f 73 69 74   int cursorPosit
6e00: 69 6f 6e 2c 20 69 6e 74 20 63 75 72 73 6f 72 57  ion, int cursorW
6e10: 69 6e 64 6f 77 43 61 70 61 63 69 74 79 29 20 7b  indowCapacity) {
6e20: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
6e30: 4d 61 74 68 2e 6d 61 78 28 63 75 72 73 6f 72 50  Math.max(cursorP
6e40: 6f 73 69 74 69 6f 6e 20 2d 20 63 75 72 73 6f 72  osition - cursor
6e50: 57 69 6e 64 6f 77 43 61 70 61 63 69 74 79 20 2f  WindowCapacity /
6e60: 20 33 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 0a 20   3, 0);.    }.. 
6e70: 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 51 75     /**.     * Qu
6e80: 65 72 79 20 74 68 65 20 74 61 62 6c 65 20 66 6f  ery the table fo
6e90: 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  r the number of 
6ea0: 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62 6c  rows in the tabl
6eb0: 65 2e 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d  e..     * @param
6ec0: 20 64 62 20 74 68 65 20 64 61 74 61 62 61 73 65   db the database
6ed0: 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 69 6e   the table is in
6ee0: 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 74  .     * @param t
6ef0: 61 62 6c 65 20 74 68 65 20 6e 61 6d 65 20 6f 66  able the name of
6f00: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 71 75   the table to qu
6f10: 65 72 79 0a 20 20 20 20 20 2a 20 40 72 65 74 75  ery.     * @retu
6f20: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
6f30: 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61 62   rows in the tab
6f40: 6c 65 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70  le.     */.    p
6f50: 75 62 6c 69 63 20 73 74 61 74 69 63 20 6c 6f 6e  ublic static lon
6f60: 67 20 71 75 65 72 79 4e 75 6d 45 6e 74 72 69 65  g queryNumEntrie
6f70: 73 28 53 51 4c 69 74 65 44 61 74 61 62 61 73 65  s(SQLiteDatabase
6f80: 20 64 62 2c 20 53 74 72 69 6e 67 20 74 61 62 6c   db, String tabl
6f90: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74  e) {.        ret
6fa0: 75 72 6e 20 71 75 65 72 79 4e 75 6d 45 6e 74 72  urn queryNumEntr
6fb0: 69 65 73 28 64 62 2c 20 74 61 62 6c 65 2c 20 6e  ies(db, table, n
6fc0: 75 6c 6c 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20  ull, null);.    
6fd0: 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20  }..    /**.     
6fe0: 2a 20 51 75 65 72 79 20 74 68 65 20 74 61 62 6c  * Query the tabl
6ff0: 65 20 66 6f 72 20 74 68 65 20 6e 75 6d 62 65 72  e for the number
7000: 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20   of rows in the 
7010: 74 61 62 6c 65 2e 0a 20 20 20 20 20 2a 20 40 70  table..     * @p
7020: 61 72 61 6d 20 64 62 20 74 68 65 20 64 61 74 61  aram db the data
7030: 62 61 73 65 20 74 68 65 20 74 61 62 6c 65 20 69  base the table i
7040: 73 20 69 6e 0a 20 20 20 20 20 2a 20 40 70 61 72  s in.     * @par
7050: 61 6d 20 74 61 62 6c 65 20 74 68 65 20 6e 61 6d  am table the nam
7060: 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 74  e of the table t
7070: 6f 20 71 75 65 72 79 0a 20 20 20 20 20 2a 20 40  o query.     * @
7080: 70 61 72 61 6d 20 73 65 6c 65 63 74 69 6f 6e 20  param selection 
7090: 41 20 66 69 6c 74 65 72 20 64 65 63 6c 61 72 69  A filter declari
70a0: 6e 67 20 77 68 69 63 68 20 72 6f 77 73 20 74 6f  ng which rows to
70b0: 20 72 65 74 75 72 6e 2c 0a 20 20 20 20 20 2a 20   return,.     * 
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
70d0: 6d 61 74 74 65 64 20 61 73 20 61 6e 20 53 51 4c  matted as an SQL
70e0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 28 65   WHERE clause (e
70f0: 78 63 6c 75 64 69 6e 67 20 74 68 65 20 57 48 45  xcluding the WHE
7100: 52 45 20 69 74 73 65 6c 66 29 2e 0a 20 20 20 20  RE itself)..    
7110: 20 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   *              
7120: 50 61 73 73 69 6e 67 20 6e 75 6c 6c 20 77 69 6c  Passing null wil
7130: 6c 20 63 6f 75 6e 74 20 61 6c 6c 20 72 6f 77 73  l count all rows
7140: 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e 20 74   for the given t
7150: 61 62 6c 65 0a 20 20 20 20 20 2a 20 40 72 65 74  able.     * @ret
7160: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
7170: 66 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  f rows in the ta
7180: 62 6c 65 20 66 69 6c 74 65 72 65 64 20 62 79 20  ble filtered by 
7190: 74 68 65 20 73 65 6c 65 63 74 69 6f 6e 0a 20 20  the selection.  
71a0: 20 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63     */.    public
71b0: 20 73 74 61 74 69 63 20 6c 6f 6e 67 20 71 75 65   static long que
71c0: 72 79 4e 75 6d 45 6e 74 72 69 65 73 28 53 51 4c  ryNumEntries(SQL
71d0: 69 74 65 44 61 74 61 62 61 73 65 20 64 62 2c 20  iteDatabase db, 
71e0: 53 74 72 69 6e 67 20 74 61 62 6c 65 2c 20 53 74  String table, St
71f0: 72 69 6e 67 20 73 65 6c 65 63 74 69 6f 6e 29 20  ring selection) 
7200: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
7210: 20 71 75 65 72 79 4e 75 6d 45 6e 74 72 69 65 73   queryNumEntries
7220: 28 64 62 2c 20 74 61 62 6c 65 2c 20 73 65 6c 65  (db, table, sele
7230: 63 74 69 6f 6e 2c 20 6e 75 6c 6c 29 3b 0a 20 20  ction, null);.  
7240: 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20    }..    /**.   
7250: 20 20 2a 20 51 75 65 72 79 20 74 68 65 20 74 61    * Query the ta
7260: 62 6c 65 20 66 6f 72 20 74 68 65 20 6e 75 6d 62  ble for the numb
7270: 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74 68  er of rows in th
7280: 65 20 74 61 62 6c 65 2e 0a 20 20 20 20 20 2a 20  e table..     * 
7290: 40 70 61 72 61 6d 20 64 62 20 74 68 65 20 64 61  @param db the da
72a0: 74 61 62 61 73 65 20 74 68 65 20 74 61 62 6c 65  tabase the table
72b0: 20 69 73 20 69 6e 0a 20 20 20 20 20 2a 20 40 70   is in.     * @p
72c0: 61 72 61 6d 20 74 61 62 6c 65 20 74 68 65 20 6e  aram table the n
72d0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
72e0: 20 74 6f 20 71 75 65 72 79 0a 20 20 20 20 20 2a   to query.     *
72f0: 20 40 70 61 72 61 6d 20 73 65 6c 65 63 74 69 6f   @param selectio
7300: 6e 20 41 20 66 69 6c 74 65 72 20 64 65 63 6c 61  n A filter decla
7310: 72 69 6e 67 20 77 68 69 63 68 20 72 6f 77 73 20  ring which rows 
7320: 74 6f 20 72 65 74 75 72 6e 2c 0a 20 20 20 20 20  to return,.     
7330: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66  *              f
7340: 6f 72 6d 61 74 74 65 64 20 61 73 20 61 6e 20 53  ormatted as an S
7350: 51 4c 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  QL WHERE clause 
7360: 28 65 78 63 6c 75 64 69 6e 67 20 74 68 65 20 57  (excluding the W
7370: 48 45 52 45 20 69 74 73 65 6c 66 29 2e 0a 20 20  HERE itself)..  
7380: 20 20 20 2a 20 20 20 20 20 20 20 20 20 20 20 20     *            
7390: 20 20 50 61 73 73 69 6e 67 20 6e 75 6c 6c 20 77    Passing null w
73a0: 69 6c 6c 20 63 6f 75 6e 74 20 61 6c 6c 20 72 6f  ill count all ro
73b0: 77 73 20 66 6f 72 20 74 68 65 20 67 69 76 65 6e  ws for the given
73c0: 20 74 61 62 6c 65 0a 20 20 20 20 20 2a 20 40 70   table.     * @p
73d0: 61 72 61 6d 20 73 65 6c 65 63 74 69 6f 6e 41 72  aram selectionAr
73e0: 67 73 20 59 6f 75 20 6d 61 79 20 69 6e 63 6c 75  gs You may inclu
73f0: 64 65 20 3f 73 20 69 6e 20 73 65 6c 65 63 74 69  de ?s in selecti
7400: 6f 6e 2c 0a 20 20 20 20 20 2a 20 20 20 20 20 20  on,.     *      
7410: 20 20 20 20 20 20 20 20 77 68 69 63 68 20 77 69          which wi
7420: 6c 6c 20 62 65 20 72 65 70 6c 61 63 65 64 20 62  ll be replaced b
7430: 79 20 74 68 65 20 76 61 6c 75 65 73 20 66 72 6f  y the values fro
7440: 6d 20 73 65 6c 65 63 74 69 6f 6e 41 72 67 73 2c  m selectionArgs,
7450: 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20  .     *         
7460: 20 20 20 20 20 69 6e 20 6f 72 64 65 72 20 74 68       in order th
7470: 61 74 20 74 68 65 79 20 61 70 70 65 61 72 20 69  at they appear i
7480: 6e 20 74 68 65 20 73 65 6c 65 63 74 69 6f 6e 2e  n the selection.
7490: 0a 20 20 20 20 20 2a 20 20 20 20 20 20 20 20 20  .     *         
74a0: 20 20 20 20 20 54 68 65 20 76 61 6c 75 65 73 20       The values 
74b0: 77 69 6c 6c 20 62 65 20 62 6f 75 6e 64 20 61 73  will be bound as
74c0: 20 53 74 72 69 6e 67 73 2e 0a 20 20 20 20 20 2a   Strings..     *
74d0: 20 40 72 65 74 75 72 6e 20 74 68 65 20 6e 75 6d   @return the num
74e0: 62 65 72 20 6f 66 20 72 6f 77 73 20 69 6e 20 74  ber of rows in t
74f0: 68 65 20 74 61 62 6c 65 20 66 69 6c 74 65 72 65  he table filtere
7500: 64 20 62 79 20 74 68 65 20 73 65 6c 65 63 74 69  d by the selecti
7510: 6f 6e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70  on.     */.    p
7520: 75 62 6c 69 63 20 73 74 61 74 69 63 20 6c 6f 6e  ublic static lon
7530: 67 20 71 75 65 72 79 4e 75 6d 45 6e 74 72 69 65  g queryNumEntrie
7540: 73 28 53 51 4c 69 74 65 44 61 74 61 62 61 73 65  s(SQLiteDatabase
7550: 20 64 62 2c 20 53 74 72 69 6e 67 20 74 61 62 6c   db, String tabl
7560: 65 2c 20 53 74 72 69 6e 67 20 73 65 6c 65 63 74  e, String select
7570: 69 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ion,.           
7580: 20 53 74 72 69 6e 67 5b 5d 20 73 65 6c 65 63 74   String[] select
7590: 69 6f 6e 41 72 67 73 29 20 7b 0a 20 20 20 20 20  ionArgs) {.     
75a0: 20 20 20 53 74 72 69 6e 67 20 73 20 3d 20 28 21     String s = (!
75b0: 54 65 78 74 55 74 69 6c 73 2e 69 73 45 6d 70 74  TextUtils.isEmpt
75c0: 79 28 73 65 6c 65 63 74 69 6f 6e 29 29 20 3f 20  y(selection)) ? 
75d0: 22 20 77 68 65 72 65 20 22 20 2b 20 73 65 6c 65  " where " + sele
75e0: 63 74 69 6f 6e 20 3a 20 22 22 3b 0a 20 20 20 20  ction : "";.    
75f0: 20 20 20 20 72 65 74 75 72 6e 20 6c 6f 6e 67 46      return longF
7600: 6f 72 51 75 65 72 79 28 64 62 2c 20 22 73 65 6c  orQuery(db, "sel
7610: 65 63 74 20 63 6f 75 6e 74 28 2a 29 20 66 72 6f  ect count(*) fro
7620: 6d 20 22 20 2b 20 74 61 62 6c 65 20 2b 20 73 2c  m " + table + s,
7630: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7640: 20 20 20 20 20 73 65 6c 65 63 74 69 6f 6e 41 72       selectionAr
7650: 67 73 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  gs);.    }..    
7660: 2f 2a 2a 0a 20 20 20 20 20 2a 20 51 75 65 72 79  /**.     * Query
7670: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 63 68   the table to ch
7680: 65 63 6b 20 77 68 65 74 68 65 72 20 61 20 74 61  eck whether a ta
7690: 62 6c 65 20 69 73 20 65 6d 70 74 79 20 6f 72 20  ble is empty or 
76a0: 6e 6f 74 0a 20 20 20 20 20 2a 20 40 70 61 72 61  not.     * @para
76b0: 6d 20 64 62 20 74 68 65 20 64 61 74 61 62 61 73  m db the databas
76c0: 65 20 74 68 65 20 74 61 62 6c 65 20 69 73 20 69  e the table is i
76d0: 6e 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20  n.     * @param 
76e0: 74 61 62 6c 65 20 74 68 65 20 6e 61 6d 65 20 6f  table the name o
76f0: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 71  f the table to q
7700: 75 65 72 79 0a 20 20 20 20 20 2a 20 40 72 65 74  uery.     * @ret
7710: 75 72 6e 20 54 72 75 65 20 69 66 20 74 68 65 20  urn True if the 
7720: 74 61 62 6c 65 20 69 73 20 65 6d 70 74 79 0a 20  table is empty. 
7730: 20 20 20 20 2a 20 40 68 69 64 65 0a 20 20 20 20      * @hide.    
7740: 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20 73   */.    public s
7750: 74 61 74 69 63 20 62 6f 6f 6c 65 61 6e 20 71 75  tatic boolean qu
7760: 65 72 79 49 73 45 6d 70 74 79 28 53 51 4c 69 74  eryIsEmpty(SQLit
7770: 65 44 61 74 61 62 61 73 65 20 64 62 2c 20 53 74  eDatabase db, St
7780: 72 69 6e 67 20 74 61 62 6c 65 29 20 7b 0a 20 20  ring table) {.  
7790: 20 20 20 20 20 20 6c 6f 6e 67 20 69 73 45 6d 70        long isEmp
77a0: 74 79 20 3d 20 6c 6f 6e 67 46 6f 72 51 75 65 72  ty = longForQuer
77b0: 79 28 64 62 2c 20 22 73 65 6c 65 63 74 20 65 78  y(db, "select ex
77c0: 69 73 74 73 28 73 65 6c 65 63 74 20 31 20 66 72  ists(select 1 fr
77d0: 6f 6d 20 22 20 2b 20 74 61 62 6c 65 20 2b 20 22  om " + table + "
77e0: 29 22 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20  )", null);.     
77f0: 20 20 20 72 65 74 75 72 6e 20 69 73 45 6d 70 74     return isEmpt
7800: 79 20 3d 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20  y == 0;.    }.. 
7810: 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 55 74     /**.     * Ut
7820: 69 6c 69 74 79 20 6d 65 74 68 6f 64 20 74 6f 20  ility method to 
7830: 72 75 6e 20 74 68 65 20 71 75 65 72 79 20 6f 6e  run the query on
7840: 20 74 68 65 20 64 62 20 61 6e 64 20 72 65 74 75   the db and retu
7850: 72 6e 20 74 68 65 20 76 61 6c 75 65 20 69 6e 20  rn the value in 
7860: 74 68 65 0a 20 20 20 20 20 2a 20 66 69 72 73 74  the.     * first
7870: 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66   column of the f
7880: 69 72 73 74 20 72 6f 77 2e 0a 20 20 20 20 20 2a  irst row..     *
7890: 2f 0a 20 20 20 20 70 75 62 6c 69 63 20 73 74 61  /.    public sta
78a0: 74 69 63 20 6c 6f 6e 67 20 6c 6f 6e 67 46 6f 72  tic long longFor
78b0: 51 75 65 72 79 28 53 51 4c 69 74 65 44 61 74 61  Query(SQLiteData
78c0: 62 61 73 65 20 64 62 2c 20 53 74 72 69 6e 67 20  base db, String 
78d0: 71 75 65 72 79 2c 20 53 74 72 69 6e 67 5b 5d 20  query, String[] 
78e0: 73 65 6c 65 63 74 69 6f 6e 41 72 67 73 29 20 7b  selectionArgs) {
78f0: 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 53  .        SQLiteS
7900: 74 61 74 65 6d 65 6e 74 20 70 72 6f 67 20 3d 20  tatement prog = 
7910: 64 62 2e 63 6f 6d 70 69 6c 65 53 74 61 74 65 6d  db.compileStatem
7920: 65 6e 74 28 71 75 65 72 79 29 3b 0a 20 20 20 20  ent(query);.    
7930: 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20      try {.      
7940: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c 6f 6e        return lon
7950: 67 46 6f 72 51 75 65 72 79 28 70 72 6f 67 2c 20  gForQuery(prog, 
7960: 73 65 6c 65 63 74 69 6f 6e 41 72 67 73 29 3b 0a  selectionArgs);.
7970: 20 20 20 20 20 20 20 20 7d 20 66 69 6e 61 6c 6c          } finall
7980: 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y {.            
7990: 70 72 6f 67 2e 63 6c 6f 73 65 28 29 3b 0a 20 20  prog.close();.  
79a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20        }.    }.. 
79b0: 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 55 74     /**.     * Ut
79c0: 69 6c 69 74 79 20 6d 65 74 68 6f 64 20 74 6f 20  ility method to 
79d0: 72 75 6e 20 74 68 65 20 70 72 65 2d 63 6f 6d 70  run the pre-comp
79e0: 69 6c 65 64 20 71 75 65 72 79 20 61 6e 64 20 72  iled query and r
79f0: 65 74 75 72 6e 20 74 68 65 20 76 61 6c 75 65 20  eturn the value 
7a00: 69 6e 20 74 68 65 0a 20 20 20 20 20 2a 20 66 69  in the.     * fi
7a10: 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  rst column of th
7a20: 65 20 66 69 72 73 74 20 72 6f 77 2e 0a 20 20 20  e first row..   
7a30: 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20    */.    public 
7a40: 73 74 61 74 69 63 20 6c 6f 6e 67 20 6c 6f 6e 67  static long long
7a50: 46 6f 72 51 75 65 72 79 28 53 51 4c 69 74 65 53  ForQuery(SQLiteS
7a60: 74 61 74 65 6d 65 6e 74 20 70 72 6f 67 2c 20 53  tatement prog, S
7a70: 74 72 69 6e 67 5b 5d 20 73 65 6c 65 63 74 69 6f  tring[] selectio
7a80: 6e 41 72 67 73 29 20 7b 0a 20 20 20 20 20 20 20  nArgs) {.       
7a90: 20 70 72 6f 67 2e 62 69 6e 64 41 6c 6c 41 72 67   prog.bindAllArg
7aa0: 73 41 73 53 74 72 69 6e 67 73 28 73 65 6c 65 63  sAsStrings(selec
7ab0: 74 69 6f 6e 41 72 67 73 29 3b 0a 20 20 20 20 20  tionArgs);.     
7ac0: 20 20 20 72 65 74 75 72 6e 20 70 72 6f 67 2e 73     return prog.s
7ad0: 69 6d 70 6c 65 51 75 65 72 79 46 6f 72 4c 6f 6e  impleQueryForLon
7ae0: 67 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  g();.    }..    
7af0: 2f 2a 2a 0a 20 20 20 20 20 2a 20 55 74 69 6c 69  /**.     * Utili
7b00: 74 79 20 6d 65 74 68 6f 64 20 74 6f 20 72 75 6e  ty method to run
7b10: 20 74 68 65 20 71 75 65 72 79 20 6f 6e 20 74 68   the query on th
7b20: 65 20 64 62 20 61 6e 64 20 72 65 74 75 72 6e 20  e db and return 
7b30: 74 68 65 20 76 61 6c 75 65 20 69 6e 20 74 68 65  the value in the
7b40: 0a 20 20 20 20 20 2a 20 66 69 72 73 74 20 63 6f  .     * first co
7b50: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 69 72 73  lumn of the firs
7b60: 74 20 72 6f 77 2e 0a 20 20 20 20 20 2a 2f 0a 20  t row..     */. 
7b70: 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63     public static
7b80: 20 53 74 72 69 6e 67 20 73 74 72 69 6e 67 46 6f   String stringFo
7b90: 72 51 75 65 72 79 28 53 51 4c 69 74 65 44 61 74  rQuery(SQLiteDat
7ba0: 61 62 61 73 65 20 64 62 2c 20 53 74 72 69 6e 67  abase db, String
7bb0: 20 71 75 65 72 79 2c 20 53 74 72 69 6e 67 5b 5d   query, String[]
7bc0: 20 73 65 6c 65 63 74 69 6f 6e 41 72 67 73 29 20   selectionArgs) 
7bd0: 7b 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74 65  {.        SQLite
7be0: 53 74 61 74 65 6d 65 6e 74 20 70 72 6f 67 20 3d  Statement prog =
7bf0: 20 64 62 2e 63 6f 6d 70 69 6c 65 53 74 61 74 65   db.compileState
7c00: 6d 65 6e 74 28 71 75 65 72 79 29 3b 0a 20 20 20  ment(query);.   
7c10: 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20       try {.     
7c20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 74         return st
7c30: 72 69 6e 67 46 6f 72 51 75 65 72 79 28 70 72 6f  ringForQuery(pro
7c40: 67 2c 20 73 65 6c 65 63 74 69 6f 6e 41 72 67 73  g, selectionArgs
7c50: 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 66 69 6e  );.        } fin
7c60: 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20 20 20  ally {.         
7c70: 20 20 20 70 72 6f 67 2e 63 6c 6f 73 65 28 29 3b     prog.close();
7c80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
7c90: 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a  ..    /**.     *
7ca0: 20 55 74 69 6c 69 74 79 20 6d 65 74 68 6f 64 20   Utility method 
7cb0: 74 6f 20 72 75 6e 20 74 68 65 20 70 72 65 2d 63  to run the pre-c
7cc0: 6f 6d 70 69 6c 65 64 20 71 75 65 72 79 20 61 6e  ompiled query an
7cd0: 64 20 72 65 74 75 72 6e 20 74 68 65 20 76 61 6c  d return the val
7ce0: 75 65 20 69 6e 20 74 68 65 0a 20 20 20 20 20 2a  ue in the.     *
7cf0: 20 66 69 72 73 74 20 63 6f 6c 75 6d 6e 20 6f 66   first column of
7d00: 20 74 68 65 20 66 69 72 73 74 20 72 6f 77 2e 0a   the first row..
7d10: 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c       */.    publ
7d20: 69 63 20 73 74 61 74 69 63 20 53 74 72 69 6e 67  ic static String
7d30: 20 73 74 72 69 6e 67 46 6f 72 51 75 65 72 79 28   stringForQuery(
7d40: 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20  SQLiteStatement 
7d50: 70 72 6f 67 2c 20 53 74 72 69 6e 67 5b 5d 20 73  prog, String[] s
7d60: 65 6c 65 63 74 69 6f 6e 41 72 67 73 29 20 7b 0a  electionArgs) {.
7d70: 20 20 20 20 20 20 20 20 70 72 6f 67 2e 62 69 6e          prog.bin
7d80: 64 41 6c 6c 41 72 67 73 41 73 53 74 72 69 6e 67  dAllArgsAsString
7d90: 73 28 73 65 6c 65 63 74 69 6f 6e 41 72 67 73 29  s(selectionArgs)
7da0: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
7db0: 20 70 72 6f 67 2e 73 69 6d 70 6c 65 51 75 65 72   prog.simpleQuer
7dc0: 79 46 6f 72 53 74 72 69 6e 67 28 29 3b 0a 20 20  yForString();.  
7dd0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20    }..    /**.   
7de0: 20 20 2a 20 55 74 69 6c 69 74 79 20 6d 65 74 68    * Utility meth
7df0: 6f 64 20 74 6f 20 72 75 6e 20 74 68 65 20 71 75  od to run the qu
7e00: 65 72 79 20 6f 6e 20 74 68 65 20 64 62 20 61 6e  ery on the db an
7e10: 64 20 72 65 74 75 72 6e 20 74 68 65 20 62 6c 6f  d return the blo
7e20: 62 20 76 61 6c 75 65 20 69 6e 20 74 68 65 0a 20  b value in the. 
7e30: 20 20 20 20 2a 20 66 69 72 73 74 20 63 6f 6c 75      * first colu
7e40: 6d 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  mn of the first 
7e50: 72 6f 77 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20  row..     *.    
7e60: 20 2a 20 40 72 65 74 75 72 6e 20 41 20 72 65 61   * @return A rea
7e70: 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 64 65 73 63  d-only file desc
7e80: 72 69 70 74 6f 72 20 66 6f 72 20 61 20 63 6f 70  riptor for a cop
7e90: 79 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 76 61  y of the blob va
7ea0: 6c 75 65 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  lue..     */.   
7eb0: 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20 50   public static P
7ec0: 61 72 63 65 6c 46 69 6c 65 44 65 73 63 72 69 70  arcelFileDescrip
7ed0: 74 6f 72 20 62 6c 6f 62 46 69 6c 65 44 65 73 63  tor blobFileDesc
7ee0: 72 69 70 74 6f 72 46 6f 72 51 75 65 72 79 28 53  riptorForQuery(S
7ef0: 51 4c 69 74 65 44 61 74 61 62 61 73 65 20 64 62  QLiteDatabase db
7f00: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 53 74  ,.            St
7f10: 72 69 6e 67 20 71 75 65 72 79 2c 20 53 74 72 69  ring query, Stri
7f20: 6e 67 5b 5d 20 73 65 6c 65 63 74 69 6f 6e 41 72  ng[] selectionAr
7f30: 67 73 29 20 7b 0a 20 20 20 20 20 20 20 20 53 51  gs) {.        SQ
7f40: 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 70 72  LiteStatement pr
7f50: 6f 67 20 3d 20 64 62 2e 63 6f 6d 70 69 6c 65 53  og = db.compileS
7f60: 74 61 74 65 6d 65 6e 74 28 71 75 65 72 79 29 3b  tatement(query);
7f70: 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20  .        try {. 
7f80: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
7f90: 6e 20 62 6c 6f 62 46 69 6c 65 44 65 73 63 72 69  n blobFileDescri
7fa0: 70 74 6f 72 46 6f 72 51 75 65 72 79 28 70 72 6f  ptorForQuery(pro
7fb0: 67 2c 20 73 65 6c 65 63 74 69 6f 6e 41 72 67 73  g, selectionArgs
7fc0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 66 69 6e  );.        } fin
7fd0: 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20 20 20  ally {.         
7fe0: 20 20 20 70 72 6f 67 2e 63 6c 6f 73 65 28 29 3b     prog.close();
7ff0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
8000: 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a  ..    /**.     *
8010: 20 55 74 69 6c 69 74 79 20 6d 65 74 68 6f 64 20   Utility method 
8020: 74 6f 20 72 75 6e 20 74 68 65 20 70 72 65 2d 63  to run the pre-c
8030: 6f 6d 70 69 6c 65 64 20 71 75 65 72 79 20 61 6e  ompiled query an
8040: 64 20 72 65 74 75 72 6e 20 74 68 65 20 62 6c 6f  d return the blo
8050: 62 20 76 61 6c 75 65 20 69 6e 20 74 68 65 0a 20  b value in the. 
8060: 20 20 20 20 2a 20 66 69 72 73 74 20 63 6f 6c 75      * first colu
8070: 6d 6e 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  mn of the first 
8080: 72 6f 77 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20  row..     *.    
8090: 20 2a 20 40 72 65 74 75 72 6e 20 41 20 72 65 61   * @return A rea
80a0: 64 2d 6f 6e 6c 79 20 66 69 6c 65 20 64 65 73 63  d-only file desc
80b0: 72 69 70 74 6f 72 20 66 6f 72 20 61 20 63 6f 70  riptor for a cop
80c0: 79 20 6f 66 20 74 68 65 20 62 6c 6f 62 20 76 61  y of the blob va
80d0: 6c 75 65 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20  lue..     */.   
80e0: 20 70 75 62 6c 69 63 20 73 74 61 74 69 63 20 50   public static P
80f0: 61 72 63 65 6c 46 69 6c 65 44 65 73 63 72 69 70  arcelFileDescrip
8100: 74 6f 72 20 62 6c 6f 62 46 69 6c 65 44 65 73 63  tor blobFileDesc
8110: 72 69 70 74 6f 72 46 6f 72 51 75 65 72 79 28 53  riptorForQuery(S
8120: 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 70  QLiteStatement p
8130: 72 6f 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rog,.           
8140: 20 53 74 72 69 6e 67 5b 5d 20 73 65 6c 65 63 74   String[] select
8150: 69 6f 6e 41 72 67 73 29 20 7b 0a 20 20 20 20 20  ionArgs) {.     
8160: 20 20 20 70 72 6f 67 2e 62 69 6e 64 41 6c 6c 41     prog.bindAllA
8170: 72 67 73 41 73 53 74 72 69 6e 67 73 28 73 65 6c  rgsAsStrings(sel
8180: 65 63 74 69 6f 6e 41 72 67 73 29 3b 0a 20 20 20  ectionArgs);.   
8190: 20 20 20 20 20 72 65 74 75 72 6e 20 70 72 6f 67       return prog
81a0: 2e 73 69 6d 70 6c 65 51 75 65 72 79 46 6f 72 42  .simpleQueryForB
81b0: 6c 6f 62 46 69 6c 65 44 65 73 63 72 69 70 74 6f  lobFileDescripto
81c0: 72 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  r();.    }..    
81d0: 2f 2a 2a 0a 20 20 20 20 20 2a 20 52 65 61 64 73  /**.     * Reads
81e0: 20 61 20 53 74 72 69 6e 67 20 6f 75 74 20 6f 66   a String out of
81f0: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 43   a column in a C
8200: 75 72 73 6f 72 20 61 6e 64 20 77 72 69 74 65 73  ursor and writes
8210: 20 69 74 20 74 6f 20 61 20 43 6f 6e 74 65 6e 74   it to a Content
8220: 56 61 6c 75 65 73 2e 0a 20 20 20 20 20 2a 20 41  Values..     * A
8230: 64 64 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74  dds nothing to t
8240: 68 65 20 43 6f 6e 74 65 6e 74 56 61 6c 75 65 73  he ContentValues
8250: 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   if the column i
8260: 73 6e 27 74 20 70 72 65 73 65 6e 74 20 6f 72 20  sn't present or 
8270: 69 66 20 69 74 73 20 76 61 6c 75 65 20 69 73 20  if its value is 
8280: 6e 75 6c 6c 2e 0a 20 20 20 20 20 2a 0a 20 20 20  null..     *.   
8290: 20 20 2a 20 40 70 61 72 61 6d 20 63 75 72 73 6f    * @param curso
82a0: 72 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  r The cursor to 
82b0: 72 65 61 64 20 66 72 6f 6d 0a 20 20 20 20 20 2a  read from.     *
82c0: 20 40 70 61 72 61 6d 20 63 6f 6c 75 6d 6e 20 54   @param column T
82d0: 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 72 65 61  he column to rea
82e0: 64 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20  d.     * @param 
82f0: 76 61 6c 75 65 73 20 54 68 65 20 7b 40 6c 69 6e  values The {@lin
8300: 6b 20 43 6f 6e 74 65 6e 74 56 61 6c 75 65 73 7d  k ContentValues}
8310: 20 74 6f 20 70 75 74 20 74 68 65 20 76 61 6c 75   to put the valu
8320: 65 20 69 6e 74 6f 0a 20 20 20 20 20 2a 2f 0a 20  e into.     */. 
8330: 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63     public static
8340: 20 76 6f 69 64 20 63 75 72 73 6f 72 53 74 72 69   void cursorStri
8350: 6e 67 54 6f 43 6f 6e 74 65 6e 74 56 61 6c 75 65  ngToContentValue
8360: 73 49 66 50 72 65 73 65 6e 74 28 43 75 72 73 6f  sIfPresent(Curso
8370: 72 20 63 75 72 73 6f 72 2c 20 43 6f 6e 74 65 6e  r cursor, Conten
8380: 74 56 61 6c 75 65 73 20 76 61 6c 75 65 73 2c 0a  tValues values,.
8390: 20 20 20 20 20 20 20 20 20 20 20 20 53 74 72 69              Stri
83a0: 6e 67 20 63 6f 6c 75 6d 6e 29 20 7b 0a 20 20 20  ng column) {.   
83b0: 20 20 20 20 20 66 69 6e 61 6c 20 69 6e 74 20 69       final int i
83c0: 6e 64 65 78 20 3d 20 63 75 72 73 6f 72 2e 67 65  ndex = cursor.ge
83d0: 74 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 63 6f 6c  tColumnIndex(col
83e0: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  umn);.        if
83f0: 20 28 69 6e 64 65 78 20 21 3d 20 2d 31 20 26 26   (index != -1 &&
8400: 20 21 63 75 72 73 6f 72 2e 69 73 4e 75 6c 6c 28   !cursor.isNull(
8410: 69 6e 64 65 78 29 29 20 7b 0a 20 20 20 20 20 20  index)) {.      
8420: 20 20 20 20 20 20 76 61 6c 75 65 73 2e 70 75 74        values.put
8430: 28 63 6f 6c 75 6d 6e 2c 20 63 75 72 73 6f 72 2e  (column, cursor.
8440: 67 65 74 53 74 72 69 6e 67 28 69 6e 64 65 78 29  getString(index)
8450: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
8460: 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20   }..    /**.    
8470: 20 2a 20 52 65 61 64 73 20 61 20 4c 6f 6e 67 20   * Reads a Long 
8480: 6f 75 74 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  out of a column 
8490: 69 6e 20 61 20 43 75 72 73 6f 72 20 61 6e 64 20  in a Cursor and 
84a0: 77 72 69 74 65 73 20 69 74 20 74 6f 20 61 20 43  writes it to a C
84b0: 6f 6e 74 65 6e 74 56 61 6c 75 65 73 2e 0a 20 20  ontentValues..  
84c0: 20 20 20 2a 20 41 64 64 73 20 6e 6f 74 68 69 6e     * Adds nothin
84d0: 67 20 74 6f 20 74 68 65 20 43 6f 6e 74 65 6e 74  g to the Content
84e0: 56 61 6c 75 65 73 20 69 66 20 74 68 65 20 63 6f  Values if the co
84f0: 6c 75 6d 6e 20 69 73 6e 27 74 20 70 72 65 73 65  lumn isn't prese
8500: 6e 74 20 6f 72 20 69 66 20 69 74 73 20 76 61 6c  nt or if its val
8510: 75 65 20 69 73 20 6e 75 6c 6c 2e 0a 20 20 20 20  ue is null..    
8520: 20 2a 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d   *.     * @param
8530: 20 63 75 72 73 6f 72 20 54 68 65 20 63 75 72 73   cursor The curs
8540: 6f 72 20 74 6f 20 72 65 61 64 20 66 72 6f 6d 0a  or to read from.
8550: 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 63 6f       * @param co
8560: 6c 75 6d 6e 20 54 68 65 20 63 6f 6c 75 6d 6e 20  lumn The column 
8570: 74 6f 20 72 65 61 64 0a 20 20 20 20 20 2a 20 40  to read.     * @
8580: 70 61 72 61 6d 20 76 61 6c 75 65 73 20 54 68 65  param values The
8590: 20 7b 40 6c 69 6e 6b 20 43 6f 6e 74 65 6e 74 56   {@link ContentV
85a0: 61 6c 75 65 73 7d 20 74 6f 20 70 75 74 20 74 68  alues} to put th
85b0: 65 20 76 61 6c 75 65 20 69 6e 74 6f 0a 20 20 20  e value into.   
85c0: 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63 20    */.    public 
85d0: 73 74 61 74 69 63 20 76 6f 69 64 20 63 75 72 73  static void curs
85e0: 6f 72 4c 6f 6e 67 54 6f 43 6f 6e 74 65 6e 74 56  orLongToContentV
85f0: 61 6c 75 65 73 49 66 50 72 65 73 65 6e 74 28 43  aluesIfPresent(C
8600: 75 72 73 6f 72 20 63 75 72 73 6f 72 2c 20 43 6f  ursor cursor, Co
8610: 6e 74 65 6e 74 56 61 6c 75 65 73 20 76 61 6c 75  ntentValues valu
8620: 65 73 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  es,.            
8630: 53 74 72 69 6e 67 20 63 6f 6c 75 6d 6e 29 20 7b  String column) {
8640: 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20 69  .        final i
8650: 6e 74 20 69 6e 64 65 78 20 3d 20 63 75 72 73 6f  nt index = curso
8660: 72 2e 67 65 74 43 6f 6c 75 6d 6e 49 6e 64 65 78  r.getColumnIndex
8670: 28 63 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  (column);.      
8680: 20 20 69 66 20 28 69 6e 64 65 78 20 21 3d 20 2d    if (index != -
8690: 31 20 26 26 20 21 63 75 72 73 6f 72 2e 69 73 4e  1 && !cursor.isN
86a0: 75 6c 6c 28 69 6e 64 65 78 29 29 20 7b 0a 20 20  ull(index)) {.  
86b0: 20 20 20 20 20 20 20 20 20 20 76 61 6c 75 65 73            values
86c0: 2e 70 75 74 28 63 6f 6c 75 6d 6e 2c 20 63 75 72  .put(column, cur
86d0: 73 6f 72 2e 67 65 74 4c 6f 6e 67 28 69 6e 64 65  sor.getLong(inde
86e0: 78 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  x));.        }. 
86f0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20     }..    /**.  
8700: 20 20 20 2a 20 52 65 61 64 73 20 61 20 53 68 6f     * Reads a Sho
8710: 72 74 20 6f 75 74 20 6f 66 20 61 20 63 6f 6c 75  rt out of a colu
8720: 6d 6e 20 69 6e 20 61 20 43 75 72 73 6f 72 20 61  mn in a Cursor a
8730: 6e 64 20 77 72 69 74 65 73 20 69 74 20 74 6f 20  nd writes it to 
8740: 61 20 43 6f 6e 74 65 6e 74 56 61 6c 75 65 73 2e  a ContentValues.
8750: 0a 20 20 20 20 20 2a 20 41 64 64 73 20 6e 6f 74  .     * Adds not
8760: 68 69 6e 67 20 74 6f 20 74 68 65 20 43 6f 6e 74  hing to the Cont
8770: 65 6e 74 56 61 6c 75 65 73 20 69 66 20 74 68 65  entValues if the
8780: 20 63 6f 6c 75 6d 6e 20 69 73 6e 27 74 20 70 72   column isn't pr
8790: 65 73 65 6e 74 20 6f 72 20 69 66 20 69 74 73 20  esent or if its 
87a0: 76 61 6c 75 65 20 69 73 20 6e 75 6c 6c 2e 0a 20  value is null.. 
87b0: 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 70 61      *.     * @pa
87c0: 72 61 6d 20 63 75 72 73 6f 72 20 54 68 65 20 63  ram cursor The c
87d0: 75 72 73 6f 72 20 74 6f 20 72 65 61 64 20 66 72  ursor to read fr
87e0: 6f 6d 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d  om.     * @param
87f0: 20 63 6f 6c 75 6d 6e 20 54 68 65 20 63 6f 6c 75   column The colu
8800: 6d 6e 20 74 6f 20 72 65 61 64 0a 20 20 20 20 20  mn to read.     
8810: 2a 20 40 70 61 72 61 6d 20 76 61 6c 75 65 73 20  * @param values 
8820: 54 68 65 20 7b 40 6c 69 6e 6b 20 43 6f 6e 74 65  The {@link Conte
8830: 6e 74 56 61 6c 75 65 73 7d 20 74 6f 20 70 75 74  ntValues} to put
8840: 20 74 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 0a   the value into.
8850: 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c       */.    publ
8860: 69 63 20 73 74 61 74 69 63 20 76 6f 69 64 20 63  ic static void c
8870: 75 72 73 6f 72 53 68 6f 72 74 54 6f 43 6f 6e 74  ursorShortToCont
8880: 65 6e 74 56 61 6c 75 65 73 49 66 50 72 65 73 65  entValuesIfPrese
8890: 6e 74 28 43 75 72 73 6f 72 20 63 75 72 73 6f 72  nt(Cursor cursor
88a0: 2c 20 43 6f 6e 74 65 6e 74 56 61 6c 75 65 73 20  , ContentValues 
88b0: 76 61 6c 75 65 73 2c 0a 20 20 20 20 20 20 20 20  values,.        
88c0: 20 20 20 20 53 74 72 69 6e 67 20 63 6f 6c 75 6d      String colum
88d0: 6e 29 20 7b 0a 20 20 20 20 20 20 20 20 66 69 6e  n) {.        fin
88e0: 61 6c 20 69 6e 74 20 69 6e 64 65 78 20 3d 20 63  al int index = c
88f0: 75 72 73 6f 72 2e 67 65 74 43 6f 6c 75 6d 6e 49  ursor.getColumnI
8900: 6e 64 65 78 28 63 6f 6c 75 6d 6e 29 3b 0a 20 20  ndex(column);.  
8910: 20 20 20 20 20 20 69 66 20 28 69 6e 64 65 78 20        if (index 
8920: 21 3d 20 2d 31 20 26 26 20 21 63 75 72 73 6f 72  != -1 && !cursor
8930: 2e 69 73 4e 75 6c 6c 28 69 6e 64 65 78 29 29 20  .isNull(index)) 
8940: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 61  {.            va
8950: 6c 75 65 73 2e 70 75 74 28 63 6f 6c 75 6d 6e 2c  lues.put(column,
8960: 20 63 75 72 73 6f 72 2e 67 65 74 53 68 6f 72 74   cursor.getShort
8970: 28 69 6e 64 65 78 29 29 3b 0a 20 20 20 20 20 20  (index));.      
8980: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
8990: 2a 2a 0a 20 20 20 20 20 2a 20 52 65 61 64 73 20  **.     * Reads 
89a0: 61 20 49 6e 74 65 67 65 72 20 6f 75 74 20 6f 66  a Integer out of
89b0: 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20 43   a column in a C
89c0: 75 72 73 6f 72 20 61 6e 64 20 77 72 69 74 65 73  ursor and writes
89d0: 20 69 74 20 74 6f 20 61 20 43 6f 6e 74 65 6e 74   it to a Content
89e0: 56 61 6c 75 65 73 2e 0a 20 20 20 20 20 2a 20 41  Values..     * A
89f0: 64 64 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20 74  dds nothing to t
8a00: 68 65 20 43 6f 6e 74 65 6e 74 56 61 6c 75 65 73  he ContentValues
8a10: 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69   if the column i
8a20: 73 6e 27 74 20 70 72 65 73 65 6e 74 20 6f 72 20  sn't present or 
8a30: 69 66 20 69 74 73 20 76 61 6c 75 65 20 69 73 20  if its value is 
8a40: 6e 75 6c 6c 2e 0a 20 20 20 20 20 2a 0a 20 20 20  null..     *.   
8a50: 20 20 2a 20 40 70 61 72 61 6d 20 63 75 72 73 6f    * @param curso
8a60: 72 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f 20  r The cursor to 
8a70: 72 65 61 64 20 66 72 6f 6d 0a 20 20 20 20 20 2a  read from.     *
8a80: 20 40 70 61 72 61 6d 20 63 6f 6c 75 6d 6e 20 54   @param column T
8a90: 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 72 65 61  he column to rea
8aa0: 64 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20  d.     * @param 
8ab0: 76 61 6c 75 65 73 20 54 68 65 20 7b 40 6c 69 6e  values The {@lin
8ac0: 6b 20 43 6f 6e 74 65 6e 74 56 61 6c 75 65 73 7d  k ContentValues}
8ad0: 20 74 6f 20 70 75 74 20 74 68 65 20 76 61 6c 75   to put the valu
8ae0: 65 20 69 6e 74 6f 0a 20 20 20 20 20 2a 2f 0a 20  e into.     */. 
8af0: 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69 63     public static
8b00: 20 76 6f 69 64 20 63 75 72 73 6f 72 49 6e 74 54   void cursorIntT
8b10: 6f 43 6f 6e 74 65 6e 74 56 61 6c 75 65 73 49 66  oContentValuesIf
8b20: 50 72 65 73 65 6e 74 28 43 75 72 73 6f 72 20 63  Present(Cursor c
8b30: 75 72 73 6f 72 2c 20 43 6f 6e 74 65 6e 74 56 61  ursor, ContentVa
8b40: 6c 75 65 73 20 76 61 6c 75 65 73 2c 0a 20 20 20  lues values,.   
8b50: 20 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 20           String 
8b60: 63 6f 6c 75 6d 6e 29 20 7b 0a 20 20 20 20 20 20  column) {.      
8b70: 20 20 66 69 6e 61 6c 20 69 6e 74 20 69 6e 64 65    final int inde
8b80: 78 20 3d 20 63 75 72 73 6f 72 2e 67 65 74 43 6f  x = cursor.getCo
8b90: 6c 75 6d 6e 49 6e 64 65 78 28 63 6f 6c 75 6d 6e  lumnIndex(column
8ba0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20 28 69  );.        if (i
8bb0: 6e 64 65 78 20 21 3d 20 2d 31 20 26 26 20 21 63  ndex != -1 && !c
8bc0: 75 72 73 6f 72 2e 69 73 4e 75 6c 6c 28 69 6e 64  ursor.isNull(ind
8bd0: 65 78 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ex)) {.         
8be0: 20 20 20 76 61 6c 75 65 73 2e 70 75 74 28 63 6f     values.put(co
8bf0: 6c 75 6d 6e 2c 20 63 75 72 73 6f 72 2e 67 65 74  lumn, cursor.get
8c00: 49 6e 74 28 69 6e 64 65 78 29 29 3b 0a 20 20 20  Int(index));.   
8c10: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
8c20: 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 52 65 61    /**.     * Rea
8c30: 64 73 20 61 20 46 6c 6f 61 74 20 6f 75 74 20 6f  ds a Float out o
8c40: 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 61 20  f a column in a 
8c50: 43 75 72 73 6f 72 20 61 6e 64 20 77 72 69 74 65  Cursor and write
8c60: 73 20 69 74 20 74 6f 20 61 20 43 6f 6e 74 65 6e  s it to a Conten
8c70: 74 56 61 6c 75 65 73 2e 0a 20 20 20 20 20 2a 20  tValues..     * 
8c80: 41 64 64 73 20 6e 6f 74 68 69 6e 67 20 74 6f 20  Adds nothing to 
8c90: 74 68 65 20 43 6f 6e 74 65 6e 74 56 61 6c 75 65  the ContentValue
8ca0: 73 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  s if the column 
8cb0: 69 73 6e 27 74 20 70 72 65 73 65 6e 74 20 6f 72  isn't present or
8cc0: 20 69 66 20 69 74 73 20 76 61 6c 75 65 20 69 73   if its value is
8cd0: 20 6e 75 6c 6c 2e 0a 20 20 20 20 20 2a 0a 20 20   null..     *.  
8ce0: 20 20 20 2a 20 40 70 61 72 61 6d 20 63 75 72 73     * @param curs
8cf0: 6f 72 20 54 68 65 20 63 75 72 73 6f 72 20 74 6f  or The cursor to
8d00: 20 72 65 61 64 20 66 72 6f 6d 0a 20 20 20 20 20   read from.     
8d10: 2a 20 40 70 61 72 61 6d 20 63 6f 6c 75 6d 6e 20  * @param column 
8d20: 54 68 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 72 65  The column to re
8d30: 61 64 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d  ad.     * @param
8d40: 20 76 61 6c 75 65 73 20 54 68 65 20 7b 40 6c 69   values The {@li
8d50: 6e 6b 20 43 6f 6e 74 65 6e 74 56 61 6c 75 65 73  nk ContentValues
8d60: 7d 20 74 6f 20 70 75 74 20 74 68 65 20 76 61 6c  } to put the val
8d70: 75 65 20 69 6e 74 6f 0a 20 20 20 20 20 2a 2f 0a  ue into.     */.
8d80: 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69      public stati
8d90: 63 20 76 6f 69 64 20 63 75 72 73 6f 72 46 6c 6f  c void cursorFlo
8da0: 61 74 54 6f 43 6f 6e 74 65 6e 74 56 61 6c 75 65  atToContentValue
8db0: 73 49 66 50 72 65 73 65 6e 74 28 43 75 72 73 6f  sIfPresent(Curso
8dc0: 72 20 63 75 72 73 6f 72 2c 20 43 6f 6e 74 65 6e  r cursor, Conten
8dd0: 74 56 61 6c 75 65 73 20 76 61 6c 75 65 73 2c 0a  tValues values,.
8de0: 20 20 20 20 20 20 20 20 20 20 20 20 53 74 72 69              Stri
8df0: 6e 67 20 63 6f 6c 75 6d 6e 29 20 7b 0a 20 20 20  ng column) {.   
8e00: 20 20 20 20 20 66 69 6e 61 6c 20 69 6e 74 20 69       final int i
8e10: 6e 64 65 78 20 3d 20 63 75 72 73 6f 72 2e 67 65  ndex = cursor.ge
8e20: 74 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 63 6f 6c  tColumnIndex(col
8e30: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 69 66  umn);.        if
8e40: 20 28 69 6e 64 65 78 20 21 3d 20 2d 31 20 26 26   (index != -1 &&
8e50: 20 21 63 75 72 73 6f 72 2e 69 73 4e 75 6c 6c 28   !cursor.isNull(
8e60: 69 6e 64 65 78 29 29 20 7b 0a 20 20 20 20 20 20  index)) {.      
8e70: 20 20 20 20 20 20 76 61 6c 75 65 73 2e 70 75 74        values.put
8e80: 28 63 6f 6c 75 6d 6e 2c 20 63 75 72 73 6f 72 2e  (column, cursor.
8e90: 67 65 74 46 6c 6f 61 74 28 69 6e 64 65 78 29 29  getFloat(index))
8ea0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8eb0: 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20  }..    /**.     
8ec0: 2a 20 52 65 61 64 73 20 61 20 44 6f 75 62 6c 65  * Reads a Double
8ed0: 20 6f 75 74 20 6f 66 20 61 20 63 6f 6c 75 6d 6e   out of a column
8ee0: 20 69 6e 20 61 20 43 75 72 73 6f 72 20 61 6e 64   in a Cursor and
8ef0: 20 77 72 69 74 65 73 20 69 74 20 74 6f 20 61 20   writes it to a 
8f00: 43 6f 6e 74 65 6e 74 56 61 6c 75 65 73 2e 0a 20  ContentValues.. 
8f10: 20 20 20 20 2a 20 41 64 64 73 20 6e 6f 74 68 69      * Adds nothi
8f20: 6e 67 20 74 6f 20 74 68 65 20 43 6f 6e 74 65 6e  ng to the Conten
8f30: 74 56 61 6c 75 65 73 20 69 66 20 74 68 65 20 63  tValues if the c
8f40: 6f 6c 75 6d 6e 20 69 73 6e 27 74 20 70 72 65 73  olumn isn't pres
8f50: 65 6e 74 20 6f 72 20 69 66 20 69 74 73 20 76 61  ent or if its va
8f60: 6c 75 65 20 69 73 20 6e 75 6c 6c 2e 0a 20 20 20  lue is null..   
8f70: 20 20 2a 0a 20 20 20 20 20 2a 20 40 70 61 72 61    *.     * @para
8f80: 6d 20 63 75 72 73 6f 72 20 54 68 65 20 63 75 72  m cursor The cur
8f90: 73 6f 72 20 74 6f 20 72 65 61 64 20 66 72 6f 6d  sor to read from
8fa0: 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 63  .     * @param c
8fb0: 6f 6c 75 6d 6e 20 54 68 65 20 63 6f 6c 75 6d 6e  olumn The column
8fc0: 20 74 6f 20 72 65 61 64 0a 20 20 20 20 20 2a 20   to read.     * 
8fd0: 40 70 61 72 61 6d 20 76 61 6c 75 65 73 20 54 68  @param values Th
8fe0: 65 20 7b 40 6c 69 6e 6b 20 43 6f 6e 74 65 6e 74  e {@link Content
8ff0: 56 61 6c 75 65 73 7d 20 74 6f 20 70 75 74 20 74  Values} to put t
9000: 68 65 20 76 61 6c 75 65 20 69 6e 74 6f 0a 20 20  he value into.  
9010: 20 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63     */.    public
9020: 20 73 74 61 74 69 63 20 76 6f 69 64 20 63 75 72   static void cur
9030: 73 6f 72 44 6f 75 62 6c 65 54 6f 43 6f 6e 74 65  sorDoubleToConte
9040: 6e 74 56 61 6c 75 65 73 49 66 50 72 65 73 65 6e  ntValuesIfPresen
9050: 74 28 43 75 72 73 6f 72 20 63 75 72 73 6f 72 2c  t(Cursor cursor,
9060: 20 43 6f 6e 74 65 6e 74 56 61 6c 75 65 73 20 76   ContentValues v
9070: 61 6c 75 65 73 2c 0a 20 20 20 20 20 20 20 20 20  alues,.         
9080: 20 20 20 53 74 72 69 6e 67 20 63 6f 6c 75 6d 6e     String column
9090: 29 20 7b 0a 20 20 20 20 20 20 20 20 66 69 6e 61  ) {.        fina
90a0: 6c 20 69 6e 74 20 69 6e 64 65 78 20 3d 20 63 75  l int index = cu
90b0: 72 73 6f 72 2e 67 65 74 43 6f 6c 75 6d 6e 49 6e  rsor.getColumnIn
90c0: 64 65 78 28 63 6f 6c 75 6d 6e 29 3b 0a 20 20 20  dex(column);.   
90d0: 20 20 20 20 20 69 66 20 28 69 6e 64 65 78 20 21       if (index !
90e0: 3d 20 2d 31 20 26 26 20 21 63 75 72 73 6f 72 2e  = -1 && !cursor.
90f0: 69 73 4e 75 6c 6c 28 69 6e 64 65 78 29 29 20 7b  isNull(index)) {
9100: 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 61 6c  .            val
9110: 75 65 73 2e 70 75 74 28 63 6f 6c 75 6d 6e 2c 20  ues.put(column, 
9120: 63 75 72 73 6f 72 2e 67 65 74 44 6f 75 62 6c 65  cursor.getDouble
9130: 28 69 6e 64 65 78 29 29 3b 0a 20 20 20 20 20 20  (index));.      
9140: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
9150: 2a 2a 0a 20 20 20 20 20 2a 20 54 68 69 73 20 63  **.     * This c
9160: 6c 61 73 73 20 61 6c 6c 6f 77 73 20 75 73 65 72  lass allows user
9170: 73 20 74 6f 20 64 6f 20 6d 75 6c 74 69 70 6c 65  s to do multiple
9180: 20 69 6e 73 65 72 74 73 20 69 6e 74 6f 20 61 20   inserts into a 
9190: 74 61 62 6c 65 20 75 73 69 6e 67 0a 20 20 20 20  table using.    
91a0: 20 2a 20 74 68 65 20 73 61 6d 65 20 73 74 61 74   * the same stat
91b0: 65 6d 65 6e 74 2e 0a 20 20 20 20 20 2a 20 3c 70  ement..     * <p
91c0: 3e 0a 20 20 20 20 20 2a 20 54 68 69 73 20 63 6c  >.     * This cl
91d0: 61 73 73 20 69 73 20 6e 6f 74 20 74 68 72 65 61  ass is not threa
91e0: 64 2d 73 61 66 65 2e 0a 20 20 20 20 20 2a 20 3c  d-safe..     * <
91f0: 2f 70 3e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20  /p>.     *.     
9200: 2a 20 40 64 65 70 72 65 63 61 74 65 64 20 55 73  * @deprecated Us
9210: 65 20 7b 40 6c 69 6e 6b 20 53 51 4c 69 74 65 53  e {@link SQLiteS
9220: 74 61 74 65 6d 65 6e 74 7d 20 69 6e 73 74 65 61  tatement} instea
9230: 64 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 40  d..     */.    @
9240: 44 65 70 72 65 63 61 74 65 64 0a 20 20 20 20 70  Deprecated.    p
9250: 75 62 6c 69 63 20 73 74 61 74 69 63 20 63 6c 61  ublic static cla
9260: 73 73 20 49 6e 73 65 72 74 48 65 6c 70 65 72 20  ss InsertHelper 
9270: 7b 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74  {.        privat
9280: 65 20 66 69 6e 61 6c 20 53 51 4c 69 74 65 44 61  e final SQLiteDa
9290: 74 61 62 61 73 65 20 6d 44 62 3b 0a 20 20 20 20  tabase mDb;.    
92a0: 20 20 20 20 70 72 69 76 61 74 65 20 66 69 6e 61      private fina
92b0: 6c 20 53 74 72 69 6e 67 20 6d 54 61 62 6c 65 4e  l String mTableN
92c0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 70 72 69  ame;.        pri
92d0: 76 61 74 65 20 48 61 73 68 4d 61 70 3c 53 74 72  vate HashMap<Str
92e0: 69 6e 67 2c 20 49 6e 74 65 67 65 72 3e 20 6d 43  ing, Integer> mC
92f0: 6f 6c 75 6d 6e 73 3b 0a 20 20 20 20 20 20 20 20  olumns;.        
9300: 70 72 69 76 61 74 65 20 53 74 72 69 6e 67 20 6d  private String m
9310: 49 6e 73 65 72 74 53 51 4c 20 3d 20 6e 75 6c 6c  InsertSQL = null
9320: 3b 0a 20 20 20 20 20 20 20 20 70 72 69 76 61 74  ;.        privat
9330: 65 20 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e  e SQLiteStatemen
9340: 74 20 6d 49 6e 73 65 72 74 53 74 61 74 65 6d 65  t mInsertStateme
9350: 6e 74 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20 20  nt = null;.     
9360: 20 20 20 70 72 69 76 61 74 65 20 53 51 4c 69 74     private SQLit
9370: 65 53 74 61 74 65 6d 65 6e 74 20 6d 52 65 70 6c  eStatement mRepl
9380: 61 63 65 53 74 61 74 65 6d 65 6e 74 20 3d 20 6e  aceStatement = n
9390: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 70 72 69  ull;.        pri
93a0: 76 61 74 65 20 53 51 4c 69 74 65 53 74 61 74 65  vate SQLiteState
93b0: 6d 65 6e 74 20 6d 50 72 65 70 61 72 65 64 53 74  ment mPreparedSt
93c0: 61 74 65 6d 65 6e 74 20 3d 20 6e 75 6c 6c 3b 0a  atement = null;.
93d0: 0a 20 20 20 20 20 20 20 20 2f 2a 2a 0a 20 20 20  .        /**.   
93e0: 20 20 20 20 20 20 2a 20 7b 40 68 69 64 65 7d 0a        * {@hide}.
93f0: 20 20 20 20 20 20 20 20 20 2a 0a 20 20 20 20 20           *.     
9400: 20 20 20 20 2a 20 54 68 65 73 65 20 61 72 65 20      * These are 
9410: 74 68 65 20 63 6f 6c 75 6d 6e 73 20 72 65 74 75  the columns retu
9420: 72 6e 65 64 20 62 79 20 73 71 6c 69 74 65 27 73  rned by sqlite's
9430: 20 22 50 52 41 47 4d 41 0a 20 20 20 20 20 20 20   "PRAGMA.       
9440: 20 20 2a 20 74 61 62 6c 65 5f 69 6e 66 6f 28 2e    * table_info(.
9450: 2e 2e 29 22 20 63 6f 6d 6d 61 6e 64 20 74 68 61  ..)" command tha
9460: 74 20 77 65 20 64 65 70 65 6e 64 20 6f 6e 2e 0a  t we depend on..
9470: 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20           */.    
9480: 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74 69      public stati
9490: 63 20 66 69 6e 61 6c 20 69 6e 74 20 54 41 42 4c  c final int TABL
94a0: 45 5f 49 4e 46 4f 5f 50 52 41 47 4d 41 5f 43 4f  E_INFO_PRAGMA_CO
94b0: 4c 55 4d 4e 4e 41 4d 45 5f 49 4e 44 45 58 20 3d  LUMNNAME_INDEX =
94c0: 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 2a   1;..        /**
94d0: 0a 20 20 20 20 20 20 20 20 20 2a 20 54 68 69 73  .         * This
94e0: 20 66 69 65 6c 64 20 77 61 73 20 61 63 63 69 64   field was accid
94f0: 65 6e 74 61 6c 6c 79 20 65 78 70 6f 73 65 64 20  entally exposed 
9500: 69 6e 20 65 61 72 6c 69 65 72 20 76 65 72 73 69  in earlier versi
9510: 6f 6e 73 20 6f 66 20 74 68 65 20 70 6c 61 74 66  ons of the platf
9520: 6f 72 6d 0a 20 20 20 20 20 20 20 20 20 2a 20 73  orm.         * s
9530: 6f 20 77 65 20 63 61 6e 20 68 69 64 65 20 69 74  o we can hide it
9540: 20 62 75 74 20 77 65 20 63 61 6e 27 74 20 72 65   but we can't re
9550: 6d 6f 76 65 20 69 74 2e 0a 20 20 20 20 20 20 20  move it..       
9560: 20 20 2a 0a 20 20 20 20 20 20 20 20 20 2a 20 40    *.         * @
9570: 68 69 64 65 0a 20 20 20 20 20 20 20 20 20 2a 2f  hide.         */
9580: 0a 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20  .        public 
9590: 73 74 61 74 69 63 20 66 69 6e 61 6c 20 69 6e 74  static final int
95a0: 20 54 41 42 4c 45 5f 49 4e 46 4f 5f 50 52 41 47   TABLE_INFO_PRAG
95b0: 4d 41 5f 44 45 46 41 55 4c 54 5f 49 4e 44 45 58  MA_DEFAULT_INDEX
95c0: 20 3d 20 34 3b 0a 0a 20 20 20 20 20 20 20 20 2f   = 4;..        /
95d0: 2a 2a 0a 20 20 20 20 20 20 20 20 20 2a 20 40 70  **.         * @p
95e0: 61 72 61 6d 20 64 62 20 74 68 65 20 53 51 4c 69  aram db the SQLi
95f0: 74 65 44 61 74 61 62 61 73 65 20 74 6f 20 69 6e  teDatabase to in
9600: 73 65 72 74 20 69 6e 74 6f 0a 20 20 20 20 20 20  sert into.      
9610: 20 20 20 2a 20 40 70 61 72 61 6d 20 74 61 62 6c     * @param tabl
9620: 65 4e 61 6d 65 20 74 68 65 20 6e 61 6d 65 20 6f  eName the name o
9630: 66 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 69  f the table to i
9640: 6e 73 65 72 74 20 69 6e 74 6f 0a 20 20 20 20 20  nsert into.     
9650: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70      */.        p
9660: 75 62 6c 69 63 20 49 6e 73 65 72 74 48 65 6c 70  ublic InsertHelp
9670: 65 72 28 53 51 4c 69 74 65 44 61 74 61 62 61 73  er(SQLiteDatabas
9680: 65 20 64 62 2c 20 53 74 72 69 6e 67 20 74 61 62  e db, String tab
9690: 6c 65 4e 61 6d 65 29 20 7b 0a 20 20 20 20 20 20  leName) {.      
96a0: 20 20 20 20 20 20 6d 44 62 20 3d 20 64 62 3b 0a        mDb = db;.
96b0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 54 61 62              mTab
96c0: 6c 65 4e 61 6d 65 20 3d 20 74 61 62 6c 65 4e 61  leName = tableNa
96d0: 6d 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20  me;.        }.. 
96e0: 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20 76         private v
96f0: 6f 69 64 20 62 75 69 6c 64 53 51 4c 28 29 20 74  oid buildSQL() t
9700: 68 72 6f 77 73 20 53 51 4c 45 78 63 65 70 74 69  hrows SQLExcepti
9710: 6f 6e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  on {.           
9720: 20 53 74 72 69 6e 67 42 75 69 6c 64 65 72 20 73   StringBuilder s
9730: 62 20 3d 20 6e 65 77 20 53 74 72 69 6e 67 42 75  b = new StringBu
9740: 69 6c 64 65 72 28 31 32 38 29 3b 0a 20 20 20 20  ilder(128);.    
9750: 20 20 20 20 20 20 20 20 73 62 2e 61 70 70 65 6e          sb.appen
9760: 64 28 22 49 4e 53 45 52 54 20 49 4e 54 4f 20 22  d("INSERT INTO "
9770: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  );.            s
9780: 62 2e 61 70 70 65 6e 64 28 6d 54 61 62 6c 65 4e  b.append(mTableN
9790: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
97a0: 20 20 73 62 2e 61 70 70 65 6e 64 28 22 20 28 22    sb.append(" ("
97b0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  );..            
97c0: 53 74 72 69 6e 67 42 75 69 6c 64 65 72 20 73 62  StringBuilder sb
97d0: 76 20 3d 20 6e 65 77 20 53 74 72 69 6e 67 42 75  v = new StringBu
97e0: 69 6c 64 65 72 28 31 32 38 29 3b 0a 20 20 20 20  ilder(128);.    
97f0: 20 20 20 20 20 20 20 20 73 62 76 2e 61 70 70 65          sbv.appe
9800: 6e 64 28 22 56 41 4c 55 45 53 20 28 22 29 3b 0a  nd("VALUES (");.
9810: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74  .            int
9820: 20 69 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20   i = 1;.        
9830: 20 20 20 20 43 75 72 73 6f 72 20 63 75 72 20 3d      Cursor cur =
9840: 20 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20   null;.         
9850: 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20     try {.       
9860: 20 20 20 20 20 20 20 20 20 63 75 72 20 3d 20 6d           cur = m
9870: 44 62 2e 72 61 77 51 75 65 72 79 28 22 50 52 41  Db.rawQuery("PRA
9880: 47 4d 41 20 74 61 62 6c 65 5f 69 6e 66 6f 28 22  GMA table_info("
9890: 20 2b 20 6d 54 61 62 6c 65 4e 61 6d 65 20 2b 20   + mTableName + 
98a0: 22 29 22 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20  ")", null);.    
98b0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 43 6f 6c              mCol
98c0: 75 6d 6e 73 20 3d 20 6e 65 77 20 48 61 73 68 4d  umns = new HashM
98d0: 61 70 3c 53 74 72 69 6e 67 2c 20 49 6e 74 65 67  ap<String, Integ
98e0: 65 72 3e 28 63 75 72 2e 67 65 74 43 6f 75 6e 74  er>(cur.getCount
98f0: 28 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ());.           
9900: 20 20 20 20 20 77 68 69 6c 65 20 28 63 75 72 2e       while (cur.
9910: 6d 6f 76 65 54 6f 4e 65 78 74 28 29 29 20 7b 0a  moveToNext()) {.
9920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9930: 20 20 20 20 53 74 72 69 6e 67 20 63 6f 6c 75 6d      String colum
9940: 6e 4e 61 6d 65 20 3d 20 63 75 72 2e 67 65 74 53  nName = cur.getS
9950: 74 72 69 6e 67 28 54 41 42 4c 45 5f 49 4e 46 4f  tring(TABLE_INFO
9960: 5f 50 52 41 47 4d 41 5f 43 4f 4c 55 4d 4e 4e 41  _PRAGMA_COLUMNNA
9970: 4d 45 5f 49 4e 44 45 58 29 3b 0a 20 20 20 20 20  ME_INDEX);.     
9980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 53                 S
9990: 74 72 69 6e 67 20 64 65 66 61 75 6c 74 56 61 6c  tring defaultVal
99a0: 75 65 20 3d 20 63 75 72 2e 67 65 74 53 74 72 69  ue = cur.getStri
99b0: 6e 67 28 54 41 42 4c 45 5f 49 4e 46 4f 5f 50 52  ng(TABLE_INFO_PR
99c0: 41 47 4d 41 5f 44 45 46 41 55 4c 54 5f 49 4e 44  AGMA_DEFAULT_IND
99d0: 45 58 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  EX);..          
99e0: 20 20 20 20 20 20 20 20 20 20 6d 43 6f 6c 75 6d            mColum
99f0: 6e 73 2e 70 75 74 28 63 6f 6c 75 6d 6e 4e 61 6d  ns.put(columnNam
9a00: 65 2c 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20  e, i);.         
9a10: 20 20 20 20 20 20 20 20 20 20 20 73 62 2e 61 70             sb.ap
9a20: 70 65 6e 64 28 22 27 22 29 3b 0a 20 20 20 20 20  pend("'");.     
9a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
9a40: 62 2e 61 70 70 65 6e 64 28 63 6f 6c 75 6d 6e 4e  b.append(columnN
9a50: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
9a60: 20 20 20 20 20 20 20 20 20 20 73 62 2e 61 70 70            sb.app
9a70: 65 6e 64 28 22 27 22 29 3b 0a 0a 20 20 20 20 20  end("'");..     
9a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
9a90: 66 20 28 64 65 66 61 75 6c 74 56 61 6c 75 65 20  f (defaultValue 
9aa0: 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20  == null) {.     
9ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9ac0: 20 20 20 73 62 76 2e 61 70 70 65 6e 64 28 22 3f     sbv.append("?
9ad0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
9ae0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
9af0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
9b00: 20 20 20 20 20 20 20 20 20 73 62 76 2e 61 70 70           sbv.app
9b10: 65 6e 64 28 22 43 4f 41 4c 45 53 43 45 28 3f 2c  end("COALESCE(?,
9b20: 20 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   ");.           
9b30: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 62 76               sbv
9b40: 2e 61 70 70 65 6e 64 28 64 65 66 61 75 6c 74 56  .append(defaultV
9b50: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 20  alue);.         
9b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73                 s
9b70: 62 76 2e 61 70 70 65 6e 64 28 22 29 22 29 3b 0a  bv.append(")");.
9b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9b90: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
9ba0: 20 20 20 20 20 20 20 20 20 20 20 73 62 2e 61 70             sb.ap
9bb0: 70 65 6e 64 28 69 20 3d 3d 20 63 75 72 2e 67 65  pend(i == cur.ge
9bc0: 74 43 6f 75 6e 74 28 29 20 3f 20 22 29 20 22 20  tCount() ? ") " 
9bd0: 3a 20 22 2c 20 22 29 3b 0a 20 20 20 20 20 20 20  : ", ");.       
9be0: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 62 76               sbv
9bf0: 2e 61 70 70 65 6e 64 28 69 20 3d 3d 20 63 75 72  .append(i == cur
9c00: 2e 67 65 74 43 6f 75 6e 74 28 29 20 3f 20 22 29  .getCount() ? ")
9c10: 3b 22 20 3a 20 22 2c 20 22 29 3b 0a 20 20 20 20  ;" : ", ");.    
9c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c30: 2b 2b 69 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ++i;.           
9c40: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
9c50: 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a 20     } finally {. 
9c60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
9c70: 66 20 28 63 75 72 20 21 3d 20 6e 75 6c 6c 29 20  f (cur != null) 
9c80: 63 75 72 2e 63 6c 6f 73 65 28 29 3b 0a 20 20 20  cur.close();.   
9c90: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
9ca0: 20 20 20 20 20 20 20 20 73 62 2e 61 70 70 65 6e          sb.appen
9cb0: 64 28 73 62 76 29 3b 0a 0a 20 20 20 20 20 20 20  d(sbv);..       
9cc0: 20 20 20 20 20 6d 49 6e 73 65 72 74 53 51 4c 20       mInsertSQL 
9cd0: 3d 20 73 62 2e 74 6f 53 74 72 69 6e 67 28 29 3b  = sb.toString();
9ce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
9cf0: 28 44 45 42 55 47 29 20 4c 6f 67 2e 76 28 54 41  (DEBUG) Log.v(TA
9d00: 47 2c 20 22 69 6e 73 65 72 74 20 73 74 61 74 65  G, "insert state
9d10: 6d 65 6e 74 20 69 73 20 22 20 2b 20 6d 49 6e 73  ment is " + mIns
9d20: 65 72 74 53 51 4c 29 3b 0a 20 20 20 20 20 20 20  ertSQL);.       
9d30: 20 7d 0a 0a 20 20 20 20 20 20 20 20 70 72 69 76   }..        priv
9d40: 61 74 65 20 53 51 4c 69 74 65 53 74 61 74 65 6d  ate SQLiteStatem
9d50: 65 6e 74 20 67 65 74 53 74 61 74 65 6d 65 6e 74  ent getStatement
9d60: 28 62 6f 6f 6c 65 61 6e 20 61 6c 6c 6f 77 52 65  (boolean allowRe
9d70: 70 6c 61 63 65 29 20 74 68 72 6f 77 73 20 53 51  place) throws SQ
9d80: 4c 45 78 63 65 70 74 69 6f 6e 20 7b 0a 20 20 20  LException {.   
9d90: 20 20 20 20 20 20 20 20 20 69 66 20 28 61 6c 6c           if (all
9da0: 6f 77 52 65 70 6c 61 63 65 29 20 7b 0a 20 20 20  owReplace) {.   
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20               if 
9dc0: 28 6d 52 65 70 6c 61 63 65 53 74 61 74 65 6d 65  (mReplaceStateme
9dd0: 6e 74 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20  nt == null) {.  
9de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9df0: 20 20 69 66 20 28 6d 49 6e 73 65 72 74 53 51 4c    if (mInsertSQL
9e00: 20 3d 3d 20 6e 75 6c 6c 29 20 62 75 69 6c 64 53   == null) buildS
9e10: 51 4c 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  QL();.          
9e20: 20 20 20 20 20 20 20 20 20 20 2f 2f 20 63 68 6f            // cho
9e30: 70 20 22 49 4e 53 45 52 54 22 20 6f 66 66 20 74  p "INSERT" off t
9e40: 68 65 20 66 72 6f 6e 74 20 61 6e 64 20 70 72 65  he front and pre
9e50: 70 65 6e 64 20 22 49 4e 53 45 52 54 20 4f 52 20  pend "INSERT OR 
9e60: 52 45 50 4c 41 43 45 22 20 69 6e 73 74 65 61 64  REPLACE" instead
9e70: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ..              
9e80: 20 20 20 20 20 20 53 74 72 69 6e 67 20 72 65 70        String rep
9e90: 6c 61 63 65 53 51 4c 20 3d 20 22 49 4e 53 45 52  laceSQL = "INSER
9ea0: 54 20 4f 52 20 52 45 50 4c 41 43 45 22 20 2b 20  T OR REPLACE" + 
9eb0: 6d 49 6e 73 65 72 74 53 51 4c 2e 73 75 62 73 74  mInsertSQL.subst
9ec0: 72 69 6e 67 28 36 29 3b 0a 20 20 20 20 20 20 20  ring(6);.       
9ed0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 52 65               mRe
9ee0: 70 6c 61 63 65 53 74 61 74 65 6d 65 6e 74 20 3d  placeStatement =
9ef0: 20 6d 44 62 2e 63 6f 6d 70 69 6c 65 53 74 61 74   mDb.compileStat
9f00: 65 6d 65 6e 74 28 72 65 70 6c 61 63 65 53 51 4c  ement(replaceSQL
9f10: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
9f20: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
9f30: 20 20 20 20 20 72 65 74 75 72 6e 20 6d 52 65 70       return mRep
9f40: 6c 61 63 65 53 74 61 74 65 6d 65 6e 74 3b 0a 20  laceStatement;. 
9f50: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
9f60: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
9f70: 20 20 20 20 69 66 20 28 6d 49 6e 73 65 72 74 53      if (mInsertS
9f80: 74 61 74 65 6d 65 6e 74 20 3d 3d 20 6e 75 6c 6c  tatement == null
9f90: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
9fa0: 20 20 20 20 20 20 20 20 69 66 20 28 6d 49 6e 73          if (mIns
9fb0: 65 72 74 53 51 4c 20 3d 3d 20 6e 75 6c 6c 29 20  ertSQL == null) 
9fc0: 62 75 69 6c 64 53 51 4c 28 29 3b 0a 20 20 20 20  buildSQL();.    
9fd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9fe0: 6d 49 6e 73 65 72 74 53 74 61 74 65 6d 65 6e 74  mInsertStatement
9ff0: 20 3d 20 6d 44 62 2e 63 6f 6d 70 69 6c 65 53 74   = mDb.compileSt
a000: 61 74 65 6d 65 6e 74 28 6d 49 6e 73 65 72 74 53  atement(mInsertS
a010: 51 4c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  QL);.           
a020: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
a030: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d 49         return mI
a040: 6e 73 65 72 74 53 74 61 74 65 6d 65 6e 74 3b 0a  nsertStatement;.
a050: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
a060: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
a070: 20 2f 2a 2a 0a 20 20 20 20 20 20 20 20 20 2a 20   /**.         * 
a080: 50 65 72 66 6f 72 6d 73 20 61 6e 20 69 6e 73 65  Performs an inse
a090: 72 74 2c 20 61 64 64 69 6e 67 20 61 20 6e 65 77  rt, adding a new
a0a0: 20 72 6f 77 20 77 69 74 68 20 74 68 65 20 67 69   row with the gi
a0b0: 76 65 6e 20 76 61 6c 75 65 73 2e 0a 20 20 20 20  ven values..    
a0c0: 20 20 20 20 20 2a 0a 20 20 20 20 20 20 20 20 20       *.         
a0d0: 2a 20 40 70 61 72 61 6d 20 76 61 6c 75 65 73 20  * @param values 
a0e0: 74 68 65 20 73 65 74 20 6f 66 20 76 61 6c 75 65  the set of value
a0f0: 73 20 77 69 74 68 20 77 68 69 63 68 20 20 74 6f  s with which  to
a100: 20 70 6f 70 75 6c 61 74 65 20 74 68 65 0a 20 20   populate the.  
a110: 20 20 20 20 20 20 20 2a 20 6e 65 77 20 72 6f 77         * new row
a120: 0a 20 20 20 20 20 20 20 20 20 2a 20 40 70 61 72  .         * @par
a130: 61 6d 20 61 6c 6c 6f 77 52 65 70 6c 61 63 65 20  am allowReplace 
a140: 69 66 20 74 72 75 65 2c 20 74 68 65 20 73 74 61  if true, the sta
a150: 74 65 6d 65 6e 74 20 64 6f 65 73 20 22 49 4e 53  tement does "INS
a160: 45 52 54 20 4f 52 0a 20 20 20 20 20 20 20 20 20  ERT OR.         
a170: 2a 20 20 20 52 45 50 4c 41 43 45 22 20 69 6e 73  *   REPLACE" ins
a180: 74 65 61 64 20 6f 66 20 22 49 4e 53 45 52 54 22  tead of "INSERT"
a190: 2c 20 73 69 6c 65 6e 74 6c 79 20 64 65 6c 65 74  , silently delet
a1a0: 69 6e 67 20 61 6e 79 0a 20 20 20 20 20 20 20 20  ing any.        
a1b0: 20 2a 20 20 20 70 72 65 76 69 6f 75 73 6c 79 20   *   previously 
a1c0: 65 78 69 73 74 69 6e 67 20 72 6f 77 73 20 74 68  existing rows th
a1d0: 61 74 20 77 6f 75 6c 64 20 63 61 75 73 65 20 61  at would cause a
a1e0: 20 63 6f 6e 66 6c 69 63 74 0a 20 20 20 20 20 20   conflict.      
a1f0: 20 20 20 2a 0a 20 20 20 20 20 20 20 20 20 2a 20     *.         * 
a200: 40 72 65 74 75 72 6e 20 74 68 65 20 72 6f 77 20  @return the row 
a210: 49 44 20 6f 66 20 74 68 65 20 6e 65 77 6c 79 20  ID of the newly 
a220: 69 6e 73 65 72 74 65 64 20 72 6f 77 2c 20 6f 72  inserted row, or
a230: 20 2d 31 20 69 66 20 61 6e 0a 20 20 20 20 20 20   -1 if an.      
a240: 20 20 20 2a 20 65 72 72 6f 72 20 6f 63 63 75 72     * error occur
a250: 72 65 64 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a  red.         */.
a260: 20 20 20 20 20 20 20 20 70 72 69 76 61 74 65 20          private 
a270: 6c 6f 6e 67 20 69 6e 73 65 72 74 49 6e 74 65 72  long insertInter
a280: 6e 61 6c 28 43 6f 6e 74 65 6e 74 56 61 6c 75 65  nal(ContentValue
a290: 73 20 76 61 6c 75 65 73 2c 20 62 6f 6f 6c 65 61  s values, boolea
a2a0: 6e 20 61 6c 6c 6f 77 52 65 70 6c 61 63 65 29 20  n allowReplace) 
a2b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f  {.            //
a2c0: 20 53 74 61 72 74 20 61 20 74 72 61 6e 73 61 63   Start a transac
a2d0: 74 69 6f 6e 20 65 76 65 6e 20 74 68 6f 75 67 68  tion even though
a2e0: 20 77 65 20 64 6f 6e 27 74 20 72 65 61 6c 6c 79   we don't really
a2f0: 20 6e 65 65 64 20 6f 6e 65 2e 0a 20 20 20 20 20   need one..     
a300: 20 20 20 20 20 20 20 2f 2f 20 54 68 69 73 20 69         // This i
a310: 73 20 74 6f 20 68 65 6c 70 20 6d 61 69 6e 74 61  s to help mainta
a320: 69 6e 20 63 6f 6d 70 61 74 69 62 69 6c 69 74 79  in compatibility
a330: 20 77 69 74 68 20 61 70 70 6c 69 63 61 74 69 6f   with applicatio
a340: 6e 73 20 74 68 61 74 0a 20 20 20 20 20 20 20 20  ns that.        
a350: 20 20 20 20 2f 2f 20 61 63 63 65 73 73 20 49 6e      // access In
a360: 73 65 72 74 48 65 6c 70 65 72 20 66 72 6f 6d 20  sertHelper from 
a370: 6d 75 6c 74 69 70 6c 65 20 74 68 72 65 61 64 73  multiple threads
a380: 20 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68 65   even though the
a390: 79 20 6e 65 76 65 72 20 73 68 6f 75 6c 64 20 68  y never should h
a3a0: 61 76 65 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ave..           
a3b0: 20 2f 2f 20 54 68 65 20 6f 72 69 67 69 6e 61 6c   // The original
a3c0: 20 63 6f 64 65 20 75 73 65 64 20 74 6f 20 6c 6f   code used to lo
a3d0: 63 6b 20 74 68 65 20 49 6e 73 65 72 74 48 65 6c  ck the InsertHel
a3e0: 70 65 72 20 69 74 73 65 6c 66 20 77 68 69 63 68  per itself which
a3f0: 20 77 61 73 20 70 72 6f 6e 65 0a 20 20 20 20 20   was prone.     
a400: 20 20 20 20 20 20 20 2f 2f 20 74 6f 20 64 65 61         // to dea
a410: 64 6c 6f 63 6b 73 2e 20 20 53 74 61 72 74 69 6e  dlocks.  Startin
a420: 67 20 61 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  g a transaction 
a430: 61 63 68 69 65 76 65 73 20 74 68 65 20 73 61 6d  achieves the sam
a440: 65 20 6d 75 74 75 61 6c 20 65 78 63 6c 75 73 69  e mutual exclusi
a450: 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  on.            /
a460: 2f 20 65 66 66 65 63 74 20 61 73 20 67 72 61 62  / effect as grab
a470: 62 69 6e 67 20 61 20 6c 6f 63 6b 20 62 75 74 20  bing a lock but 
a480: 77 69 74 68 6f 75 74 20 74 68 65 20 70 6f 74 65  without the pote
a490: 6e 74 69 61 6c 20 66 6f 72 20 64 65 61 64 6c 6f  ntial for deadlo
a4a0: 63 6b 73 2e 0a 20 20 20 20 20 20 20 20 20 20 20  cks..           
a4b0: 20 6d 44 62 2e 62 65 67 69 6e 54 72 61 6e 73 61   mDb.beginTransa
a4c0: 63 74 69 6f 6e 4e 6f 6e 45 78 63 6c 75 73 69 76  ctionNonExclusiv
a4d0: 65 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e();.           
a4e0: 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20   try {.         
a4f0: 20 20 20 20 20 20 20 53 51 4c 69 74 65 53 74 61         SQLiteSta
a500: 74 65 6d 65 6e 74 20 73 74 6d 74 20 3d 20 67 65  tement stmt = ge
a510: 74 53 74 61 74 65 6d 65 6e 74 28 61 6c 6c 6f 77  tStatement(allow
a520: 52 65 70 6c 61 63 65 29 3b 0a 20 20 20 20 20 20  Replace);.      
a530: 20 20 20 20 20 20 20 20 20 20 73 74 6d 74 2e 63            stmt.c
a540: 6c 65 61 72 42 69 6e 64 69 6e 67 73 28 29 3b 0a  learBindings();.
a550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a560: 69 66 20 28 44 45 42 55 47 29 20 4c 6f 67 2e 76  if (DEBUG) Log.v
a570: 28 54 41 47 2c 20 22 2d 2d 2d 20 69 6e 73 65 72  (TAG, "--- inser
a580: 74 69 6e 67 20 69 6e 20 74 61 62 6c 65 20 22 20  ting in table " 
a590: 2b 20 6d 54 61 62 6c 65 4e 61 6d 65 29 3b 0a 20  + mTableName);. 
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
a5b0: 6f 72 20 28 4d 61 70 2e 45 6e 74 72 79 3c 53 74  or (Map.Entry<St
a5c0: 72 69 6e 67 2c 20 4f 62 6a 65 63 74 3e 20 65 3a  ring, Object> e:
a5d0: 20 76 61 6c 75 65 73 2e 76 61 6c 75 65 53 65 74   values.valueSet
a5e0: 28 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ()) {.          
a5f0: 20 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20            final 
a600: 53 74 72 69 6e 67 20 6b 65 79 20 3d 20 65 2e 67  String key = e.g
a610: 65 74 4b 65 79 28 29 3b 0a 20 20 20 20 20 20 20  etKey();.       
a620: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74               int
a630: 20 69 20 3d 20 67 65 74 43 6f 6c 75 6d 6e 49 6e   i = getColumnIn
a640: 64 65 78 28 6b 65 79 29 3b 0a 20 20 20 20 20 20  dex(key);.      
a650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 44 61                Da
a660: 74 61 62 61 73 65 55 74 69 6c 73 2e 62 69 6e 64  tabaseUtils.bind
a670: 4f 62 6a 65 63 74 54 6f 50 72 6f 67 72 61 6d 28  ObjectToProgram(
a680: 73 74 6d 74 2c 20 69 2c 20 65 2e 67 65 74 56 61  stmt, i, e.getVa
a690: 6c 75 65 28 29 29 3b 0a 20 20 20 20 20 20 20 20  lue());.        
a6a0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
a6b0: 44 45 42 55 47 29 20 7b 0a 20 20 20 20 20 20 20  DEBUG) {.       
a6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a6d0: 20 4c 6f 67 2e 76 28 54 41 47 2c 20 22 62 69 6e   Log.v(TAG, "bin
a6e0: 64 69 6e 67 20 22 20 2b 20 65 2e 67 65 74 56 61  ding " + e.getVa
a6f0: 6c 75 65 28 29 20 2b 20 22 20 74 6f 20 63 6f 6c  lue() + " to col
a700: 75 6d 6e 20 22 20 2b 0a 20 20 20 20 20 20 20 20  umn " +.        
a710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a720: 20 20 20 20 20 20 69 20 2b 20 22 20 28 22 20 2b        i + " (" +
a730: 20 6b 65 79 20 2b 20 22 29 22 29 3b 0a 20 20 20   key + ")");.   
a740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a750: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
a760: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
a770: 20 20 20 20 20 6c 6f 6e 67 20 72 65 73 75 6c 74       long result
a780: 20 3d 20 73 74 6d 74 2e 65 78 65 63 75 74 65 49   = stmt.executeI
a790: 6e 73 65 72 74 28 29 3b 0a 20 20 20 20 20 20 20  nsert();.       
a7a0: 20 20 20 20 20 20 20 20 20 6d 44 62 2e 73 65 74           mDb.set
a7b0: 54 72 61 6e 73 61 63 74 69 6f 6e 53 75 63 63 65  TransactionSucce
a7c0: 73 73 66 75 6c 28 29 3b 0a 20 20 20 20 20 20 20  ssful();.       
a7d0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
a7e0: 72 65 73 75 6c 74 3b 0a 20 20 20 20 20 20 20 20  result;.        
a7f0: 20 20 20 20 7d 20 63 61 74 63 68 20 28 53 51 4c      } catch (SQL
a800: 45 78 63 65 70 74 69 6f 6e 20 65 29 20 7b 0a 20  Exception e) {. 
a810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4c                 L
a820: 6f 67 2e 65 28 54 41 47 2c 20 22 45 72 72 6f 72  og.e(TAG, "Error
a830: 20 69 6e 73 65 72 74 69 6e 67 20 22 20 2b 20 76   inserting " + v
a840: 61 6c 75 65 73 20 2b 20 22 20 69 6e 74 6f 20 74  alues + " into t
a850: 61 62 6c 65 20 20 22 20 2b 20 6d 54 61 62 6c 65  able  " + mTable
a860: 4e 61 6d 65 2c 20 65 29 3b 0a 20 20 20 20 20 20  Name, e);.      
a870: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
a880: 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20   -1;.           
a890: 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a 20 20 20   } finally {.   
a8a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 44 62               mDb
a8b0: 2e 65 6e 64 54 72 61 6e 73 61 63 74 69 6f 6e 28  .endTransaction(
a8c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
a8d0: 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  .        }..    
a8e0: 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 20 20 20      /**.        
a8f0: 20 2a 20 52 65 74 75 72 6e 73 20 74 68 65 20 69   * Returns the i
a900: 6e 64 65 78 20 6f 66 20 74 68 65 20 73 70 65 63  ndex of the spec
a910: 69 66 69 65 64 20 63 6f 6c 75 6d 6e 2e 20 54 68  ified column. Th
a920: 69 73 20 69 73 20 69 6e 64 65 78 20 69 73 20 73  is is index is s
a930: 75 69 74 61 67 62 6c 65 20 66 6f 72 20 75 73 65  uitagble for use
a940: 0a 20 20 20 20 20 20 20 20 20 2a 20 69 6e 20 63  .         * in c
a950: 61 6c 6c 73 20 74 6f 20 62 69 6e 64 28 29 2e 0a  alls to bind()..
a960: 20 20 20 20 20 20 20 20 20 2a 20 40 70 61 72 61           * @para
a970: 6d 20 6b 65 79 20 74 68 65 20 63 6f 6c 75 6d 6e  m key the column
a980: 20 6e 61 6d 65 0a 20 20 20 20 20 20 20 20 20 2a   name.         *
a990: 20 40 72 65 74 75 72 6e 20 74 68 65 20 69 6e 64   @return the ind
a9a0: 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
a9b0: 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  .         */.   
a9c0: 20 20 20 20 20 70 75 62 6c 69 63 20 69 6e 74 20       public int 
a9d0: 67 65 74 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 53  getColumnIndex(S
a9e0: 74 72 69 6e 67 20 6b 65 79 29 20 7b 0a 20 20 20  tring key) {.   
a9f0: 20 20 20 20 20 20 20 20 20 67 65 74 53 74 61 74           getStat
aa00: 65 6d 65 6e 74 28 66 61 6c 73 65 29 3b 0a 20 20  ement(false);.  
aa10: 20 20 20 20 20 20 20 20 20 20 66 69 6e 61 6c 20            final 
aa20: 49 6e 74 65 67 65 72 20 69 6e 64 65 78 20 3d 20  Integer index = 
aa30: 6d 43 6f 6c 75 6d 6e 73 2e 67 65 74 28 6b 65 79  mColumns.get(key
aa40: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
aa50: 66 20 28 69 6e 64 65 78 20 3d 3d 20 6e 75 6c 6c  f (index == null
aa60: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
aa70: 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20 49 6c      throw new Il
aa80: 6c 65 67 61 6c 41 72 67 75 6d 65 6e 74 45 78 63  legalArgumentExc
aa90: 65 70 74 69 6f 6e 28 22 63 6f 6c 75 6d 6e 20 27  eption("column '
aaa0: 22 20 2b 20 6b 65 79 20 2b 20 22 27 20 69 73 20  " + key + "' is 
aab0: 69 6e 76 61 6c 69 64 22 29 3b 0a 20 20 20 20 20  invalid");.     
aac0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
aad0: 20 20 20 20 20 72 65 74 75 72 6e 20 69 6e 64 65       return inde
aae0: 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  x;.        }..  
aaf0: 20 20 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 20        /**.      
ab00: 20 20 20 2a 20 42 69 6e 64 20 74 68 65 20 76 61     * Bind the va
ab10: 6c 75 65 20 74 6f 20 61 6e 20 69 6e 64 65 78 2e  lue to an index.
ab20: 20 41 20 70 72 65 70 61 72 65 46 6f 72 49 6e 73   A prepareForIns
ab30: 65 72 74 28 29 20 6f 72 20 70 72 65 70 61 72 65  ert() or prepare
ab40: 46 6f 72 52 65 70 6c 61 63 65 28 29 0a 20 20 20  ForReplace().   
ab50: 20 20 20 20 20 20 2a 20 77 69 74 68 6f 75 74 20        * without 
ab60: 61 20 6d 61 74 63 68 69 6e 67 20 65 78 65 63 75  a matching execu
ab70: 74 65 28 29 20 6d 75 73 74 20 68 61 76 65 20 61  te() must have a
ab80: 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e  lready have been
ab90: 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 20 20 20   called..       
aba0: 20 20 2a 20 40 70 61 72 61 6d 20 69 6e 64 65 78    * @param index
abb0: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
abc0: 65 20 73 6c 6f 74 20 74 6f 20 77 68 69 63 68 20  e slot to which 
abd0: 74 6f 20 62 69 6e 64 0a 20 20 20 20 20 20 20 20  to bind.        
abe0: 20 2a 20 40 70 61 72 61 6d 20 76 61 6c 75 65 20   * @param value 
abf0: 74 68 65 20 76 61 6c 75 65 20 74 6f 20 62 69 6e  the value to bin
ac00: 64 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  d.         */.  
ac10: 20 20 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69        public voi
ac20: 64 20 62 69 6e 64 28 69 6e 74 20 69 6e 64 65 78  d bind(int index
ac30: 2c 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 29 20  , double value) 
ac40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 50  {.            mP
ac50: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
ac60: 2e 62 69 6e 64 44 6f 75 62 6c 65 28 69 6e 64 65  .bindDouble(inde
ac70: 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 20 20 20  x, value);.     
ac80: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a     }..        /*
ac90: 2a 0a 20 20 20 20 20 20 20 20 20 2a 20 42 69 6e  *.         * Bin
aca0: 64 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20 61  d the value to a
acb0: 6e 20 69 6e 64 65 78 2e 20 41 20 70 72 65 70 61  n index. A prepa
acc0: 72 65 46 6f 72 49 6e 73 65 72 74 28 29 20 6f 72  reForInsert() or
acd0: 20 70 72 65 70 61 72 65 46 6f 72 52 65 70 6c 61   prepareForRepla
ace0: 63 65 28 29 0a 20 20 20 20 20 20 20 20 20 2a 20  ce().         * 
acf0: 77 69 74 68 6f 75 74 20 61 20 6d 61 74 63 68 69  without a matchi
ad00: 6e 67 20 65 78 65 63 75 74 65 28 29 20 6d 75 73  ng execute() mus
ad10: 74 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 68  t have already h
ad20: 61 76 65 20 62 65 65 6e 20 63 61 6c 6c 65 64 2e  ave been called.
ad30: 0a 20 20 20 20 20 20 20 20 20 2a 20 40 70 61 72  .         * @par
ad40: 61 6d 20 69 6e 64 65 78 20 74 68 65 20 69 6e 64  am index the ind
ad50: 65 78 20 6f 66 20 74 68 65 20 73 6c 6f 74 20 74  ex of the slot t
ad60: 6f 20 77 68 69 63 68 20 74 6f 20 62 69 6e 64 0a  o which to bind.
ad70: 20 20 20 20 20 20 20 20 20 2a 20 40 70 61 72 61           * @para
ad80: 6d 20 76 61 6c 75 65 20 74 68 65 20 76 61 6c 75  m value the valu
ad90: 65 20 74 6f 20 62 69 6e 64 0a 20 20 20 20 20 20  e to bind.      
ada0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75     */.        pu
adb0: 62 6c 69 63 20 76 6f 69 64 20 62 69 6e 64 28 69  blic void bind(i
adc0: 6e 74 20 69 6e 64 65 78 2c 20 66 6c 6f 61 74 20  nt index, float 
add0: 76 61 6c 75 65 29 20 7b 0a 20 20 20 20 20 20 20  value) {.       
ade0: 20 20 20 20 20 6d 50 72 65 70 61 72 65 64 53 74       mPreparedSt
adf0: 61 74 65 6d 65 6e 74 2e 62 69 6e 64 44 6f 75 62  atement.bindDoub
ae00: 6c 65 28 69 6e 64 65 78 2c 20 76 61 6c 75 65 29  le(index, value)
ae10: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
ae20: 20 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 20 20       /**.       
ae30: 20 20 2a 20 42 69 6e 64 20 74 68 65 20 76 61 6c    * Bind the val
ae40: 75 65 20 74 6f 20 61 6e 20 69 6e 64 65 78 2e 20  ue to an index. 
ae50: 41 20 70 72 65 70 61 72 65 46 6f 72 49 6e 73 65  A prepareForInse
ae60: 72 74 28 29 20 6f 72 20 70 72 65 70 61 72 65 46  rt() or prepareF
ae70: 6f 72 52 65 70 6c 61 63 65 28 29 0a 20 20 20 20  orReplace().    
ae80: 20 20 20 20 20 2a 20 77 69 74 68 6f 75 74 20 61       * without a
ae90: 20 6d 61 74 63 68 69 6e 67 20 65 78 65 63 75 74   matching execut
aea0: 65 28 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c  e() must have al
aeb0: 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e 20  ready have been 
aec0: 63 61 6c 6c 65 64 2e 0a 20 20 20 20 20 20 20 20  called..        
aed0: 20 2a 20 40 70 61 72 61 6d 20 69 6e 64 65 78 20   * @param index 
aee0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65  the index of the
aef0: 20 73 6c 6f 74 20 74 6f 20 77 68 69 63 68 20 74   slot to which t
af00: 6f 20 62 69 6e 64 0a 20 20 20 20 20 20 20 20 20  o bind.         
af10: 2a 20 40 70 61 72 61 6d 20 76 61 6c 75 65 20 74  * @param value t
af20: 68 65 20 76 61 6c 75 65 20 74 6f 20 62 69 6e 64  he value to bind
af30: 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  .         */.   
af40: 20 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64       public void
af50: 20 62 69 6e 64 28 69 6e 74 20 69 6e 64 65 78 2c   bind(int index,
af60: 20 6c 6f 6e 67 20 76 61 6c 75 65 29 20 7b 0a 20   long value) {. 
af70: 20 20 20 20 20 20 20 20 20 20 20 6d 50 72 65 70             mPrep
af80: 61 72 65 64 53 74 61 74 65 6d 65 6e 74 2e 62 69  aredStatement.bi
af90: 6e 64 4c 6f 6e 67 28 69 6e 64 65 78 2c 20 76 61  ndLong(index, va
afa0: 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lue);.        }.
afb0: 0a 20 20 20 20 20 20 20 20 2f 2a 2a 0a 20 20 20  .        /**.   
afc0: 20 20 20 20 20 20 2a 20 42 69 6e 64 20 74 68 65        * Bind the
afd0: 20 76 61 6c 75 65 20 74 6f 20 61 6e 20 69 6e 64   value to an ind
afe0: 65 78 2e 20 41 20 70 72 65 70 61 72 65 46 6f 72  ex. A prepareFor
aff0: 49 6e 73 65 72 74 28 29 20 6f 72 20 70 72 65 70  Insert() or prep
b000: 61 72 65 46 6f 72 52 65 70 6c 61 63 65 28 29 0a  areForReplace().
b010: 20 20 20 20 20 20 20 20 20 2a 20 77 69 74 68 6f           * witho
b020: 75 74 20 61 20 6d 61 74 63 68 69 6e 67 20 65 78  ut a matching ex
b030: 65 63 75 74 65 28 29 20 6d 75 73 74 20 68 61 76  ecute() must hav
b040: 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 62  e already have b
b050: 65 65 6e 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20  een called..    
b060: 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 69 6e       * @param in
b070: 64 65 78 20 74 68 65 20 69 6e 64 65 78 20 6f 66  dex the index of
b080: 20 74 68 65 20 73 6c 6f 74 20 74 6f 20 77 68 69   the slot to whi
b090: 63 68 20 74 6f 20 62 69 6e 64 0a 20 20 20 20 20  ch to bind.     
b0a0: 20 20 20 20 2a 20 40 70 61 72 61 6d 20 76 61 6c      * @param val
b0b0: 75 65 20 74 68 65 20 76 61 6c 75 65 20 74 6f 20  ue the value to 
b0c0: 62 69 6e 64 0a 20 20 20 20 20 20 20 20 20 2a 2f  bind.         */
b0d0: 0a 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20  .        public 
b0e0: 76 6f 69 64 20 62 69 6e 64 28 69 6e 74 20 69 6e  void bind(int in
b0f0: 64 65 78 2c 20 69 6e 74 20 76 61 6c 75 65 29 20  dex, int value) 
b100: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 50  {.            mP
b110: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
b120: 2e 62 69 6e 64 4c 6f 6e 67 28 69 6e 64 65 78 2c  .bindLong(index,
b130: 20 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20   value);.       
b140: 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 2a 0a   }..        /**.
b150: 20 20 20 20 20 20 20 20 20 2a 20 42 69 6e 64 20           * Bind 
b160: 74 68 65 20 76 61 6c 75 65 20 74 6f 20 61 6e 20  the value to an 
b170: 69 6e 64 65 78 2e 20 41 20 70 72 65 70 61 72 65  index. A prepare
b180: 46 6f 72 49 6e 73 65 72 74 28 29 20 6f 72 20 70  ForInsert() or p
b190: 72 65 70 61 72 65 46 6f 72 52 65 70 6c 61 63 65  repareForReplace
b1a0: 28 29 0a 20 20 20 20 20 20 20 20 20 2a 20 77 69  ().         * wi
b1b0: 74 68 6f 75 74 20 61 20 6d 61 74 63 68 69 6e 67  thout a matching
b1c0: 20 65 78 65 63 75 74 65 28 29 20 6d 75 73 74 20   execute() must 
b1d0: 68 61 76 65 20 61 6c 72 65 61 64 79 20 68 61 76  have already hav
b1e0: 65 20 62 65 65 6e 20 63 61 6c 6c 65 64 2e 0a 20  e been called.. 
b1f0: 20 20 20 20 20 20 20 20 2a 20 40 70 61 72 61 6d          * @param
b200: 20 69 6e 64 65 78 20 74 68 65 20 69 6e 64 65 78   index the index
b210: 20 6f 66 20 74 68 65 20 73 6c 6f 74 20 74 6f 20   of the slot to 
b220: 77 68 69 63 68 20 74 6f 20 62 69 6e 64 0a 20 20  which to bind.  
b230: 20 20 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20         * @param 
b240: 76 61 6c 75 65 20 74 68 65 20 76 61 6c 75 65 20  value the value 
b250: 74 6f 20 62 69 6e 64 0a 20 20 20 20 20 20 20 20  to bind.        
b260: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 62 6c   */.        publ
b270: 69 63 20 76 6f 69 64 20 62 69 6e 64 28 69 6e 74  ic void bind(int
b280: 20 69 6e 64 65 78 2c 20 62 6f 6f 6c 65 61 6e 20   index, boolean 
b290: 76 61 6c 75 65 29 20 7b 0a 20 20 20 20 20 20 20  value) {.       
b2a0: 20 20 20 20 20 6d 50 72 65 70 61 72 65 64 53 74       mPreparedSt
b2b0: 61 74 65 6d 65 6e 74 2e 62 69 6e 64 4c 6f 6e 67  atement.bindLong
b2c0: 28 69 6e 64 65 78 2c 20 76 61 6c 75 65 20 3f 20  (index, value ? 
b2d0: 31 20 3a 20 30 29 3b 0a 20 20 20 20 20 20 20 20  1 : 0);.        
b2e0: 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 2a 0a 20  }..        /**. 
b2f0: 20 20 20 20 20 20 20 20 2a 20 42 69 6e 64 20 6e          * Bind n
b300: 75 6c 6c 20 74 6f 20 61 6e 20 69 6e 64 65 78 2e  ull to an index.
b310: 20 41 20 70 72 65 70 61 72 65 46 6f 72 49 6e 73   A prepareForIns
b320: 65 72 74 28 29 20 6f 72 20 70 72 65 70 61 72 65  ert() or prepare
b330: 46 6f 72 52 65 70 6c 61 63 65 28 29 0a 20 20 20  ForReplace().   
b340: 20 20 20 20 20 20 2a 20 77 69 74 68 6f 75 74 20        * without 
b350: 61 20 6d 61 74 63 68 69 6e 67 20 65 78 65 63 75  a matching execu
b360: 74 65 28 29 20 6d 75 73 74 20 68 61 76 65 20 61  te() must have a
b370: 6c 72 65 61 64 79 20 68 61 76 65 20 62 65 65 6e  lready have been
b380: 20 63 61 6c 6c 65 64 2e 0a 20 20 20 20 20 20 20   called..       
b390: 20 20 2a 20 40 70 61 72 61 6d 20 69 6e 64 65 78    * @param index
b3a0: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
b3b0: 65 20 73 6c 6f 74 20 74 6f 20 77 68 69 63 68 20  e slot to which 
b3c0: 74 6f 20 62 69 6e 64 0a 20 20 20 20 20 20 20 20  to bind.        
b3d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 62 6c   */.        publ
b3e0: 69 63 20 76 6f 69 64 20 62 69 6e 64 4e 75 6c 6c  ic void bindNull
b3f0: 28 69 6e 74 20 69 6e 64 65 78 29 20 7b 0a 20 20  (int index) {.  
b400: 20 20 20 20 20 20 20 20 20 20 6d 50 72 65 70 61            mPrepa
b410: 72 65 64 53 74 61 74 65 6d 65 6e 74 2e 62 69 6e  redStatement.bin
b420: 64 4e 75 6c 6c 28 69 6e 64 65 78 29 3b 0a 20 20  dNull(index);.  
b430: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
b440: 20 2f 2a 2a 0a 20 20 20 20 20 20 20 20 20 2a 20   /**.         * 
b450: 42 69 6e 64 20 74 68 65 20 76 61 6c 75 65 20 74  Bind the value t
b460: 6f 20 61 6e 20 69 6e 64 65 78 2e 20 41 20 70 72  o an index. A pr
b470: 65 70 61 72 65 46 6f 72 49 6e 73 65 72 74 28 29  epareForInsert()
b480: 20 6f 72 20 70 72 65 70 61 72 65 46 6f 72 52 65   or prepareForRe
b490: 70 6c 61 63 65 28 29 0a 20 20 20 20 20 20 20 20  place().        
b4a0: 20 2a 20 77 69 74 68 6f 75 74 20 61 20 6d 61 74   * without a mat
b4b0: 63 68 69 6e 67 20 65 78 65 63 75 74 65 28 29 20  ching execute() 
b4c0: 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65 61 64  must have alread
b4d0: 79 20 68 61 76 65 20 62 65 65 6e 20 63 61 6c 6c  y have been call
b4e0: 65 64 2e 0a 20 20 20 20 20 20 20 20 20 2a 20 40  ed..         * @
b4f0: 70 61 72 61 6d 20 69 6e 64 65 78 20 74 68 65 20  param index the 
b500: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 73 6c 6f  index of the slo
b510: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 62 69  t to which to bi
b520: 6e 64 0a 20 20 20 20 20 20 20 20 20 2a 20 40 70  nd.         * @p
b530: 61 72 61 6d 20 76 61 6c 75 65 20 74 68 65 20 76  aram value the v
b540: 61 6c 75 65 20 74 6f 20 62 69 6e 64 0a 20 20 20  alue to bind.   
b550: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
b560: 20 70 75 62 6c 69 63 20 76 6f 69 64 20 62 69 6e   public void bin
b570: 64 28 69 6e 74 20 69 6e 64 65 78 2c 20 62 79 74  d(int index, byt
b580: 65 5b 5d 20 76 61 6c 75 65 29 20 7b 0a 20 20 20  e[] value) {.   
b590: 20 20 20 20 20 20 20 20 20 69 66 20 28 76 61 6c           if (val
b5a0: 75 65 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20  ue == null) {.  
b5b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 50                mP
b5c0: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
b5d0: 2e 62 69 6e 64 4e 75 6c 6c 28 69 6e 64 65 78 29  .bindNull(index)
b5e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  ;.            } 
b5f0: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
b600: 20 20 20 20 20 20 20 6d 50 72 65 70 61 72 65 64         mPrepared
b610: 53 74 61 74 65 6d 65 6e 74 2e 62 69 6e 64 42 6c  Statement.bindBl
b620: 6f 62 28 69 6e 64 65 78 2c 20 76 61 6c 75 65 29  ob(index, value)
b630: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
b640: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
b650: 20 20 20 2f 2a 2a 0a 20 20 20 20 20 20 20 20 20     /**.         
b660: 2a 20 42 69 6e 64 20 74 68 65 20 76 61 6c 75 65  * Bind the value
b670: 20 74 6f 20 61 6e 20 69 6e 64 65 78 2e 20 41 20   to an index. A 
b680: 70 72 65 70 61 72 65 46 6f 72 49 6e 73 65 72 74  prepareForInsert
b690: 28 29 20 6f 72 20 70 72 65 70 61 72 65 46 6f 72  () or prepareFor
b6a0: 52 65 70 6c 61 63 65 28 29 0a 20 20 20 20 20 20  Replace().      
b6b0: 20 20 20 2a 20 77 69 74 68 6f 75 74 20 61 20 6d     * without a m
b6c0: 61 74 63 68 69 6e 67 20 65 78 65 63 75 74 65 28  atching execute(
b6d0: 29 20 6d 75 73 74 20 68 61 76 65 20 61 6c 72 65  ) must have alre
b6e0: 61 64 79 20 68 61 76 65 20 62 65 65 6e 20 63 61  ady have been ca
b6f0: 6c 6c 65 64 2e 0a 20 20 20 20 20 20 20 20 20 2a  lled..         *
b700: 20 40 70 61 72 61 6d 20 69 6e 64 65 78 20 74 68   @param index th
b710: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 73  e index of the s
b720: 6c 6f 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  lot to which to 
b730: 62 69 6e 64 0a 20 20 20 20 20 20 20 20 20 2a 20  bind.         * 
b740: 40 70 61 72 61 6d 20 76 61 6c 75 65 20 74 68 65  @param value the
b750: 20 76 61 6c 75 65 20 74 6f 20 62 69 6e 64 0a 20   value to bind. 
b760: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
b770: 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20 62     public void b
b780: 69 6e 64 28 69 6e 74 20 69 6e 64 65 78 2c 20 53  ind(int index, S
b790: 74 72 69 6e 67 20 76 61 6c 75 65 29 20 7b 0a 20  tring value) {. 
b7a0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 76             if (v
b7b0: 61 6c 75 65 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a  alue == null) {.
b7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b7d0: 6d 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  mPreparedStateme
b7e0: 6e 74 2e 62 69 6e 64 4e 75 6c 6c 28 69 6e 64 65  nt.bindNull(inde
b7f0: 78 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  x);.            
b800: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
b810: 20 20 20 20 20 20 20 20 20 6d 50 72 65 70 61 72           mPrepar
b820: 65 64 53 74 61 74 65 6d 65 6e 74 2e 62 69 6e 64  edStatement.bind
b830: 53 74 72 69 6e 67 28 69 6e 64 65 78 2c 20 76 61  String(index, va
b840: 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  lue);.          
b850: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20    }.        }.. 
b860: 20 20 20 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20         /**.     
b870: 20 20 20 20 2a 20 50 65 72 66 6f 72 6d 73 20 61      * Performs a
b880: 6e 20 69 6e 73 65 72 74 2c 20 61 64 64 69 6e 67  n insert, adding
b890: 20 61 20 6e 65 77 20 72 6f 77 20 77 69 74 68 20   a new row with 
b8a0: 74 68 65 20 67 69 76 65 6e 20 76 61 6c 75 65 73  the given values
b8b0: 2e 0a 20 20 20 20 20 20 20 20 20 2a 20 49 66 20  ..         * If 
b8c0: 74 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  the table contai
b8d0: 6e 73 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72  ns conflicting r
b8e0: 6f 77 73 2c 20 61 6e 20 65 72 72 6f 72 20 69 73  ows, an error is
b8f0: 0a 20 20 20 20 20 20 20 20 20 2a 20 72 65 74 75  .         * retu
b900: 72 6e 65 64 2e 0a 20 20 20 20 20 20 20 20 20 2a  rned..         *
b910: 0a 20 20 20 20 20 20 20 20 20 2a 20 40 70 61 72  .         * @par
b920: 61 6d 20 76 61 6c 75 65 73 20 74 68 65 20 73 65  am values the se
b930: 74 20 6f 66 20 76 61 6c 75 65 73 20 77 69 74 68  t of values with
b940: 20 77 68 69 63 68 20 74 6f 20 70 6f 70 75 6c 61   which to popula
b950: 74 65 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  te the.         
b960: 2a 20 6e 65 77 20 72 6f 77 0a 20 20 20 20 20 20  * new row.      
b970: 20 20 20 2a 0a 20 20 20 20 20 20 20 20 20 2a 20     *.         * 
b980: 40 72 65 74 75 72 6e 20 74 68 65 20 72 6f 77 20  @return the row 
b990: 49 44 20 6f 66 20 74 68 65 20 6e 65 77 6c 79 20  ID of the newly 
b9a0: 69 6e 73 65 72 74 65 64 20 72 6f 77 2c 20 6f 72  inserted row, or
b9b0: 20 2d 31 20 69 66 20 61 6e 0a 20 20 20 20 20 20   -1 if an.      
b9c0: 20 20 20 2a 20 65 72 72 6f 72 20 6f 63 63 75 72     * error occur
b9d0: 72 65 64 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a  red.         */.
b9e0: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 6c          public l
b9f0: 6f 6e 67 20 69 6e 73 65 72 74 28 43 6f 6e 74 65  ong insert(Conte
ba00: 6e 74 56 61 6c 75 65 73 20 76 61 6c 75 65 73 29  ntValues values)
ba10: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72   {.            r
ba20: 65 74 75 72 6e 20 69 6e 73 65 72 74 49 6e 74 65  eturn insertInte
ba30: 72 6e 61 6c 28 76 61 6c 75 65 73 2c 20 66 61 6c  rnal(values, fal
ba40: 73 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  se);.        }..
ba50: 20 20 20 20 20 20 20 20 2f 2a 2a 0a 20 20 20 20          /**.    
ba60: 20 20 20 20 20 2a 20 45 78 65 63 75 74 65 20 74       * Execute t
ba70: 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 70 72  he previously pr
ba80: 65 70 61 72 65 64 20 69 6e 73 65 72 74 20 6f 72  epared insert or
ba90: 20 72 65 70 6c 61 63 65 20 75 73 69 6e 67 20 74   replace using t
baa0: 68 65 20 62 6f 75 6e 64 20 76 61 6c 75 65 73 0a  he bound values.
bab0: 20 20 20 20 20 20 20 20 20 2a 20 73 69 6e 63 65           * since
bac0: 20 74 68 65 20 6c 61 73 74 20 63 61 6c 6c 20 74   the last call t
bad0: 6f 20 70 72 65 70 61 72 65 46 6f 72 49 6e 73 65  o prepareForInse
bae0: 72 74 20 6f 72 20 70 72 65 70 61 72 65 46 6f 72  rt or prepareFor
baf0: 52 65 70 6c 61 63 65 2e 0a 20 20 20 20 20 20 20  Replace..       
bb00: 20 20 2a 0a 20 20 20 20 20 20 20 20 20 2a 20 3c    *.         * <
bb10: 70 3e 4e 6f 74 65 20 74 68 61 74 20 63 61 6c 6c  p>Note that call
bb20: 69 6e 67 20 62 69 6e 64 28 29 20 61 6e 64 20 74  ing bind() and t
bb30: 68 65 6e 20 65 78 65 63 75 74 65 28 29 20 69 73  hen execute() is
bb40: 20 6e 6f 74 20 74 68 72 65 61 64 2d 73 61 66 65   not thread-safe
bb50: 2e 20 54 68 65 20 6f 6e 6c 79 20 74 68 72 65 61  . The only threa
bb60: 64 2d 73 61 66 65 0a 20 20 20 20 20 20 20 20 20  d-safe.         
bb70: 2a 20 77 61 79 20 74 6f 20 75 73 65 20 74 68 69  * way to use thi
bb80: 73 20 63 6c 61 73 73 20 69 73 20 74 6f 20 63 61  s class is to ca
bb90: 6c 6c 20 69 6e 73 65 72 74 28 29 20 6f 72 20 72  ll insert() or r
bba0: 65 70 6c 61 63 65 28 29 2e 0a 20 20 20 20 20 20  eplace()..      
bbb0: 20 20 20 2a 0a 20 20 20 20 20 20 20 20 20 2a 20     *.         * 
bbc0: 40 72 65 74 75 72 6e 20 74 68 65 20 72 6f 77 20  @return the row 
bbd0: 49 44 20 6f 66 20 74 68 65 20 6e 65 77 6c 79 20  ID of the newly 
bbe0: 69 6e 73 65 72 74 65 64 20 72 6f 77 2c 20 6f 72  inserted row, or
bbf0: 20 2d 31 20 69 66 20 61 6e 0a 20 20 20 20 20 20   -1 if an.      
bc00: 20 20 20 2a 20 65 72 72 6f 72 20 6f 63 63 75 72     * error occur
bc10: 72 65 64 0a 20 20 20 20 20 20 20 20 20 2a 2f 0a  red.         */.
bc20: 20 20 20 20 20 20 20 20 70 75 62 6c 69 63 20 6c          public l
bc30: 6f 6e 67 20 65 78 65 63 75 74 65 28 29 20 7b 0a  ong execute() {.
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
bc50: 6d 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  mPreparedStateme
bc60: 6e 74 20 3d 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20  nt == null) {.  
bc70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68                th
bc80: 72 6f 77 20 6e 65 77 20 49 6c 6c 65 67 61 6c 53  row new IllegalS
bc90: 74 61 74 65 45 78 63 65 70 74 69 6f 6e 28 22 79  tateException("y
bca0: 6f 75 20 6d 75 73 74 20 70 72 65 70 61 72 65 20  ou must prepare 
bcb0: 74 68 69 73 20 69 6e 73 65 72 74 65 72 20 62 65  this inserter be
bcc0: 66 6f 72 65 20 63 61 6c 6c 69 6e 67 20 22 0a 20  fore calling ". 
bcd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bce0: 20 20 20 20 20 20 20 2b 20 22 65 78 65 63 75 74         + "execut
bcf0: 65 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e");.           
bd00: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 74   }.            t
bd10: 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ry {.           
bd20: 20 20 20 20 20 69 66 20 28 44 45 42 55 47 29 20       if (DEBUG) 
bd30: 4c 6f 67 2e 76 28 54 41 47 2c 20 22 2d 2d 2d 20  Log.v(TAG, "--- 
bd40: 64 6f 69 6e 67 20 69 6e 73 65 72 74 20 6f 72 20  doing insert or 
bd50: 72 65 70 6c 61 63 65 20 69 6e 20 74 61 62 6c 65  replace in table
bd60: 20 22 20 2b 20 6d 54 61 62 6c 65 4e 61 6d 65 29   " + mTableName)
bd70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
bd80: 20 20 72 65 74 75 72 6e 20 6d 50 72 65 70 61 72    return mPrepar
bd90: 65 64 53 74 61 74 65 6d 65 6e 74 2e 65 78 65 63  edStatement.exec
bda0: 75 74 65 49 6e 73 65 72 74 28 29 3b 0a 20 20 20  uteInsert();.   
bdb0: 20 20 20 20 20 20 20 20 20 7d 20 63 61 74 63 68           } catch
bdc0: 20 28 53 51 4c 45 78 63 65 70 74 69 6f 6e 20 65   (SQLException e
bdd0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
bde0: 20 20 20 20 4c 6f 67 2e 65 28 54 41 47 2c 20 22      Log.e(TAG, "
bdf0: 45 72 72 6f 72 20 65 78 65 63 75 74 69 6e 67 20  Error executing 
be00: 49 6e 73 65 72 74 48 65 6c 70 65 72 20 77 69 74  InsertHelper wit
be10: 68 20 74 61 62 6c 65 20 22 20 2b 20 6d 54 61 62  h table " + mTab
be20: 6c 65 4e 61 6d 65 2c 20 65 29 3b 0a 20 20 20 20  leName, e);.    
be30: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
be40: 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20  rn -1;.         
be50: 20 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a 20     } finally {. 
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
be70: 2f 20 79 6f 75 20 63 61 6e 20 6f 6e 6c 79 20 63  / you can only c
be80: 61 6c 6c 20 74 68 69 73 20 6f 6e 63 65 20 70 65  all this once pe
be90: 72 20 70 72 65 70 61 72 65 0a 20 20 20 20 20 20  r prepare.      
bea0: 20 20 20 20 20 20 20 20 20 20 6d 50 72 65 70 61            mPrepa
beb0: 72 65 64 53 74 61 74 65 6d 65 6e 74 20 3d 20 6e  redStatement = n
bec0: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ull;.           
bed0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20   }.        }..  
bee0: 20 20 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 20        /**.      
bef0: 20 20 20 2a 20 50 72 65 70 61 72 65 20 74 68 65     * Prepare the
bf00: 20 49 6e 73 65 72 74 48 65 6c 70 65 72 20 66 6f   InsertHelper fo
bf10: 72 20 61 6e 20 69 6e 73 65 72 74 2e 20 54 68 65  r an insert. The
bf20: 20 70 61 74 74 65 72 6e 20 66 6f 72 20 74 68 69   pattern for thi
bf30: 73 20 69 73 3a 0a 20 20 20 20 20 20 20 20 20 2a  s is:.         *
bf40: 20 3c 75 6c 3e 0a 20 20 20 20 20 20 20 20 20 2a   <ul>.         *
bf50: 20 3c 6c 69 3e 70 72 65 70 61 72 65 46 6f 72 49   <li>prepareForI
bf60: 6e 73 65 72 74 28 29 0a 20 20 20 20 20 20 20 20  nsert().        
bf70: 20 2a 20 3c 6c 69 3e 62 69 6e 64 28 69 6e 64 65   * <li>bind(inde
bf80: 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 20 20 20  x, value);.     
bf90: 20 20 20 20 2a 20 3c 6c 69 3e 62 69 6e 64 28 69      * <li>bind(i
bfa0: 6e 64 65 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20  ndex, value);.  
bfb0: 20 20 20 20 20 20 20 2a 20 3c 6c 69 3e 2e 2e 2e         * <li>...
bfc0: 0a 20 20 20 20 20 20 20 20 20 2a 20 3c 6c 69 3e  .         * <li>
bfd0: 62 69 6e 64 28 69 6e 64 65 78 2c 20 76 61 6c 75  bind(index, valu
bfe0: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 2a 20 3c  e);.         * <
bff0: 6c 69 3e 65 78 65 63 75 74 65 28 29 3b 0a 20 20  li>execute();.  
c000: 20 20 20 20 20 20 20 2a 20 3c 2f 75 6c 3e 0a 20         * </ul>. 
c010: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
c020: 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20 70     public void p
c030: 72 65 70 61 72 65 46 6f 72 49 6e 73 65 72 74 28  repareForInsert(
c040: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
c050: 6d 50 72 65 70 61 72 65 64 53 74 61 74 65 6d 65  mPreparedStateme
c060: 6e 74 20 3d 20 67 65 74 53 74 61 74 65 6d 65 6e  nt = getStatemen
c070: 74 28 66 61 6c 73 65 29 3b 0a 20 20 20 20 20 20  t(false);.      
c080: 20 20 20 20 20 20 6d 50 72 65 70 61 72 65 64 53        mPreparedS
c090: 74 61 74 65 6d 65 6e 74 2e 63 6c 65 61 72 42 69  tatement.clearBi
c0a0: 6e 64 69 6e 67 73 28 29 3b 0a 20 20 20 20 20 20  ndings();.      
c0b0: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 2a    }..        /**
c0c0: 0a 20 20 20 20 20 20 20 20 20 2a 20 50 72 65 70  .         * Prep
c0d0: 61 72 65 20 74 68 65 20 49 6e 73 65 72 74 48 65  are the InsertHe
c0e0: 6c 70 65 72 20 66 6f 72 20 61 20 72 65 70 6c 61  lper for a repla
c0f0: 63 65 2e 20 54 68 65 20 70 61 74 74 65 72 6e 20  ce. The pattern 
c100: 66 6f 72 20 74 68 69 73 20 69 73 3a 0a 20 20 20  for this is:.   
c110: 20 20 20 20 20 20 2a 20 3c 75 6c 3e 0a 20 20 20        * <ul>.   
c120: 20 20 20 20 20 20 2a 20 3c 6c 69 3e 70 72 65 70        * <li>prep
c130: 61 72 65 46 6f 72 52 65 70 6c 61 63 65 28 29 0a  areForReplace().
c140: 20 20 20 20 20 20 20 20 20 2a 20 3c 6c 69 3e 62           * <li>b
c150: 69 6e 64 28 69 6e 64 65 78 2c 20 76 61 6c 75 65  ind(index, value
c160: 29 3b 0a 20 20 20 20 20 20 20 20 20 2a 20 3c 6c  );.         * <l
c170: 69 3e 62 69 6e 64 28 69 6e 64 65 78 2c 20 76 61  i>bind(index, va
c180: 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 20 2a  lue);.         *
c190: 20 3c 6c 69 3e 2e 2e 2e 0a 20 20 20 20 20 20 20   <li>....       
c1a0: 20 20 2a 20 3c 6c 69 3e 62 69 6e 64 28 69 6e 64    * <li>bind(ind
c1b0: 65 78 2c 20 76 61 6c 75 65 29 3b 0a 20 20 20 20  ex, value);.    
c1c0: 20 20 20 20 20 2a 20 3c 6c 69 3e 65 78 65 63 75       * <li>execu
c1d0: 74 65 28 29 3b 0a 20 20 20 20 20 20 20 20 20 2a  te();.         *
c1e0: 20 3c 2f 75 6c 3e 0a 20 20 20 20 20 20 20 20 20   </ul>.         
c1f0: 2a 2f 0a 20 20 20 20 20 20 20 20 70 75 62 6c 69  */.        publi
c200: 63 20 76 6f 69 64 20 70 72 65 70 61 72 65 46 6f  c void prepareFo
c210: 72 52 65 70 6c 61 63 65 28 29 20 7b 0a 20 20 20  rReplace() {.   
c220: 20 20 20 20 20 20 20 20 20 6d 50 72 65 70 61 72           mPrepar
c230: 65 64 53 74 61 74 65 6d 65 6e 74 20 3d 20 67 65  edStatement = ge
c240: 74 53 74 61 74 65 6d 65 6e 74 28 74 72 75 65 29  tStatement(true)
c250: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 50  ;.            mP
c260: 72 65 70 61 72 65 64 53 74 61 74 65 6d 65 6e 74  reparedStatement
c270: 2e 63 6c 65 61 72 42 69 6e 64 69 6e 67 73 28 29  .clearBindings()
c280: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
c290: 20 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 20 20       /**.       
c2a0: 20 20 2a 20 50 65 72 66 6f 72 6d 73 20 61 6e 20    * Performs an 
c2b0: 69 6e 73 65 72 74 2c 20 61 64 64 69 6e 67 20 61  insert, adding a
c2c0: 20 6e 65 77 20 72 6f 77 20 77 69 74 68 20 74 68   new row with th
c2d0: 65 20 67 69 76 65 6e 20 76 61 6c 75 65 73 2e 0a  e given values..
c2e0: 20 20 20 20 20 20 20 20 20 2a 20 49 66 20 74 68           * If th
c2f0: 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73  e table contains
c300: 20 63 6f 6e 66 6c 69 63 74 69 6e 67 20 72 6f 77   conflicting row
c310: 73 2c 20 74 68 65 79 20 61 72 65 20 64 65 6c 65  s, they are dele
c320: 74 65 64 0a 20 20 20 20 20 20 20 20 20 2a 20 61  ted.         * a
c330: 6e 64 20 72 65 70 6c 61 63 65 64 20 77 69 74 68  nd replaced with
c340: 20 74 68 65 20 6e 65 77 20 72 6f 77 2e 0a 20 20   the new row..  
c350: 20 20 20 20 20 20 20 2a 0a 20 20 20 20 20 20 20         *.       
c360: 20 20 2a 20 40 70 61 72 61 6d 20 76 61 6c 75 65    * @param value
c370: 73 20 74 68 65 20 73 65 74 20 6f 66 20 76 61 6c  s the set of val
c380: 75 65 73 20 77 69 74 68 20 77 68 69 63 68 20 74  ues with which t
c390: 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65 0a 20  o populate the. 
c3a0: 20 20 20 20 20 20 20 20 2a 20 6e 65 77 20 72 6f          * new ro
c3b0: 77 0a 20 20 20 20 20 20 20 20 20 2a 0a 20 20 20  w.         *.   
c3c0: 20 20 20 20 20 20 2a 20 40 72 65 74 75 72 6e 20        * @return 
c3d0: 74 68 65 20 72 6f 77 20 49 44 20 6f 66 20 74 68  the row ID of th
c3e0: 65 20 6e 65 77 6c 79 20 69 6e 73 65 72 74 65 64  e newly inserted
c3f0: 20 72 6f 77 2c 20 6f 72 20 2d 31 20 69 66 20 61   row, or -1 if a
c400: 6e 0a 20 20 20 20 20 20 20 20 20 2a 20 65 72 72  n.         * err
c410: 6f 72 20 6f 63 63 75 72 72 65 64 0a 20 20 20 20  or occurred.    
c420: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
c430: 70 75 62 6c 69 63 20 6c 6f 6e 67 20 72 65 70 6c  public long repl
c440: 61 63 65 28 43 6f 6e 74 65 6e 74 56 61 6c 75 65  ace(ContentValue
c450: 73 20 76 61 6c 75 65 73 29 20 7b 0a 20 20 20 20  s values) {.    
c460: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69          return i
c470: 6e 73 65 72 74 49 6e 74 65 72 6e 61 6c 28 76 61  nsertInternal(va
c480: 6c 75 65 73 2c 20 74 72 75 65 29 3b 0a 20 20 20  lues, true);.   
c490: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
c4a0: 2f 2a 2a 0a 20 20 20 20 20 20 20 20 20 2a 20 43  /**.         * C
c4b0: 6c 6f 73 65 20 74 68 69 73 20 6f 62 6a 65 63 74  lose this object
c4c0: 20 61 6e 64 20 72 65 6c 65 61 73 65 20 61 6e 79   and release any
c4d0: 20 72 65 73 6f 75 72 63 65 73 20 61 73 73 6f 63   resources assoc
c4e0: 69 61 74 65 64 20 77 69 74 68 0a 20 20 20 20 20  iated with.     
c4f0: 20 20 20 20 2a 20 69 74 2e 20 20 54 68 65 20 62      * it.  The b
c500: 65 68 61 76 69 6f 72 20 6f 66 20 63 61 6c 6c 69  ehavior of calli
c510: 6e 67 20 3c 63 6f 64 65 3e 69 6e 73 65 72 74 28  ng <code>insert(
c520: 29 3c 2f 63 6f 64 65 3e 20 61 66 74 65 72 0a 20  )</code> after. 
c530: 20 20 20 20 20 20 20 20 2a 20 63 61 6c 6c 69 6e          * callin
c540: 67 20 74 68 69 73 20 6d 65 74 68 6f 64 20 69 73  g this method is
c550: 20 75 6e 64 65 66 69 6e 65 64 2e 0a 20 20 20 20   undefined..    
c560: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
c570: 70 75 62 6c 69 63 20 76 6f 69 64 20 63 6c 6f 73  public void clos
c580: 65 28 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  e() {.          
c590: 20 20 69 66 20 28 6d 49 6e 73 65 72 74 53 74 61    if (mInsertSta
c5a0: 74 65 6d 65 6e 74 20 21 3d 20 6e 75 6c 6c 29 20  tement != null) 
c5b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
c5c0: 20 20 6d 49 6e 73 65 72 74 53 74 61 74 65 6d 65    mInsertStateme
c5d0: 6e 74 2e 63 6c 6f 73 65 28 29 3b 0a 20 20 20 20  nt.close();.    
c5e0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 49 6e 73              mIns
c5f0: 65 72 74 53 74 61 74 65 6d 65 6e 74 20 3d 20 6e  ertStatement = n
c600: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ull;.           
c610: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
c620: 66 20 28 6d 52 65 70 6c 61 63 65 53 74 61 74 65  f (mReplaceState
c630: 6d 65 6e 74 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a  ment != null) {.
c640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c650: 6d 52 65 70 6c 61 63 65 53 74 61 74 65 6d 65 6e  mReplaceStatemen
c660: 74 2e 63 6c 6f 73 65 28 29 3b 0a 20 20 20 20 20  t.close();.     
c670: 20 20 20 20 20 20 20 20 20 20 20 6d 52 65 70 6c             mRepl
c680: 61 63 65 53 74 61 74 65 6d 65 6e 74 20 3d 20 6e  aceStatement = n
c690: 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ull;.           
c6a0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d   }.            m
c6b0: 49 6e 73 65 72 74 53 51 4c 20 3d 20 6e 75 6c 6c  InsertSQL = null
c6c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 43  ;.            mC
c6d0: 6f 6c 75 6d 6e 73 20 3d 20 6e 75 6c 6c 3b 0a 20  olumns = null;. 
c6e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a         }.    }..
c6f0: 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 43      /**.     * C
c700: 72 65 61 74 65 73 20 61 20 64 62 20 61 6e 64 20  reates a db and 
c710: 70 6f 70 75 6c 61 74 65 73 20 69 74 20 77 69 74  populates it wit
c720: 68 20 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d  h the sql statem
c730: 65 6e 74 73 20 69 6e 20 73 71 6c 53 74 61 74 65  ents in sqlState
c740: 6d 65 6e 74 73 2e 0a 20 20 20 20 20 2a 0a 20 20  ments..     *.  
c750: 20 20 20 2a 20 40 70 61 72 61 6d 20 63 6f 6e 74     * @param cont
c760: 65 78 74 20 74 68 65 20 63 6f 6e 74 65 78 74 20  ext the context 
c770: 74 6f 20 75 73 65 20 74 6f 20 63 72 65 61 74 65  to use to create
c780: 20 74 68 65 20 64 62 0a 20 20 20 20 20 2a 20 40   the db.     * @
c790: 70 61 72 61 6d 20 64 62 4e 61 6d 65 20 74 68 65  param dbName the
c7a0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 62 20   name of the db 
c7b0: 74 6f 20 63 72 65 61 74 65 0a 20 20 20 20 20 2a  to create.     *
c7c0: 20 40 70 61 72 61 6d 20 64 62 56 65 72 73 69 6f   @param dbVersio
c7d0: 6e 20 74 68 65 20 76 65 72 73 69 6f 6e 20 74 6f  n the version to
c7e0: 20 73 65 74 20 6f 6e 20 74 68 65 20 64 62 0a 20   set on the db. 
c7f0: 20 20 20 20 2a 20 40 70 61 72 61 6d 20 73 71 6c      * @param sql
c800: 53 74 61 74 65 6d 65 6e 74 73 20 74 68 65 20 73  Statements the s
c810: 74 61 74 65 6d 65 6e 74 73 20 74 6f 20 75 73 65  tatements to use
c820: 20 74 6f 20 70 6f 70 75 6c 61 74 65 20 74 68 65   to populate the
c830: 20 64 62 2e 20 54 68 69 73 20 73 68 6f 75 6c 64   db. This should
c840: 20 62 65 20 61 20 73 69 6e 67 6c 65 20 73 74 72   be a single str
c850: 69 6e 67 0a 20 20 20 20 20 2a 20 20 20 6f 66 20  ing.     *   of 
c860: 74 68 65 20 66 6f 72 6d 20 72 65 74 75 72 6e 65  the form returne
c870: 64 20 62 79 20 73 71 6c 69 74 65 33 27 73 20 3c  d by sqlite3's <
c880: 74 74 3e 2e 64 75 6d 70 3c 2f 74 74 3e 20 63 6f  tt>.dump</tt> co
c890: 6d 6d 61 6e 64 20 28 73 74 61 74 65 6d 65 6e 74  mmand (statement
c8a0: 73 20 73 65 70 61 72 61 74 65 64 20 62 79 0a 20  s separated by. 
c8b0: 20 20 20 20 2a 20 20 20 73 65 6d 69 63 6f 6c 6f      *   semicolo
c8c0: 6e 73 29 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  ns).     */.    
c8d0: 73 74 61 74 69 63 20 70 75 62 6c 69 63 20 76 6f  static public vo
c8e0: 69 64 20 63 72 65 61 74 65 44 62 46 72 6f 6d 53  id createDbFromS
c8f0: 71 6c 53 74 61 74 65 6d 65 6e 74 73 28 0a 20 20  qlStatements(.  
c900: 20 20 20 20 20 20 20 20 20 20 43 6f 6e 74 65 78            Contex
c910: 74 20 63 6f 6e 74 65 78 74 2c 20 53 74 72 69 6e  t context, Strin
c920: 67 20 64 62 4e 61 6d 65 2c 20 69 6e 74 20 64 62  g dbName, int db
c930: 56 65 72 73 69 6f 6e 2c 20 53 74 72 69 6e 67 20  Version, String 
c940: 73 71 6c 53 74 61 74 65 6d 65 6e 74 73 29 20 7b  sqlStatements) {
c950: 0a 0a 20 20 20 20 20 20 20 20 46 69 6c 65 20 66  ..        File f
c960: 20 3d 20 63 6f 6e 74 65 78 74 2e 67 65 74 44 61   = context.getDa
c970: 74 61 62 61 73 65 50 61 74 68 28 64 62 4e 61 6d  tabasePath(dbNam
c980: 65 29 3b 0a 20 20 20 20 20 20 20 20 66 2e 67 65  e);.        f.ge
c990: 74 50 61 72 65 6e 74 46 69 6c 65 28 29 2e 6d 6b  tParentFile().mk
c9a0: 64 69 72 73 28 29 3b 0a 20 20 20 20 20 20 20 20  dirs();.        
c9b0: 53 51 4c 69 74 65 44 61 74 61 62 61 73 65 20 64  SQLiteDatabase d
c9c0: 62 20 3d 20 53 51 4c 69 74 65 44 61 74 61 62 61  b = SQLiteDataba
c9d0: 73 65 2e 6f 70 65 6e 4f 72 43 72 65 61 74 65 44  se.openOrCreateD
c9e0: 61 74 61 62 61 73 65 28 66 2c 20 6e 75 6c 6c 29  atabase(f, null)
c9f0: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 54 4f  ;..        // TO
ca00: 44 4f 3a 20 74 68 69 73 20 69 73 20 6e 6f 74 20  DO: this is not 
ca10: 71 75 69 74 65 20 73 61 66 65 20 73 69 6e 63 65  quite safe since
ca20: 20 69 74 20 61 73 73 75 6d 65 73 20 74 68 61 74   it assumes that
ca30: 20 61 6c 6c 20 73 65 6d 69 63 6f 6c 6f 6e 73 20   all semicolons 
ca40: 61 74 20 74 68 65 20 65 6e 64 20 6f 66 20 61 20  at the end of a 
ca50: 6c 69 6e 65 0a 20 20 20 20 20 20 20 20 2f 2f 20  line.        // 
ca60: 74 65 72 6d 69 6e 61 74 65 20 73 74 61 74 65 6d  terminate statem
ca70: 65 6e 74 73 2e 20 49 74 20 69 73 20 70 6f 73 73  ents. It is poss
ca80: 69 62 6c 65 20 74 68 61 74 20 61 20 74 65 78 74  ible that a text
ca90: 20 66 69 65 6c 64 20 63 6f 6e 74 61 69 6e 73 20   field contains 
caa0: 3b 5c 6e 2e 20 57 65 20 77 69 6c 6c 20 68 61 76  ;\n. We will hav
cab0: 65 20 74 6f 20 66 69 78 0a 20 20 20 20 20 20 20  e to fix.       
cac0: 20 2f 2f 20 74 68 69 73 20 69 66 20 74 68 61 74   // this if that
cad0: 20 74 75 72 6e 73 20 6f 75 74 20 74 6f 20 62 65   turns out to be
cae0: 20 61 20 70 72 6f 62 6c 65 6d 2e 0a 20 20 20 20   a problem..    
caf0: 20 20 20 20 53 74 72 69 6e 67 5b 5d 20 73 74 61      String[] sta
cb00: 74 65 6d 65 6e 74 73 20 3d 20 54 65 78 74 55 74  tements = TextUt
cb10: 69 6c 73 2e 73 70 6c 69 74 28 73 71 6c 53 74 61  ils.split(sqlSta
cb20: 74 65 6d 65 6e 74 73 2c 20 22 3b 5c 6e 22 29 3b  tements, ";\n");
cb30: 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28 53 74  .        for (St
cb40: 72 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 20 3a  ring statement :
cb50: 20 73 74 61 74 65 6d 65 6e 74 73 29 20 7b 0a 20   statements) {. 
cb60: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 54             if (T
cb70: 65 78 74 55 74 69 6c 73 2e 69 73 45 6d 70 74 79  extUtils.isEmpty
cb80: 28 73 74 61 74 65 6d 65 6e 74 29 29 20 63 6f 6e  (statement)) con
cb90: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
cba0: 20 20 20 64 62 2e 65 78 65 63 53 51 4c 28 73 74     db.execSQL(st
cbb0: 61 74 65 6d 65 6e 74 29 3b 0a 20 20 20 20 20 20  atement);.      
cbc0: 20 20 7d 0a 20 20 20 20 20 20 20 20 64 62 2e 73    }.        db.s
cbd0: 65 74 56 65 72 73 69 6f 6e 28 64 62 56 65 72 73  etVersion(dbVers
cbe0: 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 64 62  ion);.        db
cbf0: 2e 63 6c 6f 73 65 28 29 3b 0a 20 20 20 20 7d 0a  .close();.    }.
cc00: 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20  .    /**.     * 
cc10: 52 65 74 75 72 6e 73 20 6f 6e 65 20 6f 66 20 74  Returns one of t
cc20: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 77 68 69  he following whi
cc30: 63 68 20 72 65 70 72 65 73 65 6e 74 20 74 68 65  ch represent the
cc40: 20 74 79 70 65 20 6f 66 20 74 68 65 20 67 69 76   type of the giv
cc50: 65 6e 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  en SQL statement
cc60: 2e 0a 20 20 20 20 20 2a 20 3c 6f 6c 3e 0a 20 20  ..     * <ol>.  
cc70: 20 20 20 2a 20 20 20 3c 6c 69 3e 7b 40 6c 69 6e     *   <li>{@lin
cc80: 6b 20 23 53 54 41 54 45 4d 45 4e 54 5f 53 45 4c  k #STATEMENT_SEL
cc90: 45 43 54 7d 3c 2f 6c 69 3e 0a 20 20 20 20 20 2a  ECT}</li>.     *
cca0: 20 20 20 3c 6c 69 3e 7b 40 6c 69 6e 6b 20 23 53     <li>{@link #S
ccb0: 54 41 54 45 4d 45 4e 54 5f 55 50 44 41 54 45 7d  TATEMENT_UPDATE}
ccc0: 3c 2f 6c 69 3e 0a 20 20 20 20 20 2a 20 20 20 3c  </li>.     *   <
ccd0: 6c 69 3e 7b 40 6c 69 6e 6b 20 23 53 54 41 54 45  li>{@link #STATE
cce0: 4d 45 4e 54 5f 41 54 54 41 43 48 7d 3c 2f 6c 69  MENT_ATTACH}</li
ccf0: 3e 0a 20 20 20 20 20 2a 20 20 20 3c 6c 69 3e 7b  >.     *   <li>{
cd00: 40 6c 69 6e 6b 20 23 53 54 41 54 45 4d 45 4e 54  @link #STATEMENT
cd10: 5f 42 45 47 49 4e 7d 3c 2f 6c 69 3e 0a 20 20 20  _BEGIN}</li>.   
cd20: 20 20 2a 20 20 20 3c 6c 69 3e 7b 40 6c 69 6e 6b    *   <li>{@link
cd30: 20 23 53 54 41 54 45 4d 45 4e 54 5f 43 4f 4d 4d   #STATEMENT_COMM
cd40: 49 54 7d 3c 2f 6c 69 3e 0a 20 20 20 20 20 2a 20  IT}</li>.     * 
cd50: 20 20 3c 6c 69 3e 7b 40 6c 69 6e 6b 20 23 53 54    <li>{@link #ST
cd60: 41 54 45 4d 45 4e 54 5f 41 42 4f 52 54 7d 3c 2f  ATEMENT_ABORT}</
cd70: 6c 69 3e 0a 20 20 20 20 20 2a 20 20 20 3c 6c 69  li>.     *   <li
cd80: 3e 7b 40 6c 69 6e 6b 20 23 53 54 41 54 45 4d 45  >{@link #STATEME
cd90: 4e 54 5f 4f 54 48 45 52 7d 3c 2f 6c 69 3e 0a 20  NT_OTHER}</li>. 
cda0: 20 20 20 20 2a 20 3c 2f 6f 6c 3e 0a 20 20 20 20      * </ol>.    
cdb0: 20 2a 20 40 70 61 72 61 6d 20 73 71 6c 20 74 68   * @param sql th
cdc0: 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20  e SQL statement 
cdd0: 77 68 6f 73 65 20 74 79 70 65 20 69 73 20 72 65  whose type is re
cde0: 74 75 72 6e 65 64 20 62 79 20 74 68 69 73 20 6d  turned by this m
cdf0: 65 74 68 6f 64 0a 20 20 20 20 20 2a 20 40 72 65  ethod.     * @re
ce00: 74 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20  turn one of the 
ce10: 76 61 6c 75 65 73 20 6c 69 73 74 65 64 20 61 62  values listed ab
ce20: 6f 76 65 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  ove.     */.    
ce30: 70 75 62 6c 69 63 20 73 74 61 74 69 63 20 69 6e  public static in
ce40: 74 20 67 65 74 53 71 6c 53 74 61 74 65 6d 65 6e  t getSqlStatemen
ce50: 74 54 79 70 65 28 53 74 72 69 6e 67 20 73 71 6c  tType(String sql
ce60: 29 20 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 20  ) {.        sql 
ce70: 3d 20 73 71 6c 2e 74 72 69 6d 28 29 3b 0a 20 20  = sql.trim();.  
ce80: 20 20 20 20 20 20 69 66 20 28 73 71 6c 2e 6c 65        if (sql.le
ce90: 6e 67 74 68 28 29 20 3c 20 33 29 20 7b 0a 20 20  ngth() < 3) {.  
cea0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
ceb0: 20 53 54 41 54 45 4d 45 4e 54 5f 4f 54 48 45 52   STATEMENT_OTHER
cec0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
ced0: 20 20 20 20 53 74 72 69 6e 67 20 70 72 65 66 69      String prefi
cee0: 78 53 71 6c 20 3d 20 73 71 6c 2e 73 75 62 73 74  xSql = sql.subst
cef0: 72 69 6e 67 28 30 2c 20 33 29 2e 74 6f 55 70 70  ring(0, 3).toUpp
cf00: 65 72 43 61 73 65 28 4c 6f 63 61 6c 65 2e 52 4f  erCase(Locale.RO
cf10: 4f 54 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20  OT);.        if 
cf20: 28 70 72 65 66 69 78 53 71 6c 2e 65 71 75 61 6c  (prefixSql.equal
cf30: 73 28 22 53 45 4c 22 29 29 20 7b 0a 20 20 20 20  s("SEL")) {.    
cf40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
cf50: 54 41 54 45 4d 45 4e 54 5f 53 45 4c 45 43 54 3b  TATEMENT_SELECT;
cf60: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
cf70: 69 66 20 28 70 72 65 66 69 78 53 71 6c 2e 65 71  if (prefixSql.eq
cf80: 75 61 6c 73 28 22 49 4e 53 22 29 20 7c 7c 0a 20  uals("INS") ||. 
cf90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
cfa0: 72 65 66 69 78 53 71 6c 2e 65 71 75 61 6c 73 28  refixSql.equals(
cfb0: 22 55 50 44 22 29 20 7c 7c 0a 20 20 20 20 20 20  "UPD") ||.      
cfc0: 20 20 20 20 20 20 20 20 20 20 70 72 65 66 69 78            prefix
cfd0: 53 71 6c 2e 65 71 75 61 6c 73 28 22 52 45 50 22  Sql.equals("REP"
cfe0: 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ) ||.           
cff0: 20 20 20 20 20 70 72 65 66 69 78 53 71 6c 2e 65       prefixSql.e
d000: 71 75 61 6c 73 28 22 44 45 4c 22 29 29 20 7b 0a  quals("DEL")) {.
d010: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
d020: 72 6e 20 53 54 41 54 45 4d 45 4e 54 5f 55 50 44  rn STATEMENT_UPD
d030: 41 54 45 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  ATE;.        } e
d040: 6c 73 65 20 69 66 20 28 70 72 65 66 69 78 53 71  lse if (prefixSq
d050: 6c 2e 65 71 75 61 6c 73 28 22 41 54 54 22 29 29  l.equals("ATT"))
d060: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72   {.            r
d070: 65 74 75 72 6e 20 53 54 41 54 45 4d 45 4e 54 5f  eturn STATEMENT_
d080: 41 54 54 41 43 48 3b 0a 20 20 20 20 20 20 20 20  ATTACH;.        
d090: 7d 20 65 6c 73 65 20 69 66 20 28 70 72 65 66 69  } else if (prefi
d0a0: 78 53 71 6c 2e 65 71 75 61 6c 73 28 22 43 4f 4d  xSql.equals("COM
d0b0: 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ")) {.          
d0c0: 20 20 72 65 74 75 72 6e 20 53 54 41 54 45 4d 45    return STATEME
d0d0: 4e 54 5f 43 4f 4d 4d 49 54 3b 0a 20 20 20 20 20  NT_COMMIT;.     
d0e0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 70 72     } else if (pr
d0f0: 65 66 69 78 53 71 6c 2e 65 71 75 61 6c 73 28 22  efixSql.equals("
d100: 45 4e 44 22 29 29 20 7b 0a 20 20 20 20 20 20 20  END")) {.       
d110: 20 20 20 20 20 72 65 74 75 72 6e 20 53 54 41 54       return STAT
d120: 45 4d 45 4e 54 5f 43 4f 4d 4d 49 54 3b 0a 20 20  EMENT_COMMIT;.  
d130: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69 66 20        } else if 
d140: 28 70 72 65 66 69 78 53 71 6c 2e 65 71 75 61 6c  (prefixSql.equal
d150: 73 28 22 52 4f 4c 22 29 29 20 7b 0a 20 20 20 20  s("ROL")) {.    
d160: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 53          return S
d170: 54 41 54 45 4d 45 4e 54 5f 41 42 4f 52 54 3b 0a  TATEMENT_ABORT;.
d180: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 69          } else i
d190: 66 20 28 70 72 65 66 69 78 53 71 6c 2e 65 71 75  f (prefixSql.equ
d1a0: 61 6c 73 28 22 42 45 47 22 29 29 20 7b 0a 20 20  als("BEG")) {.  
d1b0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
d1c0: 20 53 54 41 54 45 4d 45 4e 54 5f 42 45 47 49 4e   STATEMENT_BEGIN
d1d0: 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ;.        } else
d1e0: 20 69 66 20 28 70 72 65 66 69 78 53 71 6c 2e 65   if (prefixSql.e
d1f0: 71 75 61 6c 73 28 22 50 52 41 22 29 29 20 7b 0a  quals("PRA")) {.
d200: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
d210: 72 6e 20 53 54 41 54 45 4d 45 4e 54 5f 50 52 41  rn STATEMENT_PRA
d220: 47 4d 41 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  GMA;.        } e
d230: 6c 73 65 20 69 66 20 28 70 72 65 66 69 78 53 71  lse if (prefixSq
d240: 6c 2e 65 71 75 61 6c 73 28 22 43 52 45 22 29 20  l.equals("CRE") 
d250: 7c 7c 20 70 72 65 66 69 78 53 71 6c 2e 65 71 75  || prefixSql.equ
d260: 61 6c 73 28 22 44 52 4f 22 29 20 7c 7c 0a 20 20  als("DRO") ||.  
d270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 72                pr
d280: 65 66 69 78 53 71 6c 2e 65 71 75 61 6c 73 28 22  efixSql.equals("
d290: 41 4c 54 22 29 29 20 7b 0a 20 20 20 20 20 20 20  ALT")) {.       
d2a0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 54 41 54       return STAT
d2b0: 45 4d 45 4e 54 5f 44 44 4c 3b 0a 20 20 20 20 20  EMENT_DDL;.     
d2c0: 20 20 20 7d 20 65 6c 73 65 20 69 66 20 28 70 72     } else if (pr
d2d0: 65 66 69 78 53 71 6c 2e 65 71 75 61 6c 73 28 22  efixSql.equals("
d2e0: 41 4e 41 22 29 20 7c 7c 20 70 72 65 66 69 78 53  ANA") || prefixS
d2f0: 71 6c 2e 65 71 75 61 6c 73 28 22 44 45 54 22 29  ql.equals("DET")
d300: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
d310: 72 65 74 75 72 6e 20 53 54 41 54 45 4d 45 4e 54  return STATEMENT
d320: 5f 55 4e 50 52 45 50 41 52 45 44 3b 0a 20 20 20  _UNPREPARED;.   
d330: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 72       }.        r
d340: 65 74 75 72 6e 20 53 54 41 54 45 4d 45 4e 54 5f  eturn STATEMENT_
d350: 4f 54 48 45 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  OTHER;.    }..  
d360: 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 41 70 70    /**.     * App
d370: 65 6e 64 73 20 6f 6e 65 20 73 65 74 20 6f 66 20  ends one set of 
d380: 73 65 6c 65 63 74 69 6f 6e 20 61 72 67 73 20 74  selection args t
d390: 6f 20 61 6e 6f 74 68 65 72 2e 20 54 68 69 73 20  o another. This 
d3a0: 69 73 20 75 73 65 66 75 6c 20 77 68 65 6e 20 61  is useful when a
d3b0: 64 64 69 6e 67 20 61 20 73 65 6c 65 63 74 69 6f  dding a selectio
d3c0: 6e 0a 20 20 20 20 20 2a 20 61 72 67 75 6d 65 6e  n.     * argumen
d3d0: 74 20 74 6f 20 61 20 75 73 65 72 20 70 72 6f 76  t to a user prov
d3e0: 69 64 65 64 20 73 65 74 2e 0a 20 20 20 20 20 2a  ided set..     *
d3f0: 2f 0a 20 20 20 20 70 75 62 6c 69 63 20 73 74 61  /.    public sta
d400: 74 69 63 20 53 74 72 69 6e 67 5b 5d 20 61 70 70  tic String[] app
d410: 65 6e 64 53 65 6c 65 63 74 69 6f 6e 41 72 67 73  endSelectionArgs
d420: 28 53 74 72 69 6e 67 5b 5d 20 6f 72 69 67 69 6e  (String[] origin
d430: 61 6c 56 61 6c 75 65 73 2c 20 53 74 72 69 6e 67  alValues, String
d440: 5b 5d 20 6e 65 77 56 61 6c 75 65 73 29 20 7b 0a  [] newValues) {.
d450: 20 20 20 20 20 20 20 20 69 66 20 28 6f 72 69 67          if (orig
d460: 69 6e 61 6c 56 61 6c 75 65 73 20 3d 3d 20 6e 75  inalValues == nu
d470: 6c 6c 20 7c 7c 20 6f 72 69 67 69 6e 61 6c 56 61  ll || originalVa
d480: 6c 75 65 73 2e 6c 65 6e 67 74 68 20 3d 3d 20 30  lues.length == 0
d490: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
d4a0: 72 65 74 75 72 6e 20 6e 65 77 56 61 6c 75 65 73  return newValues
d4b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d4c0: 20 20 20 20 53 74 72 69 6e 67 5b 5d 20 72 65 73      String[] res
d4d0: 75 6c 74 20 3d 20 6e 65 77 20 53 74 72 69 6e 67  ult = new String
d4e0: 5b 6f 72 69 67 69 6e 61 6c 56 61 6c 75 65 73 2e  [originalValues.
d4f0: 6c 65 6e 67 74 68 20 2b 20 6e 65 77 56 61 6c 75  length + newValu
d500: 65 73 2e 6c 65 6e 67 74 68 20 5d 3b 0a 20 20 20  es.length ];.   
d510: 20 20 20 20 20 53 79 73 74 65 6d 2e 61 72 72 61       System.arra
d520: 79 63 6f 70 79 28 6f 72 69 67 69 6e 61 6c 56 61  ycopy(originalVa
d530: 6c 75 65 73 2c 20 30 2c 20 72 65 73 75 6c 74 2c  lues, 0, result,
d540: 20 30 2c 20 6f 72 69 67 69 6e 61 6c 56 61 6c 75   0, originalValu
d550: 65 73 2e 6c 65 6e 67 74 68 29 3b 0a 20 20 20 20  es.length);.    
d560: 20 20 20 20 53 79 73 74 65 6d 2e 61 72 72 61 79      System.array
d570: 63 6f 70 79 28 6e 65 77 56 61 6c 75 65 73 2c 20  copy(newValues, 
d580: 30 2c 20 72 65 73 75 6c 74 2c 20 6f 72 69 67 69  0, result, origi
d590: 6e 61 6c 56 61 6c 75 65 73 2e 6c 65 6e 67 74 68  nalValues.length
d5a0: 2c 20 6e 65 77 56 61 6c 75 65 73 2e 6c 65 6e 67  , newValues.leng
d5b0: 74 68 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  th);.        ret
d5c0: 75 72 6e 20 72 65 73 75 6c 74 3b 0a 20 20 20 20  urn result;.    
d5d0: 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20  }..    /**.     
d5e0: 2a 20 52 65 74 75 72 6e 73 20 63 6f 6c 75 6d 6e  * Returns column
d5f0: 20 69 6e 64 65 78 20 6f 66 20 22 5f 69 64 22 20   index of "_id" 
d600: 63 6f 6c 75 6d 6e 2c 20 6f 72 20 2d 31 20 69 66  column, or -1 if
d610: 20 6e 6f 74 20 66 6f 75 6e 64 2e 0a 20 20 20 20   not found..    
d620: 20 2a 20 40 68 69 64 65 0a 20 20 20 20 20 2a 2f   * @hide.     */
d630: 0a 20 20 20 20 70 75 62 6c 69 63 20 73 74 61 74  .    public stat
d640: 69 63 20 69 6e 74 20 66 69 6e 64 52 6f 77 49 64  ic int findRowId
d650: 43 6f 6c 75 6d 6e 49 6e 64 65 78 28 53 74 72 69  ColumnIndex(Stri
d660: 6e 67 5b 5d 20 63 6f 6c 75 6d 6e 4e 61 6d 65 73  ng[] columnNames
d670: 29 20 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  ) {.        int 
d680: 6c 65 6e 67 74 68 20 3d 20 63 6f 6c 75 6d 6e 4e  length = columnN
d690: 61 6d 65 73 2e 6c 65 6e 67 74 68 3b 0a 20 20 20  ames.length;.   
d6a0: 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20       for (int i 
d6b0: 3d 20 30 3b 20 69 20 3c 20 6c 65 6e 67 74 68 3b  = 0; i < length;
d6c0: 20 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20   i++) {.        
d6d0: 20 20 20 20 69 66 20 28 63 6f 6c 75 6d 6e 4e 61      if (columnNa
d6e0: 6d 65 73 5b 69 5d 2e 65 71 75 61 6c 73 28 22 5f  mes[i].equals("_
d6f0: 69 64 22 29 29 20 7b 0a 20 20 20 20 20 20 20 20  id")) {.        
d700: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 69          return i
d710: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
d720: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
d730: 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20    return -1;.   
d740: 20 7d 0a 7d 0a                                    }.}.