SQLite Android Bindings
Hex Artifact Content
Not logged in

Artifact de0e478dfa5c435aeb4e23ddc0040f0ee6abc68d:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 32 30 30 36 20 54 68 65 20 41 6e 64  (C) 2006 The And
0020: 72 6f 69 64 20 4f 70 65 6e 20 53 6f 75 72 63 65  roid Open Source
0030: 20 50 72 6f 6a 65 63 74 0a 20 2a 0a 20 2a 20 4c   Project. *. * L
0040: 69 63 65 6e 73 65 64 20 75 6e 64 65 72 20 74 68  icensed under th
0050: 65 20 41 70 61 63 68 65 20 4c 69 63 65 6e 73 65  e Apache License
0060: 2c 20 56 65 72 73 69 6f 6e 20 32 2e 30 20 28 74  , Version 2.0 (t
0070: 68 65 20 22 4c 69 63 65 6e 73 65 22 29 3b 0a 20  he "License");. 
0080: 2a 20 79 6f 75 20 6d 61 79 20 6e 6f 74 20 75 73  * you may not us
0090: 65 20 74 68 69 73 20 66 69 6c 65 20 65 78 63 65  e this file exce
00a0: 70 74 20 69 6e 20 63 6f 6d 70 6c 69 61 6e 63 65  pt in compliance
00b0: 20 77 69 74 68 20 74 68 65 20 4c 69 63 65 6e 73   with the Licens
00c0: 65 2e 0a 20 2a 20 59 6f 75 20 6d 61 79 20 6f 62  e.. * You may ob
00d0: 74 61 69 6e 20 61 20 63 6f 70 79 20 6f 66 20 74  tain a copy of t
00e0: 68 65 20 4c 69 63 65 6e 73 65 20 61 74 0a 20 2a  he License at. *
00f0: 0a 20 2a 20 20 20 20 20 20 68 74 74 70 3a 2f 2f  . *      http://
0100: 77 77 77 2e 61 70 61 63 68 65 2e 6f 72 67 2f 6c  www.apache.org/l
0110: 69 63 65 6e 73 65 73 2f 4c 49 43 45 4e 53 45 2d  icenses/LICENSE-
0120: 32 2e 30 0a 20 2a 0a 20 2a 20 55 6e 6c 65 73 73  2.0. *. * Unless
0130: 20 72 65 71 75 69 72 65 64 20 62 79 20 61 70 70   required by app
0140: 6c 69 63 61 62 6c 65 20 6c 61 77 20 6f 72 20 61  licable law or a
0150: 67 72 65 65 64 20 74 6f 20 69 6e 20 77 72 69 74  greed to in writ
0160: 69 6e 67 2c 20 73 6f 66 74 77 61 72 65 0a 20 2a  ing, software. *
0170: 20 64 69 73 74 72 69 62 75 74 65 64 20 75 6e 64   distributed und
0180: 65 72 20 74 68 65 20 4c 69 63 65 6e 73 65 20 69  er the License i
0190: 73 20 64 69 73 74 72 69 62 75 74 65 64 20 6f 6e  s distributed on
01a0: 20 61 6e 20 22 41 53 20 49 53 22 20 42 41 53 49   an "AS IS" BASI
01b0: 53 2c 0a 20 2a 20 57 49 54 48 4f 55 54 20 57 41  S,. * WITHOUT WA
01c0: 52 52 41 4e 54 49 45 53 20 4f 52 20 43 4f 4e 44  RRANTIES OR COND
01d0: 49 54 49 4f 4e 53 20 4f 46 20 41 4e 59 20 4b 49  ITIONS OF ANY KI
01e0: 4e 44 2c 20 65 69 74 68 65 72 20 65 78 70 72 65  ND, either expre
01f0: 73 73 20 6f 72 20 69 6d 70 6c 69 65 64 2e 0a 20  ss or implied.. 
0200: 2a 20 53 65 65 20 74 68 65 20 4c 69 63 65 6e 73  * See the Licens
0210: 65 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  e for the specif
0220: 69 63 20 6c 61 6e 67 75 61 67 65 20 67 6f 76 65  ic language gove
0230: 72 6e 69 6e 67 20 70 65 72 6d 69 73 73 69 6f 6e  rning permission
0240: 73 20 61 6e 64 0a 20 2a 20 6c 69 6d 69 74 61 74  s and. * limitat
0250: 69 6f 6e 73 20 75 6e 64 65 72 20 74 68 65 20 4c  ions under the L
0260: 69 63 65 6e 73 65 2e 0a 20 2a 2f 0a 2f 2a 0a 2a  icense.. */./*.*
0270: 2a 20 4d 6f 64 69 66 69 65 64 20 74 6f 20 73 75  * Modified to su
0280: 70 70 6f 72 74 20 53 51 4c 69 74 65 20 65 78 74  pport SQLite ext
0290: 65 6e 73 69 6f 6e 73 20 62 79 20 74 68 65 20 53  ensions by the S
02a0: 51 4c 69 74 65 20 64 65 76 65 6c 6f 70 65 72 73  QLite developers
02b0: 3a 20 0a 2a 2a 20 73 71 6c 69 74 65 2d 64 65 76  : .** sqlite-dev
02c0: 40 73 71 6c 69 74 65 2e 6f 72 67 2e 0a 2a 2f 0a  @sqlite.org..*/.
02d0: 0a 70 61 63 6b 61 67 65 20 6f 72 67 2e 73 71 6c  .package org.sql
02e0: 69 74 65 2e 64 61 74 61 62 61 73 65 2e 73 71 6c  ite.database.sql
02f0: 69 74 65 3b 0a 0a 69 6d 70 6f 72 74 20 6f 72 67  ite;..import org
0300: 2e 73 71 6c 69 74 65 2e 64 61 74 61 62 61 73 65  .sqlite.database
0310: 2e 45 78 74 72 61 55 74 69 6c 73 3b 0a 0a 69 6d  .ExtraUtils;..im
0320: 70 6f 72 74 20 61 6e 64 72 6f 69 64 2e 64 61 74  port android.dat
0330: 61 62 61 73 65 2e 41 62 73 74 72 61 63 74 57 69  abase.AbstractWi
0340: 6e 64 6f 77 65 64 43 75 72 73 6f 72 3b 0a 69 6d  ndowedCursor;.im
0350: 70 6f 72 74 20 61 6e 64 72 6f 69 64 2e 64 61 74  port android.dat
0360: 61 62 61 73 65 2e 43 75 72 73 6f 72 57 69 6e 64  abase.CursorWind
0370: 6f 77 3b 0a 0a 69 6d 70 6f 72 74 20 61 6e 64 72  ow;..import andr
0380: 6f 69 64 2e 6f 73 2e 53 74 72 69 63 74 4d 6f 64  oid.os.StrictMod
0390: 65 3b 0a 69 6d 70 6f 72 74 20 61 6e 64 72 6f 69  e;.import androi
03a0: 64 2e 75 74 69 6c 2e 4c 6f 67 3b 0a 0a 69 6d 70  d.util.Log;..imp
03b0: 6f 72 74 20 6a 61 76 61 2e 75 74 69 6c 2e 48 61  ort java.util.Ha
03c0: 73 68 4d 61 70 3b 0a 69 6d 70 6f 72 74 20 6a 61  shMap;.import ja
03d0: 76 61 2e 75 74 69 6c 2e 4d 61 70 3b 0a 0a 2f 2a  va.util.Map;../*
03e0: 2a 0a 20 2a 20 41 20 43 75 72 73 6f 72 20 69 6d  *. * A Cursor im
03f0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 74 68 61  plementation tha
0400: 74 20 65 78 70 6f 73 65 73 20 72 65 73 75 6c 74  t exposes result
0410: 73 20 66 72 6f 6d 20 61 20 71 75 65 72 79 20 6f  s from a query o
0420: 6e 20 61 0a 20 2a 20 7b 40 6c 69 6e 6b 20 53 51  n a. * {@link SQ
0430: 4c 69 74 65 44 61 74 61 62 61 73 65 7d 2e 0a 20  LiteDatabase}.. 
0440: 2a 0a 20 2a 20 53 51 4c 69 74 65 43 75 72 73 6f  *. * SQLiteCurso
0450: 72 20 69 73 20 6e 6f 74 20 69 6e 74 65 72 6e 61  r is not interna
0460: 6c 6c 79 20 73 79 6e 63 68 72 6f 6e 69 7a 65 64  lly synchronized
0470: 20 73 6f 20 63 6f 64 65 20 75 73 69 6e 67 20 61   so code using a
0480: 20 53 51 4c 69 74 65 43 75 72 73 6f 72 20 66 72   SQLiteCursor fr
0490: 6f 6d 20 6d 75 6c 74 69 70 6c 65 0a 20 2a 20 74  om multiple. * t
04a0: 68 72 65 61 64 73 20 73 68 6f 75 6c 64 20 70 65  hreads should pe
04b0: 72 66 6f 72 6d 20 69 74 73 20 6f 77 6e 20 73 79  rform its own sy
04c0: 6e 63 68 72 6f 6e 69 7a 61 74 69 6f 6e 20 77 68  nchronization wh
04d0: 65 6e 20 75 73 69 6e 67 20 74 68 65 20 53 51 4c  en using the SQL
04e0: 69 74 65 43 75 72 73 6f 72 2e 0a 20 2a 2f 0a 70  iteCursor.. */.p
04f0: 75 62 6c 69 63 20 63 6c 61 73 73 20 53 51 4c 69  ublic class SQLi
0500: 74 65 43 75 72 73 6f 72 20 65 78 74 65 6e 64 73  teCursor extends
0510: 20 41 62 73 74 72 61 63 74 57 69 6e 64 6f 77 65   AbstractWindowe
0520: 64 43 75 72 73 6f 72 20 7b 0a 20 20 20 20 73 74  dCursor {.    st
0530: 61 74 69 63 20 66 69 6e 61 6c 20 53 74 72 69 6e  atic final Strin
0540: 67 20 54 41 47 20 3d 20 22 53 51 4c 69 74 65 43  g TAG = "SQLiteC
0550: 75 72 73 6f 72 22 3b 0a 20 20 20 20 73 74 61 74  ursor";.    stat
0560: 69 63 20 66 69 6e 61 6c 20 69 6e 74 20 4e 4f 5f  ic final int NO_
0570: 43 4f 55 4e 54 20 3d 20 2d 31 3b 0a 0a 20 20 20  COUNT = -1;..   
0580: 20 2f 2a 2a 20 54 68 65 20 6e 61 6d 65 20 6f 66   /** The name of
0590: 20 74 68 65 20 74 61 62 6c 65 20 74 6f 20 65 64   the table to ed
05a0: 69 74 20 2a 2f 0a 20 20 20 20 70 72 69 76 61 74  it */.    privat
05b0: 65 20 66 69 6e 61 6c 20 53 74 72 69 6e 67 20 6d  e final String m
05c0: 45 64 69 74 54 61 62 6c 65 3b 0a 0a 20 20 20 20  EditTable;..    
05d0: 2f 2a 2a 20 54 68 65 20 6e 61 6d 65 73 20 6f 66  /** The names of
05e0: 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 69 6e 20   the columns in 
05f0: 74 68 65 20 72 6f 77 73 20 2a 2f 0a 20 20 20 20  the rows */.    
0600: 70 72 69 76 61 74 65 20 66 69 6e 61 6c 20 53 74  private final St
0610: 72 69 6e 67 5b 5d 20 6d 43 6f 6c 75 6d 6e 73 3b  ring[] mColumns;
0620: 0a 0a 20 20 20 20 2f 2a 2a 20 54 68 65 20 71 75  ..    /** The qu
0630: 65 72 79 20 6f 62 6a 65 63 74 20 66 6f 72 20 74  ery object for t
0640: 68 65 20 63 75 72 73 6f 72 20 2a 2f 0a 20 20 20  he cursor */.   
0650: 20 70 72 69 76 61 74 65 20 66 69 6e 61 6c 20 53   private final S
0660: 51 4c 69 74 65 51 75 65 72 79 20 6d 51 75 65 72  QLiteQuery mQuer
0670: 79 3b 0a 0a 20 20 20 20 2f 2a 2a 20 54 68 65 20  y;..    /** The 
0680: 63 6f 6d 70 69 6c 65 64 20 71 75 65 72 79 20 74  compiled query t
0690: 68 69 73 20 63 75 72 73 6f 72 20 63 61 6d 65 20  his cursor came 
06a0: 66 72 6f 6d 20 2a 2f 0a 20 20 20 20 70 72 69 76  from */.    priv
06b0: 61 74 65 20 66 69 6e 61 6c 20 53 51 4c 69 74 65  ate final SQLite
06c0: 43 75 72 73 6f 72 44 72 69 76 65 72 20 6d 44 72  CursorDriver mDr
06d0: 69 76 65 72 3b 0a 0a 20 20 20 20 2f 2a 2a 20 54  iver;..    /** T
06e0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
06f0: 73 20 69 6e 20 74 68 65 20 63 75 72 73 6f 72 20  s in the cursor 
0700: 2a 2f 0a 20 20 20 20 70 72 69 76 61 74 65 20 69  */.    private i
0710: 6e 74 20 6d 43 6f 75 6e 74 20 3d 20 4e 4f 5f 43  nt mCount = NO_C
0720: 4f 55 4e 54 3b 0a 0a 20 20 20 20 2f 2a 2a 20 54  OUNT;..    /** T
0730: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 72 6f 77  he number of row
0740: 73 20 74 68 61 74 20 63 61 6e 20 66 69 74 20 69  s that can fit i
0750: 6e 20 74 68 65 20 63 75 72 73 6f 72 20 77 69 6e  n the cursor win
0760: 64 6f 77 2c 20 30 20 69 66 20 75 6e 6b 6e 6f 77  dow, 0 if unknow
0770: 6e 20 2a 2f 0a 20 20 20 20 70 72 69 76 61 74 65  n */.    private
0780: 20 69 6e 74 20 6d 43 75 72 73 6f 72 57 69 6e 64   int mCursorWind
0790: 6f 77 43 61 70 61 63 69 74 79 3b 0a 0a 20 20 20  owCapacity;..   
07a0: 20 2f 2a 2a 20 41 20 6d 61 70 70 69 6e 67 20 6f   /** A mapping o
07b0: 66 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 74  f column names t
07c0: 6f 20 63 6f 6c 75 6d 6e 20 69 6e 64 69 63 65 73  o column indices
07d0: 2c 20 74 6f 20 73 70 65 65 64 20 75 70 20 6c 6f  , to speed up lo
07e0: 6f 6b 75 70 73 20 2a 2f 0a 20 20 20 20 70 72 69  okups */.    pri
07f0: 76 61 74 65 20 4d 61 70 3c 53 74 72 69 6e 67 2c  vate Map<String,
0800: 20 49 6e 74 65 67 65 72 3e 20 6d 43 6f 6c 75 6d   Integer> mColum
0810: 6e 4e 61 6d 65 4d 61 70 3b 0a 0a 20 20 20 20 2f  nNameMap;..    /
0820: 2a 2a 20 55 73 65 64 20 74 6f 20 66 69 6e 64 20  ** Used to find 
0830: 6f 75 74 20 77 68 65 72 65 20 61 20 63 75 72 73  out where a curs
0840: 6f 72 20 77 61 73 20 61 6c 6c 6f 63 61 74 65 64  or was allocated
0850: 20 69 6e 20 63 61 73 65 20 69 74 20 6e 65 76 65   in case it neve
0860: 72 20 67 6f 74 20 72 65 6c 65 61 73 65 64 2e 20  r got released. 
0870: 2a 2f 0a 20 20 20 20 70 72 69 76 61 74 65 20 66  */.    private f
0880: 69 6e 61 6c 20 54 68 72 6f 77 61 62 6c 65 20 6d  inal Throwable m
0890: 53 74 61 63 6b 54 72 61 63 65 3b 0a 0a 20 20 20  StackTrace;..   
08a0: 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 45 78 65 63   /**.     * Exec
08b0: 75 74 65 20 61 20 71 75 65 72 79 20 61 6e 64 20  ute a query and 
08c0: 70 72 6f 76 69 64 65 20 61 63 63 65 73 73 20 74  provide access t
08d0: 6f 20 69 74 73 20 72 65 73 75 6c 74 20 73 65 74  o its result set
08e0: 20 74 68 72 6f 75 67 68 20 61 20 43 75 72 73 6f   through a Curso
08f0: 72 0a 20 20 20 20 20 2a 20 69 6e 74 65 72 66 61  r.     * interfa
0900: 63 65 2e 20 46 6f 72 20 61 20 71 75 65 72 79 20  ce. For a query 
0910: 73 75 63 68 20 61 73 3a 20 7b 40 63 6f 64 65 20  such as: {@code 
0920: 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 62 69 72  SELECT name, bir
0930: 74 68 2c 20 70 68 6f 6e 65 20 46 52 4f 4d 0a 20  th, phone FROM. 
0940: 20 20 20 20 2a 20 6d 79 54 61 62 6c 65 20 57 48      * myTable WH
0950: 45 52 45 20 2e 2e 2e 20 4c 49 4d 49 54 20 31 2c  ERE ... LIMIT 1,
0960: 32 30 20 4f 52 44 45 52 20 42 59 2e 2e 2e 7d 20  20 ORDER BY...} 
0970: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  the column names
0980: 20 28 6e 61 6d 65 2c 20 62 69 72 74 68 2c 0a 20   (name, birth,. 
0990: 20 20 20 20 2a 20 70 68 6f 6e 65 29 20 77 6f 75      * phone) wou
09a0: 6c 64 20 62 65 20 69 6e 20 74 68 65 20 70 72 6f  ld be in the pro
09b0: 6a 65 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  jection argument
09c0: 20 61 6e 64 20 65 76 65 72 79 74 68 69 6e 67 20   and everything 
09d0: 66 72 6f 6d 0a 20 20 20 20 20 2a 20 7b 40 63 6f  from.     * {@co
09e0: 64 65 20 46 52 4f 4d 7d 20 6f 6e 77 61 72 64 20  de FROM} onward 
09f0: 77 6f 75 6c 64 20 62 65 20 69 6e 20 74 68 65 20  would be in the 
0a00: 70 61 72 61 6d 73 20 61 72 67 75 6d 65 6e 74 2e  params argument.
0a10: 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40  .     *.     * @
0a20: 70 61 72 61 6d 20 64 62 20 61 20 72 65 66 65 72  param db a refer
0a30: 65 6e 63 65 20 74 6f 20 61 20 44 61 74 61 62 61  ence to a Databa
0a40: 73 65 20 6f 62 6a 65 63 74 20 74 68 61 74 20 69  se object that i
0a50: 73 20 61 6c 72 65 61 64 79 20 63 6f 6e 73 74 72  s already constr
0a60: 75 63 74 65 64 0a 20 20 20 20 20 2a 20 20 20 20  ucted.     *    
0a70: 20 61 6e 64 20 6f 70 65 6e 65 64 2e 20 54 68 69   and opened. Thi
0a80: 73 20 70 61 72 61 6d 20 69 73 20 6e 6f 74 20 75  s param is not u
0a90: 73 65 64 20 61 6e 79 20 6c 6f 6e 67 65 72 0a 20  sed any longer. 
0aa0: 20 20 20 20 2a 20 40 70 61 72 61 6d 20 65 64 69      * @param edi
0ab0: 74 54 61 62 6c 65 20 74 68 65 20 6e 61 6d 65 20  tTable the name 
0ac0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 75 73 65  of the table use
0ad0: 64 20 66 6f 72 20 74 68 69 73 20 71 75 65 72 79  d for this query
0ae0: 0a 20 20 20 20 20 2a 20 40 70 61 72 61 6d 20 71  .     * @param q
0af0: 75 65 72 79 20 74 68 65 20 72 65 73 74 20 6f 66  uery the rest of
0b00: 20 74 68 65 20 71 75 65 72 79 20 74 65 72 6d 73   the query terms
0b10: 0a 20 20 20 20 20 2a 20 20 20 20 20 63 75 72 73  .     *     curs
0b20: 6f 72 20 69 73 20 66 69 6e 61 6c 69 7a 65 64 0a  or is finalized.
0b30: 20 20 20 20 20 2a 20 40 64 65 70 72 65 63 61 74       * @deprecat
0b40: 65 64 20 75 73 65 20 7b 40 6c 69 6e 6b 20 23 53  ed use {@link #S
0b50: 51 4c 69 74 65 43 75 72 73 6f 72 28 53 51 4c 69  QLiteCursor(SQLi
0b60: 74 65 43 75 72 73 6f 72 44 72 69 76 65 72 2c 20  teCursorDriver, 
0b70: 53 74 72 69 6e 67 2c 20 53 51 4c 69 74 65 51 75  String, SQLiteQu
0b80: 65 72 79 29 7d 20 69 6e 73 74 65 61 64 0a 20 20  ery)} instead.  
0b90: 20 20 20 2a 2f 0a 20 20 20 20 40 44 65 70 72 65     */.    @Depre
0ba0: 63 61 74 65 64 0a 20 20 20 20 70 75 62 6c 69 63  cated.    public
0bb0: 20 53 51 4c 69 74 65 43 75 72 73 6f 72 28 53 51   SQLiteCursor(SQ
0bc0: 4c 69 74 65 44 61 74 61 62 61 73 65 20 64 62 2c  LiteDatabase db,
0bd0: 20 53 51 4c 69 74 65 43 75 72 73 6f 72 44 72 69   SQLiteCursorDri
0be0: 76 65 72 20 64 72 69 76 65 72 2c 0a 20 20 20 20  ver driver,.    
0bf0: 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 20 65          String e
0c00: 64 69 74 54 61 62 6c 65 2c 20 53 51 4c 69 74 65  ditTable, SQLite
0c10: 51 75 65 72 79 20 71 75 65 72 79 29 20 7b 0a 20  Query query) {. 
0c20: 20 20 20 20 20 20 20 74 68 69 73 28 64 72 69 76         this(driv
0c30: 65 72 2c 20 65 64 69 74 54 61 62 6c 65 2c 20 71  er, editTable, q
0c40: 75 65 72 79 29 3b 0a 20 20 20 20 7d 0a 0a 20 20  uery);.    }..  
0c50: 20 20 2f 2a 2a 0a 20 20 20 20 20 2a 20 45 78 65    /**.     * Exe
0c60: 63 75 74 65 20 61 20 71 75 65 72 79 20 61 6e 64  cute a query and
0c70: 20 70 72 6f 76 69 64 65 20 61 63 63 65 73 73 20   provide access 
0c80: 74 6f 20 69 74 73 20 72 65 73 75 6c 74 20 73 65  to its result se
0c90: 74 20 74 68 72 6f 75 67 68 20 61 20 43 75 72 73  t through a Curs
0ca0: 6f 72 0a 20 20 20 20 20 2a 20 69 6e 74 65 72 66  or.     * interf
0cb0: 61 63 65 2e 20 46 6f 72 20 61 20 71 75 65 72 79  ace. For a query
0cc0: 20 73 75 63 68 20 61 73 3a 20 7b 40 63 6f 64 65   such as: {@code
0cd0: 20 53 45 4c 45 43 54 20 6e 61 6d 65 2c 20 62 69   SELECT name, bi
0ce0: 72 74 68 2c 20 70 68 6f 6e 65 20 46 52 4f 4d 0a  rth, phone FROM.
0cf0: 20 20 20 20 20 2a 20 6d 79 54 61 62 6c 65 20 57       * myTable W
0d00: 48 45 52 45 20 2e 2e 2e 20 4c 49 4d 49 54 20 31  HERE ... LIMIT 1
0d10: 2c 32 30 20 4f 52 44 45 52 20 42 59 2e 2e 2e 7d  ,20 ORDER BY...}
0d20: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
0d30: 73 20 28 6e 61 6d 65 2c 20 62 69 72 74 68 2c 0a  s (name, birth,.
0d40: 20 20 20 20 20 2a 20 70 68 6f 6e 65 29 20 77 6f       * phone) wo
0d50: 75 6c 64 20 62 65 20 69 6e 20 74 68 65 20 70 72  uld be in the pr
0d60: 6f 6a 65 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e  ojection argumen
0d70: 74 20 61 6e 64 20 65 76 65 72 79 74 68 69 6e 67  t and everything
0d80: 20 66 72 6f 6d 0a 20 20 20 20 20 2a 20 7b 40 63   from.     * {@c
0d90: 6f 64 65 20 46 52 4f 4d 7d 20 6f 6e 77 61 72 64  ode FROM} onward
0da0: 20 77 6f 75 6c 64 20 62 65 20 69 6e 20 74 68 65   would be in the
0db0: 20 70 61 72 61 6d 73 20 61 72 67 75 6d 65 6e 74   params argument
0dc0: 2e 0a 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20  ..     *.     * 
0dd0: 40 70 61 72 61 6d 20 65 64 69 74 54 61 62 6c 65  @param editTable
0de0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
0df0: 20 74 61 62 6c 65 20 75 73 65 64 20 66 6f 72 20   table used for 
0e00: 74 68 69 73 20 71 75 65 72 79 0a 20 20 20 20 20  this query.     
0e10: 2a 20 40 70 61 72 61 6d 20 71 75 65 72 79 20 74  * @param query t
0e20: 68 65 20 7b 40 6c 69 6e 6b 20 53 51 4c 69 74 65  he {@link SQLite
0e30: 51 75 65 72 79 7d 20 6f 62 6a 65 63 74 20 61 73  Query} object as
0e40: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
0e50: 69 73 20 63 75 72 73 6f 72 20 6f 62 6a 65 63 74  is cursor object
0e60: 2e 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20 70 75  ..     */.    pu
0e70: 62 6c 69 63 20 53 51 4c 69 74 65 43 75 72 73 6f  blic SQLiteCurso
0e80: 72 28 53 51 4c 69 74 65 43 75 72 73 6f 72 44 72  r(SQLiteCursorDr
0e90: 69 76 65 72 20 64 72 69 76 65 72 2c 20 53 74 72  iver driver, Str
0ea0: 69 6e 67 20 65 64 69 74 54 61 62 6c 65 2c 20 53  ing editTable, S
0eb0: 51 4c 69 74 65 51 75 65 72 79 20 71 75 65 72 79  QLiteQuery query
0ec0: 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28  ) {.        if (
0ed0: 71 75 65 72 79 20 3d 3d 20 6e 75 6c 6c 29 20 7b  query == null) {
0ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72  .            thr
0ef0: 6f 77 20 6e 65 77 20 49 6c 6c 65 67 61 6c 41 72  ow new IllegalAr
0f00: 67 75 6d 65 6e 74 45 78 63 65 70 74 69 6f 6e 28  gumentException(
0f10: 22 71 75 65 72 79 20 6f 62 6a 65 63 74 20 63 61  "query object ca
0f20: 6e 6e 6f 74 20 62 65 20 6e 75 6c 6c 22 29 3b 0a  nnot be null");.
0f30: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
0f40: 20 20 69 66 20 28 2f 2a 20 53 74 72 69 63 74 4d    if (/* StrictM
0f50: 6f 64 65 2e 76 6d 53 71 6c 69 74 65 4f 62 6a 65  ode.vmSqliteObje
0f60: 63 74 4c 65 61 6b 73 45 6e 61 62 6c 65 64 28 29  ctLeaksEnabled()
0f70: 20 2a 2f 20 66 61 6c 73 65 20 29 20 7b 0a 20 20   */ false ) {.  
0f80: 20 20 20 20 20 20 20 20 20 20 6d 53 74 61 63 6b            mStack
0f90: 54 72 61 63 65 20 3d 20 6e 65 77 20 44 61 74 61  Trace = new Data
0fa0: 62 61 73 65 4f 62 6a 65 63 74 4e 6f 74 43 6c 6f  baseObjectNotClo
0fb0: 73 65 64 45 78 63 65 70 74 69 6f 6e 28 29 2e 66  sedException().f
0fc0: 69 6c 6c 49 6e 53 74 61 63 6b 54 72 61 63 65 28  illInStackTrace(
0fd0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  );.        } els
0fe0: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
0ff0: 6d 53 74 61 63 6b 54 72 61 63 65 20 3d 20 6e 75  mStackTrace = nu
1000: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ll;.        }.  
1010: 20 20 20 20 20 20 6d 44 72 69 76 65 72 20 3d 20        mDriver = 
1020: 64 72 69 76 65 72 3b 0a 20 20 20 20 20 20 20 20  driver;.        
1030: 6d 45 64 69 74 54 61 62 6c 65 20 3d 20 65 64 69  mEditTable = edi
1040: 74 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20  tTable;.        
1050: 6d 43 6f 6c 75 6d 6e 4e 61 6d 65 4d 61 70 20 3d  mColumnNameMap =
1060: 20 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 6d   null;.        m
1070: 51 75 65 72 79 20 3d 20 71 75 65 72 79 3b 0a 0a  Query = query;..
1080: 20 20 20 20 20 20 20 20 6d 43 6f 6c 75 6d 6e 73          mColumns
1090: 20 3d 20 71 75 65 72 79 2e 67 65 74 43 6f 6c 75   = query.getColu
10a0: 6d 6e 4e 61 6d 65 73 28 29 3b 0a 20 20 20 20 7d  mnNames();.    }
10b0: 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20 2a  ..    /**.     *
10c0: 20 47 65 74 20 74 68 65 20 64 61 74 61 62 61 73   Get the databas
10d0: 65 20 74 68 61 74 20 74 68 69 73 20 63 75 72 73  e that this curs
10e0: 6f 72 20 69 73 20 61 73 73 6f 63 69 61 74 65 64  or is associated
10f0: 20 77 69 74 68 2e 0a 20 20 20 20 20 2a 20 40 72   with..     * @r
1100: 65 74 75 72 6e 20 74 68 65 20 53 51 4c 69 74 65  eturn the SQLite
1110: 44 61 74 61 62 61 73 65 20 74 68 61 74 20 74 68  Database that th
1120: 69 73 20 63 75 72 73 6f 72 20 69 73 20 61 73 73  is cursor is ass
1130: 6f 63 69 61 74 65 64 20 77 69 74 68 2e 0a 20 20  ociated with..  
1140: 20 20 20 2a 2f 0a 20 20 20 20 70 75 62 6c 69 63     */.    public
1150: 20 53 51 4c 69 74 65 44 61 74 61 62 61 73 65 20   SQLiteDatabase 
1160: 67 65 74 44 61 74 61 62 61 73 65 28 29 20 7b 0a  getDatabase() {.
1170: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d          return m
1180: 51 75 65 72 79 2e 67 65 74 44 61 74 61 62 61 73  Query.getDatabas
1190: 65 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  e();.    }..    
11a0: 40 4f 76 65 72 72 69 64 65 0a 20 20 20 20 70 75  @Override.    pu
11b0: 62 6c 69 63 20 62 6f 6f 6c 65 61 6e 20 6f 6e 4d  blic boolean onM
11c0: 6f 76 65 28 69 6e 74 20 6f 6c 64 50 6f 73 69 74  ove(int oldPosit
11d0: 69 6f 6e 2c 20 69 6e 74 20 6e 65 77 50 6f 73 69  ion, int newPosi
11e0: 74 69 6f 6e 29 20 7b 0a 20 20 20 20 20 20 20 20  tion) {.        
11f0: 2f 2f 20 4d 61 6b 65 20 73 75 72 65 20 74 68 65  // Make sure the
1200: 20 72 6f 77 20 61 74 20 6e 65 77 50 6f 73 69 74   row at newPosit
1210: 69 6f 6e 20 69 73 20 70 72 65 73 65 6e 74 20 69  ion is present i
1220: 6e 20 74 68 65 20 77 69 6e 64 6f 77 0a 20 20 20  n the window.   
1230: 20 20 20 20 20 69 66 20 28 6d 57 69 6e 64 6f 77       if (mWindow
1240: 20 3d 3d 20 6e 75 6c 6c 20 7c 7c 20 6e 65 77 50   == null || newP
1250: 6f 73 69 74 69 6f 6e 20 3c 20 6d 57 69 6e 64 6f  osition < mWindo
1260: 77 2e 67 65 74 53 74 61 72 74 50 6f 73 69 74 69  w.getStartPositi
1270: 6f 6e 28 29 20 7c 7c 0a 20 20 20 20 20 20 20 20  on() ||.        
1280: 20 20 20 20 20 20 20 20 6e 65 77 50 6f 73 69 74          newPosit
1290: 69 6f 6e 20 3e 3d 20 28 6d 57 69 6e 64 6f 77 2e  ion >= (mWindow.
12a0: 67 65 74 53 74 61 72 74 50 6f 73 69 74 69 6f 6e  getStartPosition
12b0: 28 29 20 2b 20 6d 57 69 6e 64 6f 77 2e 67 65 74  () + mWindow.get
12c0: 4e 75 6d 52 6f 77 73 28 29 29 29 20 7b 0a 20 20  NumRows())) {.  
12d0: 20 20 20 20 20 20 20 20 20 20 66 69 6c 6c 57 69            fillWi
12e0: 6e 64 6f 77 28 6e 65 77 50 6f 73 69 74 69 6f 6e  ndow(newPosition
12f0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  );.        }..  
1300: 20 20 20 20 20 20 72 65 74 75 72 6e 20 74 72 75        return tru
1310: 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 40 4f  e;.    }..    @O
1320: 76 65 72 72 69 64 65 0a 20 20 20 20 70 75 62 6c  verride.    publ
1330: 69 63 20 69 6e 74 20 67 65 74 43 6f 75 6e 74 28  ic int getCount(
1340: 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28  ) {.        if (
1350: 6d 43 6f 75 6e 74 20 3d 3d 20 4e 4f 5f 43 4f 55  mCount == NO_COU
1360: 4e 54 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  NT) {.          
1370: 20 20 66 69 6c 6c 57 69 6e 64 6f 77 28 30 29 3b    fillWindow(0);
1380: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1390: 20 20 20 72 65 74 75 72 6e 20 6d 43 6f 75 6e 74     return mCount
13a0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
13b0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 41 62 73 74  .    ** The Abst
13c0: 72 61 63 74 57 69 6e 64 6f 77 43 6c 61 73 73 20  ractWindowClass 
13d0: 63 6f 6e 74 61 69 6e 73 20 70 72 6f 74 65 63 74  contains protect
13e0: 65 64 20 6d 65 74 68 6f 64 73 20 63 6c 65 61 72  ed methods clear
13f0: 4f 72 43 72 65 61 74 65 57 69 6e 64 6f 77 28 29  OrCreateWindow()
1400: 20 61 6e 64 0a 20 20 20 20 2a 2a 20 63 6c 6f 73   and.    ** clos
1410: 65 57 69 6e 64 6f 77 28 29 2c 20 77 68 69 63 68  eWindow(), which
1420: 20 61 72 65 20 75 73 65 64 20 62 79 20 74 68 65   are used by the
1430: 20 61 6e 64 72 6f 69 64 2e 64 61 74 61 62 61 73   android.databas
1440: 65 2e 73 71 6c 69 74 65 2e 2a 20 76 65 72 73 69  e.sqlite.* versi
1450: 6f 6e 20 6f 66 20 74 68 69 73 0a 20 20 20 20 2a  on of this.    *
1460: 2a 20 63 6c 61 73 73 2e 20 42 75 74 2c 20 73 69  * class. But, si
1470: 6e 63 65 20 74 68 65 79 20 61 72 65 20 6d 61 72  nce they are mar
1480: 6b 65 64 20 77 69 74 68 20 22 40 68 69 64 65 22  ked with "@hide"
1490: 2c 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  , the following 
14a0: 72 65 70 6c 61 63 65 6d 65 6e 74 20 0a 20 20 20  replacement .   
14b0: 20 2a 2a 20 76 65 72 73 69 6f 6e 73 20 61 72 65   ** versions are
14c0: 20 72 65 71 75 69 72 65 64 2e 0a 20 20 20 20 2a   required..    *
14d0: 2f 0a 20 20 20 20 70 72 69 76 61 74 65 20 76 6f  /.    private vo
14e0: 69 64 20 61 77 63 5f 63 6c 65 61 72 4f 72 43 72  id awc_clearOrCr
14f0: 65 61 74 65 57 69 6e 64 6f 77 28 53 74 72 69 6e  eateWindow(Strin
1500: 67 20 6e 61 6d 65 29 7b 0a 20 20 20 20 20 20 43  g name){.      C
1510: 75 72 73 6f 72 57 69 6e 64 6f 77 20 77 69 6e 20  ursorWindow win 
1520: 3d 20 67 65 74 57 69 6e 64 6f 77 28 29 3b 0a 20  = getWindow();. 
1530: 20 20 20 20 20 69 66 28 20 77 69 6e 3d 3d 6e 75       if( win==nu
1540: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 77 69  ll ){.        wi
1550: 6e 20 3d 20 6e 65 77 20 43 75 72 73 6f 72 57 69  n = new CursorWi
1560: 6e 64 6f 77 28 6e 61 6d 65 29 3b 0a 20 20 20 20  ndow(name);.    
1570: 20 20 20 20 73 65 74 57 69 6e 64 6f 77 28 77 69      setWindow(wi
1580: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
1590: 0a 20 20 20 20 20 20 20 20 77 69 6e 2e 63 6c 65  .        win.cle
15a0: 61 72 28 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ar();.      }.  
15b0: 20 20 7d 0a 20 20 20 20 70 72 69 76 61 74 65 20    }.    private 
15c0: 76 6f 69 64 20 61 77 63 5f 63 6c 6f 73 65 57 69  void awc_closeWi
15d0: 6e 64 6f 77 28 29 7b 0a 20 20 20 20 20 20 73 65  ndow(){.      se
15e0: 74 57 69 6e 64 6f 77 28 6e 75 6c 6c 29 3b 0a 20  tWindow(null);. 
15f0: 20 20 20 7d 0a 0a 20 20 20 20 70 72 69 76 61 74     }..    privat
1600: 65 20 76 6f 69 64 20 66 69 6c 6c 57 69 6e 64 6f  e void fillWindo
1610: 77 28 69 6e 74 20 72 65 71 75 69 72 65 64 50 6f  w(int requiredPo
1620: 73 29 20 7b 0a 20 20 20 20 20 20 20 20 61 77 63  s) {.        awc
1630: 5f 63 6c 65 61 72 4f 72 43 72 65 61 74 65 57 69  _clearOrCreateWi
1640: 6e 64 6f 77 28 67 65 74 44 61 74 61 62 61 73 65  ndow(getDatabase
1650: 28 29 2e 67 65 74 50 61 74 68 28 29 29 3b 0a 0a  ().getPath());..
1660: 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20          try {.  
1670: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6d 43            if (mC
1680: 6f 75 6e 74 20 3d 3d 20 4e 4f 5f 43 4f 55 4e 54  ount == NO_COUNT
1690: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
16a0: 20 20 20 20 69 6e 74 20 73 74 61 72 74 50 6f 73      int startPos
16b0: 20 3d 20 45 78 74 72 61 55 74 69 6c 73 2e 63 75   = ExtraUtils.cu
16c0: 72 73 6f 72 50 69 63 6b 46 69 6c 6c 57 69 6e 64  rsorPickFillWind
16d0: 6f 77 53 74 61 72 74 50 6f 73 69 74 69 6f 6e 28  owStartPosition(
16e0: 72 65 71 75 69 72 65 64 50 6f 73 2c 20 30 29 3b  requiredPos, 0);
16f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1700: 20 6d 43 6f 75 6e 74 20 3d 20 6d 51 75 65 72 79   mCount = mQuery
1710: 2e 66 69 6c 6c 57 69 6e 64 6f 77 28 6d 57 69 6e  .fillWindow(mWin
1720: 64 6f 77 2c 20 73 74 61 72 74 50 6f 73 2c 20 72  dow, startPos, r
1730: 65 71 75 69 72 65 64 50 6f 73 2c 20 74 72 75 65  equiredPos, true
1740: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
1750: 20 20 20 6d 43 75 72 73 6f 72 57 69 6e 64 6f 77     mCursorWindow
1760: 43 61 70 61 63 69 74 79 20 3d 20 6d 57 69 6e 64  Capacity = mWind
1770: 6f 77 2e 67 65 74 4e 75 6d 52 6f 77 73 28 29 3b  ow.getNumRows();
1780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
1790: 20 69 66 20 28 4c 6f 67 2e 69 73 4c 6f 67 67 61   if (Log.isLogga
17a0: 62 6c 65 28 54 41 47 2c 20 4c 6f 67 2e 44 45 42  ble(TAG, Log.DEB
17b0: 55 47 29 29 20 7b 0a 20 20 20 20 20 20 20 20 20  UG)) {.         
17c0: 20 20 20 20 20 20 20 20 20 20 20 4c 6f 67 2e 64             Log.d
17d0: 28 54 41 47 2c 20 22 72 65 63 65 69 76 65 64 20  (TAG, "received 
17e0: 63 6f 75 6e 74 28 2a 29 20 66 72 6f 6d 20 6e 61  count(*) from na
17f0: 74 69 76 65 5f 66 69 6c 6c 5f 77 69 6e 64 6f 77  tive_fill_window
1800: 3a 20 22 20 2b 20 6d 43 6f 75 6e 74 29 3b 0a 20  : " + mCount);. 
1810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
1820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65  .            } e
1830: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
1840: 20 20 20 20 20 20 69 6e 74 20 73 74 61 72 74 50        int startP
1850: 6f 73 20 3d 20 45 78 74 72 61 55 74 69 6c 73 2e  os = ExtraUtils.
1860: 63 75 72 73 6f 72 50 69 63 6b 46 69 6c 6c 57 69  cursorPickFillWi
1870: 6e 64 6f 77 53 74 61 72 74 50 6f 73 69 74 69 6f  ndowStartPositio
1880: 6e 28 72 65 71 75 69 72 65 64 50 6f 73 2c 0a 20  n(requiredPos,. 
1890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18a0: 20 20 20 20 20 20 20 6d 43 75 72 73 6f 72 57 69         mCursorWi
18b0: 6e 64 6f 77 43 61 70 61 63 69 74 79 29 3b 0a 20  ndowCapacity);. 
18c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
18d0: 51 75 65 72 79 2e 66 69 6c 6c 57 69 6e 64 6f 77  Query.fillWindow
18e0: 28 6d 57 69 6e 64 6f 77 2c 20 73 74 61 72 74 50  (mWindow, startP
18f0: 6f 73 2c 20 72 65 71 75 69 72 65 64 50 6f 73 2c  os, requiredPos,
1900: 20 66 61 6c 73 65 29 3b 0a 20 20 20 20 20 20 20   false);.       
1910: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1920: 20 63 61 74 63 68 20 28 52 75 6e 74 69 6d 65 45   catch (RuntimeE
1930: 78 63 65 70 74 69 6f 6e 20 65 78 29 20 7b 0a 20  xception ex) {. 
1940: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 43 6c             // Cl
1950: 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 20 77  ose the cursor w
1960: 69 6e 64 6f 77 20 69 66 20 74 68 65 20 71 75 65  indow if the que
1970: 72 79 20 66 61 69 6c 65 64 20 61 6e 64 20 74 68  ry failed and th
1980: 65 72 65 66 6f 72 65 20 77 69 6c 6c 0a 20 20 20  erefore will.   
1990: 20 20 20 20 20 20 20 20 20 2f 2f 20 6e 6f 74 20           // not 
19a0: 70 72 6f 64 75 63 65 20 61 6e 79 20 72 65 73 75  produce any resu
19b0: 6c 74 73 2e 20 20 54 68 69 73 20 68 65 6c 70 73  lts.  This helps
19c0: 20 74 6f 20 61 76 6f 69 64 20 61 63 63 69 64 65   to avoid accide
19d0: 6e 74 61 6c 6c 79 20 6c 65 61 6b 69 6e 67 0a 20  ntally leaking. 
19e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 74 68             // th
19f0: 65 20 63 75 72 73 6f 72 20 77 69 6e 64 6f 77 20  e cursor window 
1a00: 69 66 20 74 68 65 20 63 6c 69 65 6e 74 20 64 6f  if the client do
1a10: 65 73 20 6e 6f 74 20 63 6f 72 72 65 63 74 6c 79  es not correctly
1a20: 20 68 61 6e 64 6c 65 20 65 78 63 65 70 74 69 6f   handle exceptio
1a30: 6e 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  ns.            /
1a40: 2f 20 61 6e 64 20 66 61 69 6c 73 20 74 6f 20 63  / and fails to c
1a50: 6c 6f 73 65 20 74 68 65 20 63 75 72 73 6f 72 2e  lose the cursor.
1a60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 77 63  .            awc
1a70: 5f 63 6c 6f 73 65 57 69 6e 64 6f 77 28 29 3b 0a  _closeWindow();.
1a80: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72 6f              thro
1a90: 77 20 65 78 3b 0a 20 20 20 20 20 20 20 20 7d 0a  w ex;.        }.
1aa0: 20 20 20 20 7d 0a 0a 20 20 20 20 40 4f 76 65 72      }..    @Over
1ab0: 72 69 64 65 0a 20 20 20 20 70 75 62 6c 69 63 20  ride.    public 
1ac0: 69 6e 74 20 67 65 74 43 6f 6c 75 6d 6e 49 6e 64  int getColumnInd
1ad0: 65 78 28 53 74 72 69 6e 67 20 63 6f 6c 75 6d 6e  ex(String column
1ae0: 4e 61 6d 65 29 20 7b 0a 20 20 20 20 20 20 20 20  Name) {.        
1af0: 2f 2f 20 43 72 65 61 74 65 20 6d 43 6f 6c 75 6d  // Create mColum
1b00: 6e 4e 61 6d 65 4d 61 70 20 6f 6e 20 64 65 6d 61  nNameMap on dema
1b10: 6e 64 0a 20 20 20 20 20 20 20 20 69 66 20 28 6d  nd.        if (m
1b20: 43 6f 6c 75 6d 6e 4e 61 6d 65 4d 61 70 20 3d 3d  ColumnNameMap ==
1b30: 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20   null) {.       
1b40: 20 20 20 20 20 53 74 72 69 6e 67 5b 5d 20 63 6f       String[] co
1b50: 6c 75 6d 6e 73 20 3d 20 6d 43 6f 6c 75 6d 6e 73  lumns = mColumns
1b60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  ;.            in
1b70: 74 20 63 6f 6c 75 6d 6e 43 6f 75 6e 74 20 3d 20  t columnCount = 
1b80: 63 6f 6c 75 6d 6e 73 2e 6c 65 6e 67 74 68 3b 0a  columns.length;.
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 48 61 73 68              Hash
1ba0: 4d 61 70 3c 53 74 72 69 6e 67 2c 20 49 6e 74 65  Map<String, Inte
1bb0: 67 65 72 3e 20 6d 61 70 20 3d 20 6e 65 77 20 48  ger> map = new H
1bc0: 61 73 68 4d 61 70 3c 53 74 72 69 6e 67 2c 20 49  ashMap<String, I
1bd0: 6e 74 65 67 65 72 3e 28 63 6f 6c 75 6d 6e 43 6f  nteger>(columnCo
1be0: 75 6e 74 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  unt, 1);.       
1bf0: 20 20 20 20 20 66 6f 72 20 28 69 6e 74 20 69 20       for (int i 
1c00: 3d 20 30 3b 20 69 20 3c 20 63 6f 6c 75 6d 6e 43  = 0; i < columnC
1c10: 6f 75 6e 74 3b 20 69 2b 2b 29 20 7b 0a 20 20 20  ount; i++) {.   
1c20: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 70               map
1c30: 2e 70 75 74 28 63 6f 6c 75 6d 6e 73 5b 69 5d 2c  .put(columns[i],
1c40: 20 69 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   i);.           
1c50: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d   }.            m
1c60: 43 6f 6c 75 6d 6e 4e 61 6d 65 4d 61 70 20 3d 20  ColumnNameMap = 
1c70: 6d 61 70 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a  map;.        }..
1c80: 20 20 20 20 20 20 20 20 2f 2f 20 48 61 63 6b 20          // Hack 
1c90: 61 63 63 6f 72 64 69 6e 67 20 74 6f 20 62 75 67  according to bug
1ca0: 20 39 30 33 38 35 32 0a 20 20 20 20 20 20 20 20   903852.        
1cb0: 66 69 6e 61 6c 20 69 6e 74 20 70 65 72 69 6f 64  final int period
1cc0: 49 6e 64 65 78 20 3d 20 63 6f 6c 75 6d 6e 4e 61  Index = columnNa
1cd0: 6d 65 2e 6c 61 73 74 49 6e 64 65 78 4f 66 28 27  me.lastIndexOf('
1ce0: 2e 27 29 3b 0a 20 20 20 20 20 20 20 20 69 66 20  .');.        if 
1cf0: 28 70 65 72 69 6f 64 49 6e 64 65 78 20 21 3d 20  (periodIndex != 
1d00: 2d 31 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  -1) {.          
1d10: 20 20 45 78 63 65 70 74 69 6f 6e 20 65 20 3d 20    Exception e = 
1d20: 6e 65 77 20 45 78 63 65 70 74 69 6f 6e 28 29 3b  new Exception();
1d30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 4c 6f 67  .            Log
1d40: 2e 65 28 54 41 47 2c 20 22 72 65 71 75 65 73 74  .e(TAG, "request
1d50: 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  ing column name 
1d60: 77 69 74 68 20 74 61 62 6c 65 20 6e 61 6d 65 20  with table name 
1d70: 2d 2d 20 22 20 2b 20 63 6f 6c 75 6d 6e 4e 61 6d  -- " + columnNam
1d80: 65 2c 20 65 29 3b 0a 20 20 20 20 20 20 20 20 20  e, e);.         
1d90: 20 20 20 63 6f 6c 75 6d 6e 4e 61 6d 65 20 3d 20     columnName = 
1da0: 63 6f 6c 75 6d 6e 4e 61 6d 65 2e 73 75 62 73 74  columnName.subst
1db0: 72 69 6e 67 28 70 65 72 69 6f 64 49 6e 64 65 78  ring(periodIndex
1dc0: 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d   + 1);.        }
1dd0: 0a 0a 20 20 20 20 20 20 20 20 49 6e 74 65 67 65  ..        Intege
1de0: 72 20 69 20 3d 20 6d 43 6f 6c 75 6d 6e 4e 61 6d  r i = mColumnNam
1df0: 65 4d 61 70 2e 67 65 74 28 63 6f 6c 75 6d 6e 4e  eMap.get(columnN
1e00: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ame);.        if
1e10: 20 28 69 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a 20   (i != null) {. 
1e20: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
1e30: 6e 20 69 2e 69 6e 74 56 61 6c 75 65 28 29 3b 0a  n i.intValue();.
1e40: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
1e50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
1e60: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 20 20 20 20  urn -1;.        
1e70: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 40 4f 76  }.    }..    @Ov
1e80: 65 72 72 69 64 65 0a 20 20 20 20 70 75 62 6c 69  erride.    publi
1e90: 63 20 53 74 72 69 6e 67 5b 5d 20 67 65 74 43 6f  c String[] getCo
1ea0: 6c 75 6d 6e 4e 61 6d 65 73 28 29 20 7b 0a 20 20  lumnNames() {.  
1eb0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6d 43 6f        return mCo
1ec0: 6c 75 6d 6e 73 3b 0a 20 20 20 20 7d 0a 0a 20 20  lumns;.    }..  
1ed0: 20 20 40 4f 76 65 72 72 69 64 65 0a 20 20 20 20    @Override.    
1ee0: 70 75 62 6c 69 63 20 76 6f 69 64 20 64 65 61 63  public void deac
1ef0: 74 69 76 61 74 65 28 29 20 7b 0a 20 20 20 20 20  tivate() {.     
1f00: 20 20 20 73 75 70 65 72 2e 64 65 61 63 74 69 76     super.deactiv
1f10: 61 74 65 28 29 3b 0a 20 20 20 20 20 20 20 20 6d  ate();.        m
1f20: 44 72 69 76 65 72 2e 63 75 72 73 6f 72 44 65 61  Driver.cursorDea
1f30: 63 74 69 76 61 74 65 64 28 29 3b 0a 20 20 20 20  ctivated();.    
1f40: 7d 0a 0a 20 20 20 20 40 4f 76 65 72 72 69 64 65  }..    @Override
1f50: 0a 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64  .    public void
1f60: 20 63 6c 6f 73 65 28 29 20 7b 0a 20 20 20 20 20   close() {.     
1f70: 20 20 20 73 75 70 65 72 2e 63 6c 6f 73 65 28 29     super.close()
1f80: 3b 0a 20 20 20 20 20 20 20 20 73 79 6e 63 68 72  ;.        synchr
1f90: 6f 6e 69 7a 65 64 20 28 74 68 69 73 29 20 7b 0a  onized (this) {.
1fa0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 51 75 65              mQue
1fb0: 72 79 2e 63 6c 6f 73 65 28 29 3b 0a 20 20 20 20  ry.close();.    
1fc0: 20 20 20 20 20 20 20 20 6d 44 72 69 76 65 72 2e          mDriver.
1fd0: 63 75 72 73 6f 72 43 6c 6f 73 65 64 28 29 3b 0a  cursorClosed();.
1fe0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
1ff0: 0a 20 20 20 20 40 4f 76 65 72 72 69 64 65 0a 20  .    @Override. 
2000: 20 20 20 70 75 62 6c 69 63 20 62 6f 6f 6c 65 61     public boolea
2010: 6e 20 72 65 71 75 65 72 79 28 29 20 7b 0a 20 20  n requery() {.  
2020: 20 20 20 20 20 20 69 66 20 28 69 73 43 6c 6f 73        if (isClos
2030: 65 64 28 29 29 20 7b 0a 20 20 20 20 20 20 20 20  ed()) {.        
2040: 20 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65      return false
2050: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20  ;.        }..   
2060: 20 20 20 20 20 73 79 6e 63 68 72 6f 6e 69 7a 65       synchronize
2070: 64 20 28 74 68 69 73 29 20 7b 0a 20 20 20 20 20  d (this) {.     
2080: 20 20 20 20 20 20 20 69 66 20 28 21 6d 51 75 65         if (!mQue
2090: 72 79 2e 67 65 74 44 61 74 61 62 61 73 65 28 29  ry.getDatabase()
20a0: 2e 69 73 4f 70 65 6e 28 29 29 20 7b 0a 20 20 20  .isOpen()) {.   
20b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74               ret
20c0: 75 72 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 20  urn false;.     
20d0: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
20e0: 20 20 20 20 20 20 69 66 20 28 6d 57 69 6e 64 6f        if (mWindo
20f0: 77 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20  w != null) {.   
2100: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 57 69               mWi
2110: 6e 64 6f 77 2e 63 6c 65 61 72 28 29 3b 0a 20 20  ndow.clear();.  
2120: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2130: 20 20 20 20 20 20 20 20 6d 50 6f 73 20 3d 20 2d          mPos = -
2140: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  1;.            m
2150: 43 6f 75 6e 74 20 3d 20 4e 4f 5f 43 4f 55 4e 54  Count = NO_COUNT
2160: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d  ;..            m
2170: 44 72 69 76 65 72 2e 63 75 72 73 6f 72 52 65 71  Driver.cursorReq
2180: 75 65 72 69 65 64 28 74 68 69 73 29 3b 0a 20 20  ueried(this);.  
2190: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
21a0: 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20   try {.         
21b0: 20 20 20 72 65 74 75 72 6e 20 73 75 70 65 72 2e     return super.
21c0: 72 65 71 75 65 72 79 28 29 3b 0a 20 20 20 20 20  requery();.     
21d0: 20 20 20 7d 20 63 61 74 63 68 20 28 49 6c 6c 65     } catch (Ille
21e0: 67 61 6c 53 74 61 74 65 45 78 63 65 70 74 69 6f  galStateExceptio
21f0: 6e 20 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20  n e) {.         
2200: 20 20 20 2f 2f 20 66 6f 72 20 62 61 63 6b 77 61     // for backwa
2210: 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69 74  rds compatibilit
2220: 79 2c 20 6a 75 73 74 20 72 65 74 75 72 6e 20 66  y, just return f
2230: 61 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 20  alse.           
2240: 20 4c 6f 67 2e 77 28 54 41 47 2c 20 22 72 65 71   Log.w(TAG, "req
2250: 75 65 72 79 28 29 20 66 61 69 6c 65 64 20 22 20  uery() failed " 
2260: 2b 20 65 2e 67 65 74 4d 65 73 73 61 67 65 28 29  + e.getMessage()
2270: 2c 20 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , e);.          
2280: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a    return false;.
2290: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
22a0: 0a 20 20 20 20 40 4f 76 65 72 72 69 64 65 0a 20  .    @Override. 
22b0: 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20 73     public void s
22c0: 65 74 57 69 6e 64 6f 77 28 43 75 72 73 6f 72 57  etWindow(CursorW
22d0: 69 6e 64 6f 77 20 77 69 6e 64 6f 77 29 20 7b 0a  indow window) {.
22e0: 20 20 20 20 20 20 20 20 73 75 70 65 72 2e 73 65          super.se
22f0: 74 57 69 6e 64 6f 77 28 77 69 6e 64 6f 77 29 3b  tWindow(window);
2300: 0a 20 20 20 20 20 20 20 20 6d 43 6f 75 6e 74 20  .        mCount 
2310: 3d 20 4e 4f 5f 43 4f 55 4e 54 3b 0a 20 20 20 20  = NO_COUNT;.    
2320: 7d 0a 0a 20 20 20 20 2f 2a 2a 0a 20 20 20 20 20  }..    /**.     
2330: 2a 20 43 68 61 6e 67 65 73 20 74 68 65 20 73 65  * Changes the se
2340: 6c 65 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  lection argument
2350: 73 2e 20 54 68 65 20 6e 65 77 20 76 61 6c 75 65  s. The new value
2360: 73 20 74 61 6b 65 20 65 66 66 65 63 74 20 61 66  s take effect af
2370: 74 65 72 20 61 20 63 61 6c 6c 20 74 6f 20 72 65  ter a call to re
2380: 71 75 65 72 79 28 29 2e 0a 20 20 20 20 20 2a 2f  query()..     */
2390: 0a 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64  .    public void
23a0: 20 73 65 74 53 65 6c 65 63 74 69 6f 6e 41 72 67   setSelectionArg
23b0: 75 6d 65 6e 74 73 28 53 74 72 69 6e 67 5b 5d 20  uments(String[] 
23c0: 73 65 6c 65 63 74 69 6f 6e 41 72 67 73 29 20 7b  selectionArgs) {
23d0: 0a 20 20 20 20 20 20 20 20 6d 44 72 69 76 65 72  .        mDriver
23e0: 2e 73 65 74 42 69 6e 64 41 72 67 75 6d 65 6e 74  .setBindArgument
23f0: 73 28 73 65 6c 65 63 74 69 6f 6e 41 72 67 73 29  s(selectionArgs)
2400: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 2a  ;.    }..    /**
2410: 0a 20 20 20 20 20 2a 20 52 65 6c 65 61 73 65 20  .     * Release 
2420: 74 68 65 20 6e 61 74 69 76 65 20 72 65 73 6f 75  the native resou
2430: 72 63 65 73 2c 20 69 66 20 74 68 65 79 20 68 61  rces, if they ha
2440: 76 65 6e 27 74 20 62 65 65 6e 20 72 65 6c 65 61  ven't been relea
2450: 73 65 64 20 79 65 74 2e 0a 20 20 20 20 20 2a 2f  sed yet..     */
2460: 0a 20 20 20 20 40 4f 76 65 72 72 69 64 65 0a 20  .    @Override. 
2470: 20 20 20 70 72 6f 74 65 63 74 65 64 20 76 6f 69     protected voi
2480: 64 20 66 69 6e 61 6c 69 7a 65 28 29 20 7b 0a 20  d finalize() {. 
2490: 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20         try {.   
24a0: 20 20 20 20 20 20 20 20 20 2f 2f 20 69 66 20 74           // if t
24b0: 68 65 20 63 75 72 73 6f 72 20 68 61 73 6e 27 74  he cursor hasn't
24c0: 20 62 65 65 6e 20 63 6c 6f 73 65 64 20 79 65 74   been closed yet
24d0: 2c 20 63 6c 6f 73 65 20 69 74 20 66 69 72 73 74  , close it first
24e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
24f0: 28 6d 57 69 6e 64 6f 77 20 21 3d 20 6e 75 6c 6c  (mWindow != null
2500: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
2510: 20 20 20 20 20 20 20 20 2f 2a 0a 20 20 20 20 20          /*.     
2520: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 6d             if (m
2530: 53 74 61 63 6b 54 72 61 63 65 20 21 3d 20 6e 75  StackTrace != nu
2540: 6c 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ll) {.          
2550: 20 20 20 20 20 20 20 20 20 20 53 74 72 69 6e 67            String
2560: 20 73 71 6c 20 3d 20 6d 51 75 65 72 79 2e 67 65   sql = mQuery.ge
2570: 74 53 71 6c 28 29 3b 0a 20 20 20 20 20 20 20 20  tSql();.        
2580: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
2590: 6c 65 6e 20 3d 20 73 71 6c 2e 6c 65 6e 67 74 68  len = sql.length
25a0: 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ();.            
25b0: 20 20 20 20 20 20 20 20 53 74 72 69 63 74 4d 6f          StrictMo
25c0: 64 65 2e 6f 6e 53 71 6c 69 74 65 4f 62 6a 65 63  de.onSqliteObjec
25d0: 74 4c 65 61 6b 65 64 28 0a 20 20 20 20 20 20 20  tLeaked(.       
25e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25f0: 20 22 46 69 6e 61 6c 69 7a 69 6e 67 20 61 20 43   "Finalizing a C
2600: 75 72 73 6f 72 20 74 68 61 74 20 68 61 73 20 6e  ursor that has n
2610: 6f 74 20 62 65 65 6e 20 64 65 61 63 74 69 76 61  ot been deactiva
2620: 74 65 64 20 6f 72 20 63 6c 6f 73 65 64 2e 20 22  ted or closed. "
2630: 20 2b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   +.             
2640: 20 20 20 20 20 20 20 20 20 20 20 22 64 61 74 61             "data
2650: 62 61 73 65 20 3d 20 22 20 2b 20 6d 51 75 65 72  base = " + mQuer
2660: 79 2e 67 65 74 44 61 74 61 62 61 73 65 28 29 2e  y.getDatabase().
2670: 67 65 74 4c 61 62 65 6c 28 29 20 2b 0a 20 20 20  getLabel() +.   
2680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2690: 20 20 20 20 20 22 2c 20 74 61 62 6c 65 20 3d 20       ", table = 
26a0: 22 20 2b 20 6d 45 64 69 74 54 61 62 6c 65 20 2b  " + mEditTable +
26b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
26c0: 20 20 20 20 20 20 20 20 20 22 2c 20 71 75 65 72           ", quer
26d0: 79 20 3d 20 22 20 2b 20 73 71 6c 2e 73 75 62 73  y = " + sql.subs
26e0: 74 72 69 6e 67 28 30 2c 20 28 6c 65 6e 20 3e 20  tring(0, (len > 
26f0: 31 30 30 30 29 20 3f 20 31 30 30 30 20 3a 20 6c  1000) ? 1000 : l
2700: 65 6e 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20  en),.           
2710: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 53 74               mSt
2720: 61 63 6b 54 72 61 63 65 29 3b 0a 20 20 20 20 20  ackTrace);.     
2730: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
2740: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a               */.
2750: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2760: 63 6c 6f 73 65 28 29 3b 0a 20 20 20 20 20 20 20  close();.       
2770: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2780: 20 66 69 6e 61 6c 6c 79 20 7b 0a 20 20 20 20 20   finally {.     
2790: 20 20 20 20 20 20 20 73 75 70 65 72 2e 66 69 6e         super.fin
27a0: 61 6c 69 7a 65 28 29 3b 0a 20 20 20 20 20 20 20  alize();.       
27b0: 20 7d 0a 20 20 20 20 7d 0a 7d 0a                  }.    }.}.