SQLite Android Bindings
Hex Artifact Content
Not logged in

Artifact da1ca5726ea5ab4426c78ab670386aace94e035e:


0000: 2f 2a 0a 20 2a 20 43 6f 70 79 72 69 67 68 74 20  /*. * Copyright 
0010: 28 43 29 20 32 30 30 39 20 54 68 65 20 41 6e 64  (C) 2009 The And
0020: 72 6f 69 64 20 4f 70 65 6e 20 53 6f 75 72 63 65  roid Open Source
0030: 20 50 72 6f 6a 65 63 74 0a 20 2a 0a 20 2a 20 4c   Project. *. * L
0040: 69 63 65 6e 73 65 64 20 75 6e 64 65 72 20 74 68  icensed under th
0050: 65 20 41 70 61 63 68 65 20 4c 69 63 65 6e 73 65  e Apache License
0060: 2c 20 56 65 72 73 69 6f 6e 20 32 2e 30 20 28 74  , Version 2.0 (t
0070: 68 65 20 22 4c 69 63 65 6e 73 65 22 29 3b 0a 20  he "License");. 
0080: 2a 20 79 6f 75 20 6d 61 79 20 6e 6f 74 20 75 73  * you may not us
0090: 65 20 74 68 69 73 20 66 69 6c 65 20 65 78 63 65  e this file exce
00a0: 70 74 20 69 6e 20 63 6f 6d 70 6c 69 61 6e 63 65  pt in compliance
00b0: 20 77 69 74 68 20 74 68 65 20 4c 69 63 65 6e 73   with the Licens
00c0: 65 2e 0a 20 2a 20 59 6f 75 20 6d 61 79 20 6f 62  e.. * You may ob
00d0: 74 61 69 6e 20 61 20 63 6f 70 79 20 6f 66 20 74  tain a copy of t
00e0: 68 65 20 4c 69 63 65 6e 73 65 20 61 74 0a 20 2a  he License at. *
00f0: 0a 20 2a 20 20 20 20 20 20 68 74 74 70 3a 2f 2f  . *      http://
0100: 77 77 77 2e 61 70 61 63 68 65 2e 6f 72 67 2f 6c  www.apache.org/l
0110: 69 63 65 6e 73 65 73 2f 4c 49 43 45 4e 53 45 2d  icenses/LICENSE-
0120: 32 2e 30 0a 20 2a 0a 20 2a 20 55 6e 6c 65 73 73  2.0. *. * Unless
0130: 20 72 65 71 75 69 72 65 64 20 62 79 20 61 70 70   required by app
0140: 6c 69 63 61 62 6c 65 20 6c 61 77 20 6f 72 20 61  licable law or a
0150: 67 72 65 65 64 20 74 6f 20 69 6e 20 77 72 69 74  greed to in writ
0160: 69 6e 67 2c 20 73 6f 66 74 77 61 72 65 0a 20 2a  ing, software. *
0170: 20 64 69 73 74 72 69 62 75 74 65 64 20 75 6e 64   distributed und
0180: 65 72 20 74 68 65 20 4c 69 63 65 6e 73 65 20 69  er the License i
0190: 73 20 64 69 73 74 72 69 62 75 74 65 64 20 6f 6e  s distributed on
01a0: 20 61 6e 20 22 41 53 20 49 53 22 20 42 41 53 49   an "AS IS" BASI
01b0: 53 2c 0a 20 2a 20 57 49 54 48 4f 55 54 20 57 41  S,. * WITHOUT WA
01c0: 52 52 41 4e 54 49 45 53 20 4f 52 20 43 4f 4e 44  RRANTIES OR COND
01d0: 49 54 49 4f 4e 53 20 4f 46 20 41 4e 59 20 4b 49  ITIONS OF ANY KI
01e0: 4e 44 2c 20 65 69 74 68 65 72 20 65 78 70 72 65  ND, either expre
01f0: 73 73 20 6f 72 20 69 6d 70 6c 69 65 64 2e 0a 20  ss or implied.. 
0200: 2a 20 53 65 65 20 74 68 65 20 4c 69 63 65 6e 73  * See the Licens
0210: 65 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 66  e for the specif
0220: 69 63 20 6c 61 6e 67 75 61 67 65 20 67 6f 76 65  ic language gove
0230: 72 6e 69 6e 67 20 70 65 72 6d 69 73 73 69 6f 6e  rning permission
0240: 73 20 61 6e 64 0a 20 2a 20 6c 69 6d 69 74 61 74  s and. * limitat
0250: 69 6f 6e 73 20 75 6e 64 65 72 20 74 68 65 20 4c  ions under the L
0260: 69 63 65 6e 73 65 2e 0a 20 2a 2f 0a 0a 70 61 63  icense.. */..pac
0270: 6b 61 67 65 20 6f 72 67 2e 73 71 6c 69 74 65 2e  kage org.sqlite.
0280: 64 61 74 61 62 61 73 65 3b 0a 0a 0a 69 6d 70 6f  database;...impo
0290: 72 74 20 61 6e 64 72 6f 69 64 2e 63 6f 6e 74 65  rt android.conte
02a0: 6e 74 2e 43 6f 6e 74 65 6e 74 56 61 6c 75 65 73  nt.ContentValues
02b0: 3b 0a 69 6d 70 6f 72 74 20 61 6e 64 72 6f 69 64  ;.import android
02c0: 2e 63 6f 6e 74 65 6e 74 2e 43 6f 6e 74 65 78 74  .content.Context
02d0: 3b 0a 69 6d 70 6f 72 74 20 61 6e 64 72 6f 69 64  ;.import android
02e0: 2e 64 61 74 61 62 61 73 65 2e 43 75 72 73 6f 72  .database.Cursor
02f0: 3b 0a 69 6d 70 6f 72 74 20 61 6e 64 72 6f 69 64  ;.import android
0300: 2e 64 61 74 61 62 61 73 65 2e 44 61 74 61 62 61  .database.Databa
0310: 73 65 55 74 69 6c 73 3b 0a 69 6d 70 6f 72 74 20  seUtils;.import 
0320: 6f 72 67 2e 73 71 6c 69 74 65 2e 64 61 74 61 62  org.sqlite.datab
0330: 61 73 65 2e 53 51 4c 45 78 63 65 70 74 69 6f 6e  ase.SQLException
0340: 3b 0a 69 6d 70 6f 72 74 20 6f 72 67 2e 73 71 6c  ;.import org.sql
0350: 69 74 65 2e 64 61 74 61 62 61 73 65 2e 73 71 6c  ite.database.sql
0360: 69 74 65 2e 53 51 4c 69 74 65 44 61 74 61 62 61  ite.SQLiteDataba
0370: 73 65 3b 0a 69 6d 70 6f 72 74 20 6f 72 67 2e 73  se;.import org.s
0380: 71 6c 69 74 65 2e 64 61 74 61 62 61 73 65 2e 73  qlite.database.s
0390: 71 6c 69 74 65 2e 53 51 4c 69 74 65 44 6f 6e 65  qlite.SQLiteDone
03a0: 45 78 63 65 70 74 69 6f 6e 3b 0a 69 6d 70 6f 72  Exception;.impor
03b0: 74 20 6f 72 67 2e 73 71 6c 69 74 65 2e 64 61 74  t org.sqlite.dat
03c0: 61 62 61 73 65 2e 73 71 6c 69 74 65 2e 53 51 4c  abase.sqlite.SQL
03d0: 69 74 65 53 74 61 74 65 6d 65 6e 74 3b 0a 69 6d  iteStatement;.im
03e0: 70 6f 72 74 20 61 6e 64 72 6f 69 64 2e 6f 73 2e  port android.os.
03f0: 50 61 72 63 65 6c 46 69 6c 65 44 65 73 63 72 69  ParcelFileDescri
0400: 70 74 6f 72 3b 0a 69 6d 70 6f 72 74 20 61 6e 64  ptor;.import and
0410: 72 6f 69 64 2e 73 75 70 70 6f 72 74 2e 74 65 73  roid.support.tes
0420: 74 2e 66 69 6c 74 65 72 73 2e 53 75 70 70 72 65  t.filters.Suppre
0430: 73 73 3b 0a 69 6d 70 6f 72 74 20 61 6e 64 72 6f  ss;.import andro
0440: 69 64 2e 74 65 73 74 2e 41 6e 64 72 6f 69 64 54  id.test.AndroidT
0450: 65 73 74 43 61 73 65 3b 0a 69 6d 70 6f 72 74 20  estCase;.import 
0460: 61 6e 64 72 6f 69 64 2e 74 65 73 74 2e 4d 6f 72  android.test.Mor
0470: 65 41 73 73 65 72 74 73 3b 0a 0a 69 6d 70 6f 72  eAsserts;..impor
0480: 74 20 6a 61 76 61 2e 69 6f 2e 49 4f 45 78 63 65  t java.io.IOExce
0490: 70 74 69 6f 6e 3b 0a 69 6d 70 6f 72 74 20 6a 61  ption;.import ja
04a0: 76 61 2e 69 6f 2e 49 6e 70 75 74 53 74 72 65 61  va.io.InputStrea
04b0: 6d 3b 0a 69 6d 70 6f 72 74 20 6a 61 76 61 2e 69  m;.import java.i
04c0: 6f 2e 46 69 6c 65 3b 0a 0a 70 75 62 6c 69 63 20  o.File;..public 
04d0: 63 6c 61 73 73 20 53 51 4c 69 74 65 53 74 61 74  class SQLiteStat
04e0: 65 6d 65 6e 74 54 65 73 74 20 65 78 74 65 6e 64  ementTest extend
04f0: 73 20 41 6e 64 72 6f 69 64 54 65 73 74 43 61 73  s AndroidTestCas
0500: 65 20 7b 0a 20 20 20 20 70 72 69 76 61 74 65 20  e {.    private 
0510: 73 74 61 74 69 63 20 66 69 6e 61 6c 20 53 74 72  static final Str
0520: 69 6e 67 20 53 54 52 49 4e 47 31 20 3d 20 22 74  ing STRING1 = "t
0530: 68 69 73 20 69 73 20 61 20 74 65 73 74 22 3b 0a  his is a test";.
0540: 20 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74      private stat
0550: 69 63 20 66 69 6e 61 6c 20 53 74 72 69 6e 67 20  ic final String 
0560: 53 54 52 49 4e 47 32 20 3d 20 22 61 6e 6f 74 68  STRING2 = "anoth
0570: 65 72 20 74 65 73 74 22 3b 0a 0a 20 20 20 20 70  er test";..    p
0580: 72 69 76 61 74 65 20 73 74 61 74 69 63 20 66 69  rivate static fi
0590: 6e 61 6c 20 62 79 74 65 5b 5d 5b 5d 20 42 4c 4f  nal byte[][] BLO
05a0: 42 53 20 3d 20 6e 65 77 20 62 79 74 65 20 5b 5d  BS = new byte []
05b0: 5b 5d 20 7b 0a 20 20 20 20 20 20 20 20 70 61 72  [] {.        par
05c0: 73 65 42 6c 6f 62 28 22 38 36 46 41 44 43 46 31  seBlob("86FADCF1
05d0: 41 38 32 30 36 36 36 41 45 42 44 30 37 38 39 46  A820666AEBD0789F
05e0: 34 37 39 33 32 31 35 31 41 32 45 46 37 33 34 32  47932151A2EF7342
05f0: 36 39 45 38 41 43 34 45 33 39 36 33 30 41 42 36  69E8AC4E39630AB6
0600: 30 35 31 39 44 46 44 38 22 29 2c 0a 20 20 20 20  0519DFD8"),.    
0610: 20 20 20 20 6e 65 77 20 62 79 74 65 5b 31 5d 2c      new byte[1],
0620: 0a 20 20 20 20 20 20 20 20 6e 75 6c 6c 2c 0a 20  .        null,. 
0630: 20 20 20 20 20 20 20 70 61 72 73 65 42 6c 6f 62         parseBlob
0640: 28 22 30 30 22 29 2c 0a 20 20 20 20 20 20 20 20  ("00"),.        
0650: 70 61 72 73 65 42 6c 6f 62 28 22 46 46 22 29 2c  parseBlob("FF"),
0660: 0a 20 20 20 20 20 20 20 20 70 61 72 73 65 42 6c  .        parseBl
0670: 6f 62 28 22 44 37 42 35 30 30 46 45 43 46 32 35  ob("D7B500FECF25
0680: 46 37 41 34 44 38 33 42 46 38 32 33 44 33 38 35  F7A4D83BF823D385
0690: 38 36 39 30 37 39 30 46 32 35 32 36 30 31 33 44  8690790F2526013D
06a0: 45 36 43 41 45 39 41 36 39 31 37 30 45 32 41 31  E6CAE9A69170E2A1
06b0: 45 34 37 32 33 38 22 29 2c 0a 20 20 20 20 7d 3b  E47238"),.    };
06c0: 0a 0a 20 20 20 20 70 72 69 76 61 74 65 20 73 74  ..    private st
06d0: 61 74 69 63 20 66 69 6e 61 6c 20 53 74 72 69 6e  atic final Strin
06e0: 67 20 44 41 54 41 42 41 53 45 5f 4e 41 4d 45 20  g DATABASE_NAME 
06f0: 3d 20 22 64 61 74 61 62 61 73 65 5f 74 65 73 74  = "database_test
0700: 2e 64 62 22 3b 0a 0a 20 20 20 20 70 72 69 76 61  .db";..    priva
0710: 74 65 20 73 74 61 74 69 63 20 66 69 6e 61 6c 20  te static final 
0720: 69 6e 74 20 43 55 52 52 45 4e 54 5f 44 41 54 41  int CURRENT_DATA
0730: 42 41 53 45 5f 56 45 52 53 49 4f 4e 20 3d 20 34  BASE_VERSION = 4
0740: 32 3b 0a 20 20 20 20 70 72 69 76 61 74 65 20 53  2;.    private S
0750: 51 4c 69 74 65 44 61 74 61 62 61 73 65 20 6d 44  QLiteDatabase mD
0760: 61 74 61 62 61 73 65 3b 0a 0a 20 20 20 20 40 4f  atabase;..    @O
0770: 76 65 72 72 69 64 65 0a 20 20 20 20 70 72 6f 74  verride.    prot
0780: 65 63 74 65 64 20 76 6f 69 64 20 73 65 74 55 70  ected void setUp
0790: 28 29 20 74 68 72 6f 77 73 20 45 78 63 65 70 74  () throws Except
07a0: 69 6f 6e 20 7b 0a 20 20 20 20 20 20 20 20 73 75  ion {.        su
07b0: 70 65 72 2e 73 65 74 55 70 28 29 3b 0a 20 20 20  per.setUp();.   
07c0: 20 20 20 20 20 53 79 73 74 65 6d 2e 6c 6f 61 64       System.load
07d0: 4c 69 62 72 61 72 79 28 22 73 71 6c 69 74 65 58  Library("sqliteX
07e0: 22 29 3b 0a 20 20 20 20 20 20 20 20 67 65 74 43  ");.        getC
07f0: 6f 6e 74 65 78 74 28 29 2e 64 65 6c 65 74 65 44  ontext().deleteD
0800: 61 74 61 62 61 73 65 28 44 41 54 41 42 41 53 45  atabase(DATABASE
0810: 5f 4e 41 4d 45 29 3b 0a 20 20 20 20 20 20 20 20  _NAME);.        
0820: 46 69 6c 65 20 66 20 3d 20 6d 43 6f 6e 74 65 78  File f = mContex
0830: 74 2e 67 65 74 44 61 74 61 62 61 73 65 50 61 74  t.getDatabasePat
0840: 68 28 44 41 54 41 42 41 53 45 5f 4e 41 4d 45 29  h(DATABASE_NAME)
0850: 3b 0a 20 20 20 20 20 20 20 20 66 2e 6d 6b 64 69  ;.        f.mkdi
0860: 72 73 28 29 3b 0a 20 20 20 20 20 20 20 20 69 66  rs();.        if
0870: 20 28 66 2e 65 78 69 73 74 73 28 29 29 20 7b 20   (f.exists()) { 
0880: 66 2e 64 65 6c 65 74 65 28 29 3b 20 7d 0a 20 20  f.delete(); }.  
0890: 20 20 20 20 20 20 6d 44 61 74 61 62 61 73 65 20        mDatabase 
08a0: 3d 20 53 51 4c 69 74 65 44 61 74 61 62 61 73 65  = SQLiteDatabase
08b0: 2e 6f 70 65 6e 4f 72 43 72 65 61 74 65 44 61 74  .openOrCreateDat
08c0: 61 62 61 73 65 28 66 2c 20 6e 75 6c 6c 29 3b 0a  abase(f, null);.
08d0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 4e 6f          assertNo
08e0: 74 4e 75 6c 6c 28 6d 44 61 74 61 62 61 73 65 29  tNull(mDatabase)
08f0: 3b 0a 20 20 20 20 20 20 20 20 6d 44 61 74 61 62  ;.        mDatab
0900: 61 73 65 2e 73 65 74 56 65 72 73 69 6f 6e 28 43  ase.setVersion(C
0910: 55 52 52 45 4e 54 5f 44 41 54 41 42 41 53 45 5f  URRENT_DATABASE_
0920: 56 45 52 53 49 4f 4e 29 3b 0a 20 20 20 20 7d 0a  VERSION);.    }.
0930: 0a 20 20 20 20 40 4f 76 65 72 72 69 64 65 0a 20  .    @Override. 
0940: 20 20 20 70 72 6f 74 65 63 74 65 64 20 76 6f 69     protected voi
0950: 64 20 74 65 61 72 44 6f 77 6e 28 29 20 74 68 72  d tearDown() thr
0960: 6f 77 73 20 45 78 63 65 70 74 69 6f 6e 20 7b 0a  ows Exception {.
0970: 20 20 20 20 20 20 20 20 6d 44 61 74 61 62 61 73          mDatabas
0980: 65 2e 63 6c 6f 73 65 28 29 3b 0a 20 20 20 20 20  e.close();.     
0990: 20 20 20 67 65 74 43 6f 6e 74 65 78 74 28 29 2e     getContext().
09a0: 64 65 6c 65 74 65 44 61 74 61 62 61 73 65 28 44  deleteDatabase(D
09b0: 41 54 41 42 41 53 45 5f 4e 41 4d 45 29 3b 0a 20  ATABASE_NAME);. 
09c0: 20 20 20 20 20 20 20 73 75 70 65 72 2e 74 65 61         super.tea
09d0: 72 44 6f 77 6e 28 29 3b 0a 20 20 20 20 7d 0a 0a  rDown();.    }..
09e0: 20 20 20 20 70 72 69 76 61 74 65 20 76 6f 69 64      private void
09f0: 20 70 6f 70 75 6c 61 74 65 44 65 66 61 75 6c 74   populateDefault
0a00: 54 61 62 6c 65 28 29 20 7b 0a 20 20 20 20 20 20  Table() {.      
0a10: 20 20 6d 44 61 74 61 62 61 73 65 2e 65 78 65 63    mDatabase.exec
0a20: 53 51 4c 28 22 43 52 45 41 54 45 20 54 41 42 4c  SQL("CREATE TABL
0a30: 45 20 74 65 73 74 20 28 5f 69 64 20 49 4e 54 45  E test (_id INTE
0a40: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 2c  GER PRIMARY KEY,
0a50: 20 64 61 74 61 20 54 45 58 54 29 3b 22 29 3b 0a   data TEXT);");.
0a60: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 69 76 61      }..    priva
0a70: 74 65 20 76 6f 69 64 20 70 6f 70 75 6c 61 74 65  te void populate
0a80: 42 6c 6f 62 54 61 62 6c 65 28 29 20 7b 0a 20 20  BlobTable() {.  
0a90: 20 20 20 20 20 20 6d 44 61 74 61 62 61 73 65 2e        mDatabase.
0aa0: 65 78 65 63 53 51 4c 28 22 43 52 45 41 54 45 20  execSQL("CREATE 
0ab0: 54 41 42 4c 45 20 62 6c 6f 62 5f 74 65 73 74 20  TABLE blob_test 
0ac0: 28 5f 69 64 20 49 4e 54 45 47 45 52 20 50 52 49  (_id INTEGER PRI
0ad0: 4d 41 52 59 20 4b 45 59 2c 20 64 61 74 61 20 42  MARY KEY, data B
0ae0: 4c 4f 42 29 22 29 3b 0a 20 20 20 20 20 20 20 20  LOB)");.        
0af0: 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30 3b 20  for (int i = 0; 
0b00: 69 20 3c 20 42 4c 4f 42 53 2e 6c 65 6e 67 74 68  i < BLOBS.length
0b10: 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20  ; i++) {.       
0b20: 20 20 20 20 20 43 6f 6e 74 65 6e 74 56 61 6c 75       ContentValu
0b30: 65 73 20 76 61 6c 75 65 73 20 3d 20 6e 65 77 20  es values = new 
0b40: 43 6f 6e 74 65 6e 74 56 61 6c 75 65 73 28 29 3b  ContentValues();
0b50: 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 61 6c  .            val
0b60: 75 65 73 2e 70 75 74 28 22 5f 69 64 22 2c 20 69  ues.put("_id", i
0b70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76  );.            v
0b80: 61 6c 75 65 73 2e 70 75 74 28 22 64 61 74 61 22  alues.put("data"
0b90: 2c 20 42 4c 4f 42 53 5b 69 5d 29 3b 0a 20 20 20  , BLOBS[i]);.   
0ba0: 20 20 20 20 20 20 20 20 20 6d 44 61 74 61 62 61           mDataba
0bb0: 73 65 2e 69 6e 73 65 72 74 28 22 62 6c 6f 62 5f  se.insert("blob_
0bc0: 74 65 73 74 22 2c 20 6e 75 6c 6c 2c 20 76 61 6c  test", null, val
0bd0: 75 65 73 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ues);.        }.
0be0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 75 62 6c 69      }..    publi
0bf0: 63 20 76 6f 69 64 20 74 65 73 74 45 78 65 63 75  c void testExecu
0c00: 74 65 28 29 20 7b 0a 20 20 20 20 20 20 20 20 6d  te() {.        m
0c10: 44 61 74 61 62 61 73 65 2e 64 69 73 61 62 6c 65  Database.disable
0c20: 57 72 69 74 65 41 68 65 61 64 4c 6f 67 67 69 6e  WriteAheadLoggin
0c30: 67 28 29 3b 0a 20 20 20 20 20 20 20 20 70 6f 70  g();.        pop
0c40: 75 6c 61 74 65 44 65 66 61 75 6c 74 54 61 62 6c  ulateDefaultTabl
0c50: 65 28 29 3b 0a 0a 20 20 20 20 20 20 20 20 61 73  e();..        as
0c60: 73 65 72 74 45 71 75 61 6c 73 28 30 2c 20 45 78  sertEquals(0, Ex
0c70: 74 72 61 55 74 69 6c 73 2e 6c 6f 6e 67 46 6f 72  traUtils.longFor
0c80: 51 75 65 72 79 28 6d 44 61 74 61 62 61 73 65 2c  Query(mDatabase,
0c90: 20 22 73 65 6c 65 63 74 20 63 6f 75 6e 74 28 2a   "select count(*
0ca0: 29 20 66 72 6f 6d 20 74 65 73 74 22 2c 20 6e 75  ) from test", nu
0cb0: 6c 6c 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  ll));..        /
0cc0: 2f 20 74 65 73 74 20 75 70 64 61 74 65 0a 20 20  / test update.  
0cd0: 20 20 20 20 20 20 2f 2f 20 69 6e 73 65 72 74 20        // insert 
0ce0: 32 20 72 6f 77 73 20 61 6e 64 20 74 68 65 6e 20  2 rows and then 
0cf0: 75 70 64 61 74 65 20 74 68 65 6d 2e 0a 20 20 20  update them..   
0d00: 20 20 20 20 20 53 51 4c 69 74 65 53 74 61 74 65       SQLiteState
0d10: 6d 65 6e 74 20 73 74 61 74 65 6d 65 6e 74 31 20  ment statement1 
0d20: 3d 20 6d 44 61 74 61 62 61 73 65 2e 63 6f 6d 70  = mDatabase.comp
0d30: 69 6c 65 53 74 61 74 65 6d 65 6e 74 28 0a 20 20  ileStatement(.  
0d40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22 49                "I
0d50: 4e 53 45 52 54 20 49 4e 54 4f 20 74 65 73 74 20  NSERT INTO test 
0d60: 28 64 61 74 61 29 20 56 41 4c 55 45 53 20 28 27  (data) VALUES ('
0d70: 22 20 2b 20 53 54 52 49 4e 47 32 20 2b 20 22 27  " + STRING2 + "'
0d80: 29 22 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  )");.        ass
0d90: 65 72 74 45 71 75 61 6c 73 28 31 2c 20 73 74 61  ertEquals(1, sta
0da0: 74 65 6d 65 6e 74 31 2e 65 78 65 63 75 74 65 49  tement1.executeI
0db0: 6e 73 65 72 74 28 29 29 3b 0a 20 20 20 20 20 20  nsert());.      
0dc0: 20 20 61 73 73 65 72 74 45 71 75 61 6c 73 28 32    assertEquals(2
0dd0: 2c 20 73 74 61 74 65 6d 65 6e 74 31 2e 65 78 65  , statement1.exe
0de0: 63 75 74 65 49 6e 73 65 72 74 28 29 29 3b 0a 20  cuteInsert());. 
0df0: 20 20 20 20 20 20 20 53 51 4c 69 74 65 53 74 61         SQLiteSta
0e00: 74 65 6d 65 6e 74 20 73 74 61 74 65 6d 65 6e 74  tement statement
0e10: 32 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20  2 =.            
0e20: 20 20 20 20 6d 44 61 74 61 62 61 73 65 2e 63 6f      mDatabase.co
0e30: 6d 70 69 6c 65 53 74 61 74 65 6d 65 6e 74 28 22  mpileStatement("
0e40: 55 50 44 41 54 45 20 74 65 73 74 20 73 65 74 20  UPDATE test set 
0e50: 64 61 74 61 20 3d 20 27 61 27 20 57 48 45 52 45  data = 'a' WHERE
0e60: 20 5f 69 64 20 3e 20 30 22 29 3b 0a 20 20 20 20   _id > 0");.    
0e70: 20 20 20 20 61 73 73 65 72 74 45 71 75 61 6c 73      assertEquals
0e80: 28 32 2c 20 73 74 61 74 65 6d 65 6e 74 32 2e 65  (2, statement2.e
0e90: 78 65 63 75 74 65 55 70 64 61 74 65 44 65 6c 65  xecuteUpdateDele
0ea0: 74 65 28 29 29 3b 0a 20 20 20 20 20 20 20 20 73  te());.        s
0eb0: 74 61 74 65 6d 65 6e 74 32 2e 63 6c 6f 73 65 28  tatement2.close(
0ec0: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2f 20 73 68  );.        // sh
0ed0: 6f 75 6c 64 20 73 74 69 6c 6c 20 68 61 76 65 20  ould still have 
0ee0: 32 20 72 6f 77 73 20 69 6e 20 74 68 65 20 74 61  2 rows in the ta
0ef0: 62 6c 65 0a 20 20 20 20 20 20 20 20 61 73 73 65  ble.        asse
0f00: 72 74 45 71 75 61 6c 73 28 32 2c 20 45 78 74 72  rtEquals(2, Extr
0f10: 61 55 74 69 6c 73 2e 6c 6f 6e 67 46 6f 72 51 75  aUtils.longForQu
0f20: 65 72 79 28 6d 44 61 74 61 62 61 73 65 2c 20 22  ery(mDatabase, "
0f30: 73 65 6c 65 63 74 20 63 6f 75 6e 74 28 2a 29 20  select count(*) 
0f40: 66 72 6f 6d 20 74 65 73 74 22 2c 20 6e 75 6c 6c  from test", null
0f50: 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20  ));..        // 
0f60: 74 65 73 74 20 64 65 6c 65 74 65 0a 20 20 20 20  test delete.    
0f70: 20 20 20 20 2f 2f 20 69 6e 73 65 72 74 20 32 20      // insert 2 
0f80: 6d 6f 72 65 20 72 6f 77 73 20 61 6e 64 20 64 65  more rows and de
0f90: 6c 65 74 65 20 33 20 6f 66 20 74 68 65 6d 0a 20  lete 3 of them. 
0fa0: 20 20 20 20 20 20 20 61 73 73 65 72 74 45 71 75         assertEqu
0fb0: 61 6c 73 28 33 2c 20 73 74 61 74 65 6d 65 6e 74  als(3, statement
0fc0: 31 2e 65 78 65 63 75 74 65 49 6e 73 65 72 74 28  1.executeInsert(
0fd0: 29 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ));.        asse
0fe0: 72 74 45 71 75 61 6c 73 28 34 2c 20 73 74 61 74  rtEquals(4, stat
0ff0: 65 6d 65 6e 74 31 2e 65 78 65 63 75 74 65 49 6e  ement1.executeIn
1000: 73 65 72 74 28 29 29 3b 0a 20 20 20 20 20 20 20  sert());.       
1010: 20 73 74 61 74 65 6d 65 6e 74 31 2e 63 6c 6f 73   statement1.clos
1020: 65 28 29 3b 0a 20 20 20 20 20 20 20 20 73 74 61  e();.        sta
1030: 74 65 6d 65 6e 74 32 20 3d 20 6d 44 61 74 61 62  tement2 = mDatab
1040: 61 73 65 2e 63 6f 6d 70 69 6c 65 53 74 61 74 65  ase.compileState
1050: 6d 65 6e 74 28 22 44 45 4c 45 54 45 20 66 72 6f  ment("DELETE fro
1060: 6d 20 74 65 73 74 20 57 48 45 52 45 20 5f 69 64  m test WHERE _id
1070: 20 3c 20 34 22 29 3b 0a 20 20 20 20 20 20 20 20   < 4");.        
1080: 61 73 73 65 72 74 45 71 75 61 6c 73 28 33 2c 20  assertEquals(3, 
1090: 73 74 61 74 65 6d 65 6e 74 32 2e 65 78 65 63 75  statement2.execu
10a0: 74 65 55 70 64 61 74 65 44 65 6c 65 74 65 28 29  teUpdateDelete()
10b0: 29 3b 0a 20 20 20 20 20 20 20 20 73 74 61 74 65  );.        state
10c0: 6d 65 6e 74 32 2e 63 6c 6f 73 65 28 29 3b 0a 20  ment2.close();. 
10d0: 20 20 20 20 20 20 20 2f 2f 20 73 68 6f 75 6c 64         // should
10e0: 20 73 74 69 6c 6c 20 68 61 76 65 20 31 20 72 6f   still have 1 ro
10f0: 77 31 20 69 6e 20 74 68 65 20 74 61 62 6c 65 0a  w1 in the table.
1100: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 45 71          assertEq
1110: 75 61 6c 73 28 31 2c 20 45 78 74 72 61 55 74 69  uals(1, ExtraUti
1120: 6c 73 2e 6c 6f 6e 67 46 6f 72 51 75 65 72 79 28  ls.longForQuery(
1130: 6d 44 61 74 61 62 61 73 65 2c 20 22 73 65 6c 65  mDatabase, "sele
1140: 63 74 20 63 6f 75 6e 74 28 2a 29 20 66 72 6f 6d  ct count(*) from
1150: 20 74 65 73 74 22 2c 20 6e 75 6c 6c 29 29 3b 0a   test", null));.
1160: 0a 20 20 20 20 20 20 20 20 2f 2f 20 69 66 20 74  .        // if t
1170: 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74  he SQL statement
1180: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68   is something th
1190: 61 74 20 63 61 75 73 65 73 20 72 6f 77 73 20 6f  at causes rows o
11a0: 66 20 64 61 74 61 20 74 6f 0a 20 20 20 20 20 20  f data to.      
11b0: 20 20 2f 2f 20 62 65 20 72 65 74 75 72 6e 65 64    // be returned
11c0: 2c 20 65 78 65 63 75 74 65 55 70 64 61 74 65 44  , executeUpdateD
11d0: 65 6c 65 74 65 28 29 20 28 61 6e 64 20 65 78 65  elete() (and exe
11e0: 63 75 74 65 28 29 29 20 74 68 72 6f 77 20 61 6e  cute()) throw an
11f0: 20 65 78 63 65 70 74 69 6f 6e 2e 0a 20 20 20 20   exception..    
1200: 20 20 20 20 73 74 61 74 65 6d 65 6e 74 32 20 3d      statement2 =
1210: 20 6d 44 61 74 61 62 61 73 65 2e 63 6f 6d 70 69   mDatabase.compi
1220: 6c 65 53 74 61 74 65 6d 65 6e 74 28 22 53 45 4c  leStatement("SEL
1230: 45 43 54 20 63 6f 75 6e 74 28 2a 29 20 46 52 4f  ECT count(*) FRO
1240: 4d 20 74 65 73 74 22 29 3b 0a 20 20 20 20 20 20  M test");.      
1250: 20 20 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20    try {.        
1260: 20 20 20 20 73 74 61 74 65 6d 65 6e 74 32 2e 65      statement2.e
1270: 78 65 63 75 74 65 55 70 64 61 74 65 44 65 6c 65  xecuteUpdateDele
1280: 74 65 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  te();.          
1290: 20 20 66 61 69 6c 28 22 65 78 63 65 70 74 69 6f    fail("exceptio
12a0: 6e 20 65 78 70 65 63 74 65 64 22 29 3b 0a 20 20  n expected");.  
12b0: 20 20 20 20 20 20 7d 20 63 61 74 63 68 20 28 53        } catch (S
12c0: 51 4c 45 78 63 65 70 74 69 6f 6e 20 65 29 20 7b  QLException e) {
12d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20  .            // 
12e0: 65 78 70 65 63 74 65 64 0a 20 20 20 20 20 20 20  expected.       
12f0: 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a 20 20 20   } finally {.   
1300: 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65           stateme
1310: 6e 74 32 2e 63 6c 6f 73 65 28 29 3b 0a 20 20 20  nt2.close();.   
1320: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20       }.    }..  
1330: 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20 74 65    public void te
1340: 73 74 45 78 65 63 75 74 65 49 6e 73 65 72 74 28  stExecuteInsert(
1350: 29 20 7b 0a 20 20 20 20 20 20 20 20 70 6f 70 75  ) {.        popu
1360: 6c 61 74 65 44 65 66 61 75 6c 74 54 61 62 6c 65  lateDefaultTable
1370: 28 29 3b 0a 0a 20 20 20 20 20 20 20 20 43 75 72  ();..        Cur
1380: 73 6f 72 20 63 20 3d 20 6d 44 61 74 61 62 61 73  sor c = mDatabas
1390: 65 2e 71 75 65 72 79 28 22 74 65 73 74 22 2c 20  e.query("test", 
13a0: 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c  null, null, null
13b0: 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e 75  , null, null, nu
13c0: 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  ll);.        ass
13d0: 65 72 74 45 71 75 61 6c 73 28 30 2c 20 63 2e 67  ertEquals(0, c.g
13e0: 65 74 43 6f 75 6e 74 28 29 29 3b 0a 0a 20 20 20  etCount());..   
13f0: 20 20 20 20 20 2f 2f 20 74 65 73 74 20 69 6e 73       // test ins
1400: 65 72 74 0a 20 20 20 20 20 20 20 20 53 51 4c 69  ert.        SQLi
1410: 74 65 53 74 61 74 65 6d 65 6e 74 20 73 74 61 74  teStatement stat
1420: 65 6d 65 6e 74 20 3d 20 6d 44 61 74 61 62 61 73  ement = mDatabas
1430: 65 2e 63 6f 6d 70 69 6c 65 53 74 61 74 65 6d 65  e.compileStateme
1440: 6e 74 28 0a 20 20 20 20 20 20 20 20 20 20 20 20  nt(.            
1450: 20 20 20 20 22 49 4e 53 45 52 54 20 49 4e 54 4f      "INSERT INTO
1460: 20 74 65 73 74 20 28 64 61 74 61 29 20 56 41 4c   test (data) VAL
1470: 55 45 53 20 28 27 22 20 2b 20 53 54 52 49 4e 47  UES ('" + STRING
1480: 32 20 2b 20 22 27 29 22 29 3b 0a 20 20 20 20 20  2 + "')");.     
1490: 20 20 20 61 73 73 65 72 74 45 71 75 61 6c 73 28     assertEquals(
14a0: 31 2c 20 73 74 61 74 65 6d 65 6e 74 2e 65 78 65  1, statement.exe
14b0: 63 75 74 65 49 6e 73 65 72 74 28 29 29 3b 0a 20  cuteInsert());. 
14c0: 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74         statement
14d0: 2e 63 6c 6f 73 65 28 29 3b 0a 0a 20 20 20 20 20  .close();..     
14e0: 20 20 20 2f 2f 20 74 72 79 20 74 6f 20 69 6e 73     // try to ins
14f0: 65 72 74 20 61 6e 6f 74 68 65 72 20 72 6f 77 20  ert another row 
1500: 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 69 64  with the same id
1510: 2e 20 6c 61 73 74 20 69 6e 73 65 72 74 65 64 20  . last inserted 
1520: 72 6f 77 69 64 20 73 68 6f 75 6c 64 20 62 65 20  rowid should be 
1530: 2d 31 0a 20 20 20 20 20 20 20 20 73 74 61 74 65  -1.        state
1540: 6d 65 6e 74 20 3d 20 6d 44 61 74 61 62 61 73 65  ment = mDatabase
1550: 2e 63 6f 6d 70 69 6c 65 53 74 61 74 65 6d 65 6e  .compileStatemen
1560: 74 28 22 69 6e 73 65 72 74 20 6f 72 20 69 67 6e  t("insert or ign
1570: 6f 72 65 20 69 6e 74 6f 20 74 65 73 74 20 76 61  ore into test va
1580: 6c 75 65 73 28 31 2c 20 31 29 3b 22 29 3b 0a 20  lues(1, 1);");. 
1590: 20 20 20 20 20 20 20 61 73 73 65 72 74 45 71 75         assertEqu
15a0: 61 6c 73 28 2d 31 2c 20 73 74 61 74 65 6d 65 6e  als(-1, statemen
15b0: 74 2e 65 78 65 63 75 74 65 49 6e 73 65 72 74 28  t.executeInsert(
15c0: 29 29 3b 0a 20 20 20 20 20 20 20 20 73 74 61 74  ));.        stat
15d0: 65 6d 65 6e 74 2e 63 6c 6f 73 65 28 29 3b 0a 0a  ement.close();..
15e0: 20 20 20 20 20 20 20 20 63 20 3d 20 6d 44 61 74          c = mDat
15f0: 61 62 61 73 65 2e 71 75 65 72 79 28 22 74 65 73  abase.query("tes
1600: 74 22 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c 20  t", null, null, 
1610: 6e 75 6c 6c 2c 20 6e 75 6c 6c 2c 20 6e 75 6c 6c  null, null, null
1620: 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  , null);.       
1630: 20 61 73 73 65 72 74 45 71 75 61 6c 73 28 31 2c   assertEquals(1,
1640: 20 63 2e 67 65 74 43 6f 75 6e 74 28 29 29 3b 0a   c.getCount());.
1650: 0a 20 20 20 20 20 20 20 20 63 2e 6d 6f 76 65 54  .        c.moveT
1660: 6f 46 69 72 73 74 28 29 3b 0a 20 20 20 20 20 20  oFirst();.      
1670: 20 20 61 73 73 65 72 74 45 71 75 61 6c 73 28 53    assertEquals(S
1680: 54 52 49 4e 47 32 2c 20 63 2e 67 65 74 53 74 72  TRING2, c.getStr
1690: 69 6e 67 28 63 2e 67 65 74 43 6f 6c 75 6d 6e 49  ing(c.getColumnI
16a0: 6e 64 65 78 28 22 64 61 74 61 22 29 29 29 3b 0a  ndex("data")));.
16b0: 20 20 20 20 20 20 20 20 63 2e 63 6c 6f 73 65 28          c.close(
16c0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 69  );..        // i
16d0: 66 20 74 68 65 20 73 71 6c 20 73 74 61 74 65 6d  f the sql statem
16e0: 65 6e 74 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  ent is something
16f0: 20 74 68 61 74 20 63 61 75 73 65 73 20 72 6f 77   that causes row
1700: 73 20 6f 66 20 64 61 74 61 20 74 6f 0a 20 20 20  s of data to.   
1710: 20 20 20 20 20 2f 2f 20 62 65 20 72 65 74 75 72       // be retur
1720: 6e 65 64 2c 20 65 78 65 63 75 74 65 49 6e 73 65  ned, executeInse
1730: 72 74 28 29 20 74 68 72 6f 77 73 20 61 6e 20 65  rt() throws an e
1740: 78 63 65 70 74 69 6f 6e 0a 20 20 20 20 20 20 20  xception.       
1750: 20 73 74 61 74 65 6d 65 6e 74 20 3d 20 6d 44 61   statement = mDa
1760: 74 61 62 61 73 65 2e 63 6f 6d 70 69 6c 65 53 74  tabase.compileSt
1770: 61 74 65 6d 65 6e 74 28 0a 20 20 20 20 20 20 20  atement(.       
1780: 20 20 20 20 20 20 20 20 20 22 53 45 4c 45 43 54           "SELECT
1790: 20 2a 20 46 52 4f 4d 20 74 65 73 74 20 57 48 45   * FROM test WHE
17a0: 52 45 20 64 61 74 61 3d 5c 22 22 20 2b 20 53 54  RE data=\"" + ST
17b0: 52 49 4e 47 32 20 2b 20 22 5c 22 22 29 3b 0a 20  RING2 + "\"");. 
17c0: 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20         try {.   
17d0: 20 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65           stateme
17e0: 6e 74 2e 65 78 65 63 75 74 65 49 6e 73 65 72 74  nt.executeInsert
17f0: 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ();.            
1800: 66 61 69 6c 28 22 65 78 63 65 70 74 69 6f 6e 20  fail("exception 
1810: 65 78 70 65 63 74 65 64 22 29 3b 0a 20 20 20 20  expected");.    
1820: 20 20 20 20 7d 20 63 61 74 63 68 20 28 53 51 4c      } catch (SQL
1830: 45 78 63 65 70 74 69 6f 6e 20 65 29 20 7b 0a 20  Exception e) {. 
1840: 20 20 20 20 20 20 20 20 20 20 20 2f 2f 20 65 78             // ex
1850: 70 65 63 74 65 64 0a 20 20 20 20 20 20 20 20 7d  pected.        }
1860: 20 66 69 6e 61 6c 6c 79 20 7b 0a 20 20 20 20 20   finally {.     
1870: 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e 74         statement
1880: 2e 63 6c 6f 73 65 28 29 3b 0a 0a 20 20 20 20 20  .close();..     
1890: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
18a0: 70 75 62 6c 69 63 20 76 6f 69 64 20 74 65 73 74  public void test
18b0: 53 69 6d 70 6c 65 51 75 65 72 79 46 6f 72 4c 6f  SimpleQueryForLo
18c0: 6e 67 28 29 20 7b 0a 20 20 20 20 20 20 20 20 6d  ng() {.        m
18d0: 44 61 74 61 62 61 73 65 2e 65 78 65 63 53 51 4c  Database.execSQL
18e0: 28 22 43 52 45 41 54 45 20 54 41 42 4c 45 20 74  ("CREATE TABLE t
18f0: 65 73 74 20 28 6e 75 6d 20 49 4e 54 45 47 45 52  est (num INTEGER
1900: 20 4e 4f 54 20 4e 55 4c 4c 2c 20 73 74 72 20 54   NOT NULL, str T
1910: 45 58 54 20 4e 4f 54 20 4e 55 4c 4c 29 3b 22 29  EXT NOT NULL);")
1920: 3b 0a 20 20 20 20 20 20 20 20 6d 44 61 74 61 62  ;.        mDatab
1930: 61 73 65 2e 65 78 65 63 53 51 4c 28 22 49 4e 53  ase.execSQL("INS
1940: 45 52 54 20 49 4e 54 4f 20 74 65 73 74 20 56 41  ERT INTO test VA
1950: 4c 55 45 53 20 28 31 32 33 34 2c 20 27 68 65 6c  LUES (1234, 'hel
1960: 6c 6f 27 29 3b 22 29 3b 0a 20 20 20 20 20 20 20  lo');");.       
1970: 20 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74   SQLiteStatement
1980: 20 73 74 61 74 65 6d 65 6e 74 20 3d 0a 20 20 20   statement =.   
1990: 20 20 20 20 20 20 20 20 20 20 20 20 20 6d 44 61               mDa
19a0: 74 61 62 61 73 65 2e 63 6f 6d 70 69 6c 65 53 74  tabase.compileSt
19b0: 61 74 65 6d 65 6e 74 28 22 53 45 4c 45 43 54 20  atement("SELECT 
19c0: 6e 75 6d 20 46 52 4f 4d 20 74 65 73 74 20 57 48  num FROM test WH
19d0: 45 52 45 20 73 74 72 20 3d 20 3f 22 29 3b 0a 0a  ERE str = ?");..
19e0: 20 20 20 20 20 20 20 20 2f 2f 20 74 65 73 74 20          // test 
19f0: 71 75 65 72 79 20 6c 6f 6e 67 0a 20 20 20 20 20  query long.     
1a00: 20 20 20 73 74 61 74 65 6d 65 6e 74 2e 62 69 6e     statement.bin
1a10: 64 53 74 72 69 6e 67 28 31 2c 20 22 68 65 6c 6c  dString(1, "hell
1a20: 6f 22 29 3b 0a 20 20 20 20 20 20 20 20 6c 6f 6e  o");.        lon
1a30: 67 20 76 61 6c 75 65 20 3d 20 73 74 61 74 65 6d  g value = statem
1a40: 65 6e 74 2e 73 69 6d 70 6c 65 51 75 65 72 79 46  ent.simpleQueryF
1a50: 6f 72 4c 6f 6e 67 28 29 3b 0a 20 20 20 20 20 20  orLong();.      
1a60: 20 20 61 73 73 65 72 74 45 71 75 61 6c 73 28 31    assertEquals(1
1a70: 32 33 34 2c 20 76 61 6c 75 65 29 3b 0a 0a 20 20  234, value);..  
1a80: 20 20 20 20 20 20 2f 2f 20 74 65 73 74 20 71 75        // test qu
1a90: 65 72 79 20 72 65 74 75 72 6e 73 20 7a 65 72 6f  ery returns zero
1aa0: 20 72 6f 77 73 0a 20 20 20 20 20 20 20 20 73 74   rows.        st
1ab0: 61 74 65 6d 65 6e 74 2e 62 69 6e 64 53 74 72 69  atement.bindStri
1ac0: 6e 67 28 31 2c 20 22 77 6f 72 6c 64 22 29 3b 0a  ng(1, "world");.
1ad0: 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20  .        try {. 
1ae0: 20 20 20 20 20 20 20 20 20 20 20 73 74 61 74 65             state
1af0: 6d 65 6e 74 2e 73 69 6d 70 6c 65 51 75 65 72 79  ment.simpleQuery
1b00: 46 6f 72 4c 6f 6e 67 28 29 3b 0a 20 20 20 20 20  ForLong();.     
1b10: 20 20 20 20 20 20 20 66 61 69 6c 28 22 54 68 65         fail("The
1b20: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 61 20 53  re should be a S
1b30: 51 4c 69 74 65 44 6f 6e 65 45 78 63 65 70 74 69  QLiteDoneExcepti
1b40: 6f 6e 20 74 68 72 6f 77 6e 20 6f 75 74 2e 22 29  on thrown out.")
1b50: 3b 0a 20 20 20 20 20 20 20 20 7d 20 63 61 74 63  ;.        } catc
1b60: 68 20 28 53 51 4c 69 74 65 44 6f 6e 65 45 78 63  h (SQLiteDoneExc
1b70: 65 70 74 69 6f 6e 20 65 29 20 7b 0a 20 20 20 20  eption e) {.    
1b80: 20 20 20 20 20 20 20 20 2f 2f 20 65 78 70 65 63          // expec
1b90: 74 65 64 2e 0a 20 20 20 20 20 20 20 20 7d 0a 0a  ted..        }..
1ba0: 20 20 20 20 20 20 20 20 73 74 61 74 65 6d 65 6e          statemen
1bb0: 74 2e 63 6c 6f 73 65 28 29 3b 0a 20 20 20 20 7d  t.close();.    }
1bc0: 0a 0a 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69  ..    public voi
1bd0: 64 20 74 65 73 74 53 69 6d 70 6c 65 51 75 65 72  d testSimpleQuer
1be0: 79 46 6f 72 53 74 72 69 6e 67 28 29 20 7b 0a 20  yForString() {. 
1bf0: 20 20 20 20 20 20 20 6d 44 61 74 61 62 61 73 65         mDatabase
1c00: 2e 65 78 65 63 53 51 4c 28 22 43 52 45 41 54 45  .execSQL("CREATE
1c10: 20 54 41 42 4c 45 20 74 65 73 74 20 28 6e 75 6d   TABLE test (num
1c20: 20 49 4e 54 45 47 45 52 20 4e 4f 54 20 4e 55 4c   INTEGER NOT NUL
1c30: 4c 2c 20 73 74 72 20 54 45 58 54 20 4e 4f 54 20  L, str TEXT NOT 
1c40: 4e 55 4c 4c 29 3b 22 29 3b 0a 20 20 20 20 20 20  NULL);");.      
1c50: 20 20 6d 44 61 74 61 62 61 73 65 2e 65 78 65 63    mDatabase.exec
1c60: 53 51 4c 28 22 49 4e 53 45 52 54 20 49 4e 54 4f  SQL("INSERT INTO
1c70: 20 74 65 73 74 20 56 41 4c 55 45 53 20 28 31 32   test VALUES (12
1c80: 33 34 2c 20 27 68 65 6c 6c 6f 27 29 3b 22 29 3b  34, 'hello');");
1c90: 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 53  .        SQLiteS
1ca0: 74 61 74 65 6d 65 6e 74 20 73 74 61 74 65 6d 65  tatement stateme
1cb0: 6e 74 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20  nt =.           
1cc0: 20 20 20 20 20 6d 44 61 74 61 62 61 73 65 2e 63       mDatabase.c
1cd0: 6f 6d 70 69 6c 65 53 74 61 74 65 6d 65 6e 74 28  ompileStatement(
1ce0: 22 53 45 4c 45 43 54 20 73 74 72 20 46 52 4f 4d  "SELECT str FROM
1cf0: 20 74 65 73 74 20 57 48 45 52 45 20 6e 75 6d 20   test WHERE num 
1d00: 3d 20 3f 22 29 3b 0a 0a 20 20 20 20 20 20 20 20  = ?");..        
1d10: 2f 2f 20 74 65 73 74 20 71 75 65 72 79 20 53 74  // test query St
1d20: 72 69 6e 67 0a 20 20 20 20 20 20 20 20 73 74 61  ring.        sta
1d30: 74 65 6d 65 6e 74 2e 62 69 6e 64 4c 6f 6e 67 28  tement.bindLong(
1d40: 31 2c 20 31 32 33 34 29 3b 0a 20 20 20 20 20 20  1, 1234);.      
1d50: 20 20 53 74 72 69 6e 67 20 76 61 6c 75 65 20 3d    String value =
1d60: 20 73 74 61 74 65 6d 65 6e 74 2e 73 69 6d 70 6c   statement.simpl
1d70: 65 51 75 65 72 79 46 6f 72 53 74 72 69 6e 67 28  eQueryForString(
1d80: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
1d90: 74 45 71 75 61 6c 73 28 22 68 65 6c 6c 6f 22 2c  tEquals("hello",
1da0: 20 76 61 6c 75 65 29 3b 0a 0a 20 20 20 20 20 20   value);..      
1db0: 20 20 2f 2f 20 74 65 73 74 20 71 75 65 72 79 20    // test query 
1dc0: 72 65 74 75 72 6e 73 20 7a 65 72 6f 20 72 6f 77  returns zero row
1dd0: 73 0a 20 20 20 20 20 20 20 20 73 74 61 74 65 6d  s.        statem
1de0: 65 6e 74 2e 62 69 6e 64 4c 6f 6e 67 28 31 2c 20  ent.bindLong(1, 
1df0: 35 36 37 38 29 3b 0a 0a 20 20 20 20 20 20 20 20  5678);..        
1e00: 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20  try {.          
1e10: 20 20 73 74 61 74 65 6d 65 6e 74 2e 73 69 6d 70    statement.simp
1e20: 6c 65 51 75 65 72 79 46 6f 72 53 74 72 69 6e 67  leQueryForString
1e30: 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ();.            
1e40: 66 61 69 6c 28 22 54 68 65 72 65 20 73 68 6f 75  fail("There shou
1e50: 6c 64 20 62 65 20 61 20 53 51 4c 69 74 65 44 6f  ld be a SQLiteDo
1e60: 6e 65 45 78 63 65 70 74 69 6f 6e 20 74 68 72 6f  neException thro
1e70: 77 6e 20 6f 75 74 2e 22 29 3b 0a 20 20 20 20 20  wn out.");.     
1e80: 20 20 20 7d 20 63 61 74 63 68 20 28 53 51 4c 69     } catch (SQLi
1e90: 74 65 44 6f 6e 65 45 78 63 65 70 74 69 6f 6e 20  teDoneException 
1ea0: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  e) {.           
1eb0: 20 2f 2f 20 65 78 70 65 63 74 65 64 2e 0a 20 20   // expected..  
1ec0: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20        }..       
1ed0: 20 73 74 61 74 65 6d 65 6e 74 2e 63 6c 6f 73 65   statement.close
1ee0: 28 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 40  ();.    }..    @
1ef0: 53 75 70 70 72 65 73 73 0a 20 20 20 20 70 75 62  Suppress.    pub
1f00: 6c 69 63 20 76 6f 69 64 20 74 65 73 74 53 69 6d  lic void testSim
1f10: 70 6c 65 51 75 65 72 79 46 6f 72 42 6c 6f 62 46  pleQueryForBlobF
1f20: 69 6c 65 44 65 73 63 72 69 70 74 6f 72 53 75 63  ileDescriptorSuc
1f30: 63 65 73 73 4e 6f 72 6d 61 6c 28 29 20 74 68 72  cessNormal() thr
1f40: 6f 77 73 20 49 4f 45 78 63 65 70 74 69 6f 6e 20  ows IOException 
1f50: 7b 0a 20 20 20 20 20 20 20 20 64 6f 54 65 73 74  {.        doTest
1f60: 53 69 6d 70 6c 65 51 75 65 72 79 46 6f 72 42 6c  SimpleQueryForBl
1f70: 6f 62 46 69 6c 65 44 65 73 63 72 69 70 74 6f 72  obFileDescriptor
1f80: 53 75 63 63 65 73 73 28 30 29 3b 0a 20 20 20 20  Success(0);.    
1f90: 7d 0a 0a 20 20 20 20 40 53 75 70 70 72 65 73 73  }..    @Suppress
1fa0: 0a 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64  .    public void
1fb0: 20 74 65 73 74 53 69 6d 70 6c 65 51 75 65 72 79   testSimpleQuery
1fc0: 46 6f 72 42 6c 6f 62 46 69 6c 65 44 65 73 63 72  ForBlobFileDescr
1fd0: 69 70 74 6f 72 53 75 63 63 65 73 73 45 6d 70 74  iptorSuccessEmpt
1fe0: 79 28 29 20 74 68 72 6f 77 73 20 49 4f 45 78 63  y() throws IOExc
1ff0: 65 70 74 69 6f 6e 20 7b 0a 20 20 20 20 20 20 20  eption {.       
2000: 20 64 6f 54 65 73 74 53 69 6d 70 6c 65 51 75 65   doTestSimpleQue
2010: 72 79 46 6f 72 42 6c 6f 62 46 69 6c 65 44 65 73  ryForBlobFileDes
2020: 63 72 69 70 74 6f 72 53 75 63 63 65 73 73 28 31  criptorSuccess(1
2030: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 40 53  );.    }..    @S
2040: 75 70 70 72 65 73 73 0a 20 20 20 20 70 75 62 6c  uppress.    publ
2050: 69 63 20 76 6f 69 64 20 74 65 73 74 53 69 6d 70  ic void testSimp
2060: 6c 65 51 75 65 72 79 46 6f 72 42 6c 6f 62 46 69  leQueryForBlobFi
2070: 6c 65 44 65 73 63 72 69 70 74 6f 72 53 75 63 63  leDescriptorSucc
2080: 65 73 73 4e 75 6c 6c 28 29 20 7b 0a 20 20 20 20  essNull() {.    
2090: 20 20 20 20 70 6f 70 75 6c 61 74 65 42 6c 6f 62      populateBlob
20a0: 54 61 62 6c 65 28 29 3b 0a 0a 20 20 20 20 20 20  Table();..      
20b0: 20 20 53 74 72 69 6e 67 20 73 71 6c 20 3d 20 22    String sql = "
20c0: 53 45 4c 45 43 54 20 64 61 74 61 20 46 52 4f 4d  SELECT data FROM
20d0: 20 62 6c 6f 62 5f 74 65 73 74 20 57 48 45 52 45   blob_test WHERE
20e0: 20 5f 69 64 20 3d 20 22 20 2b 20 32 3b 0a 20 20   _id = " + 2;.  
20f0: 20 20 20 20 20 20 53 51 4c 69 74 65 53 74 61 74        SQLiteStat
2100: 65 6d 65 6e 74 20 73 74 6d 20 3d 20 6d 44 61 74  ement stm = mDat
2110: 61 62 61 73 65 2e 63 6f 6d 70 69 6c 65 53 74 61  abase.compileSta
2120: 74 65 6d 65 6e 74 28 73 71 6c 29 3b 0a 20 20 20  tement(sql);.   
2130: 20 20 20 20 20 61 73 73 65 72 74 4e 75 6c 6c 28       assertNull(
2140: 73 74 6d 2e 73 69 6d 70 6c 65 51 75 65 72 79 46  stm.simpleQueryF
2150: 6f 72 42 6c 6f 62 46 69 6c 65 44 65 73 63 72 69  orBlobFileDescri
2160: 70 74 6f 72 28 29 29 3b 0a 20 20 20 20 7d 0a 0a  ptor());.    }..
2170: 20 20 20 20 40 53 75 70 70 72 65 73 73 0a 20 20      @Suppress.  
2180: 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20 74 65    public void te
2190: 73 74 53 69 6d 70 6c 65 51 75 65 72 79 46 6f 72  stSimpleQueryFor
21a0: 42 6c 6f 62 46 69 6c 65 44 65 73 63 72 69 70 74  BlobFileDescript
21b0: 6f 72 53 75 63 63 65 73 73 30 30 28 29 20 74 68  orSuccess00() th
21c0: 72 6f 77 73 20 49 4f 45 78 63 65 70 74 69 6f 6e  rows IOException
21d0: 20 7b 0a 20 20 20 20 20 20 20 20 64 6f 54 65 73   {.        doTes
21e0: 74 53 69 6d 70 6c 65 51 75 65 72 79 46 6f 72 42  tSimpleQueryForB
21f0: 6c 6f 62 46 69 6c 65 44 65 73 63 72 69 70 74 6f  lobFileDescripto
2200: 72 53 75 63 63 65 73 73 28 33 29 3b 0a 20 20 20  rSuccess(3);.   
2210: 20 7d 0a 0a 20 20 20 20 40 53 75 70 70 72 65 73   }..    @Suppres
2220: 73 0a 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69  s.    public voi
2230: 64 20 74 65 73 74 53 69 6d 70 6c 65 51 75 65 72  d testSimpleQuer
2240: 79 46 6f 72 42 6c 6f 62 46 69 6c 65 44 65 73 63  yForBlobFileDesc
2250: 72 69 70 74 6f 72 53 75 63 63 65 73 73 46 46 28  riptorSuccessFF(
2260: 29 20 74 68 72 6f 77 73 20 49 4f 45 78 63 65 70  ) throws IOExcep
2270: 74 69 6f 6e 20 7b 0a 20 20 20 20 20 20 20 20 64  tion {.        d
2280: 6f 54 65 73 74 53 69 6d 70 6c 65 51 75 65 72 79  oTestSimpleQuery
2290: 46 6f 72 42 6c 6f 62 46 69 6c 65 44 65 73 63 72  ForBlobFileDescr
22a0: 69 70 74 6f 72 53 75 63 63 65 73 73 28 34 29 3b  iptorSuccess(4);
22b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 40 53 75 70  .    }..    @Sup
22c0: 70 72 65 73 73 0a 20 20 20 20 70 75 62 6c 69 63  press.    public
22d0: 20 76 6f 69 64 20 74 65 73 74 53 69 6d 70 6c 65   void testSimple
22e0: 51 75 65 72 79 46 6f 72 42 6c 6f 62 46 69 6c 65  QueryForBlobFile
22f0: 44 65 73 63 72 69 70 74 6f 72 53 75 63 63 65 73  DescriptorSucces
2300: 73 45 6d 62 65 64 64 65 64 4e 75 6c 28 29 20 74  sEmbeddedNul() t
2310: 68 72 6f 77 73 20 49 4f 45 78 63 65 70 74 69 6f  hrows IOExceptio
2320: 6e 20 7b 0a 20 20 20 20 20 20 20 20 64 6f 54 65  n {.        doTe
2330: 73 74 53 69 6d 70 6c 65 51 75 65 72 79 46 6f 72  stSimpleQueryFor
2340: 42 6c 6f 62 46 69 6c 65 44 65 73 63 72 69 70 74  BlobFileDescript
2350: 6f 72 53 75 63 63 65 73 73 28 35 29 3b 0a 20 20  orSuccess(5);.  
2360: 20 20 7d 0a 0a 20 20 20 20 40 53 75 70 70 72 65    }..    @Suppre
2370: 73 73 0a 20 20 20 20 70 72 69 76 61 74 65 20 76  ss.    private v
2380: 6f 69 64 20 64 6f 54 65 73 74 53 69 6d 70 6c 65  oid doTestSimple
2390: 51 75 65 72 79 46 6f 72 42 6c 6f 62 46 69 6c 65  QueryForBlobFile
23a0: 44 65 73 63 72 69 70 74 6f 72 53 75 63 63 65 73  DescriptorSucces
23b0: 73 28 69 6e 74 20 69 29 20 74 68 72 6f 77 73 20  s(int i) throws 
23c0: 49 4f 45 78 63 65 70 74 69 6f 6e 20 7b 0a 20 20  IOException {.  
23d0: 20 20 20 20 20 20 70 6f 70 75 6c 61 74 65 42 6c        populateBl
23e0: 6f 62 54 61 62 6c 65 28 29 3b 0a 0a 20 20 20 20  obTable();..    
23f0: 20 20 20 20 53 74 72 69 6e 67 20 73 71 6c 20 3d      String sql =
2400: 20 22 53 45 4c 45 43 54 20 64 61 74 61 20 46 52   "SELECT data FR
2410: 4f 4d 20 62 6c 6f 62 5f 74 65 73 74 20 57 48 45  OM blob_test WHE
2420: 52 45 20 5f 69 64 20 3d 20 22 20 2b 20 69 3b 0a  RE _id = " + i;.
2430: 20 20 20 20 20 20 20 20 53 51 4c 69 74 65 53 74          SQLiteSt
2440: 61 74 65 6d 65 6e 74 20 73 74 6d 20 3d 20 6d 44  atement stm = mD
2450: 61 74 61 62 61 73 65 2e 63 6f 6d 70 69 6c 65 53  atabase.compileS
2460: 74 61 74 65 6d 65 6e 74 28 73 71 6c 29 3b 0a 20  tatement(sql);. 
2470: 20 20 20 20 20 20 20 50 61 72 63 65 6c 46 69 6c         ParcelFil
2480: 65 44 65 73 63 72 69 70 74 6f 72 20 66 64 20 3d  eDescriptor fd =
2490: 20 73 74 6d 2e 73 69 6d 70 6c 65 51 75 65 72 79   stm.simpleQuery
24a0: 46 6f 72 42 6c 6f 62 46 69 6c 65 44 65 73 63 72  ForBlobFileDescr
24b0: 69 70 74 6f 72 28 29 3b 0a 20 20 20 20 20 20 20  iptor();.       
24c0: 20 61 73 73 65 72 74 46 69 6c 65 44 65 73 63 72   assertFileDescr
24d0: 69 70 74 6f 72 43 6f 6e 74 65 6e 74 28 42 4c 4f  iptorContent(BLO
24e0: 42 53 5b 69 5d 2c 20 66 64 29 3b 0a 20 20 20 20  BS[i], fd);.    
24f0: 7d 0a 0a 20 20 20 20 40 53 75 70 70 72 65 73 73  }..    @Suppress
2500: 0a 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64  .    public void
2510: 20 74 65 73 74 53 69 6d 70 6c 65 51 75 65 72 79   testSimpleQuery
2520: 46 6f 72 42 6c 6f 62 46 69 6c 65 44 65 73 63 72  ForBlobFileDescr
2530: 69 70 74 6f 72 53 75 63 63 65 73 73 50 61 72 61  iptorSuccessPara
2540: 6d 28 29 20 74 68 72 6f 77 73 20 49 4f 45 78 63  m() throws IOExc
2550: 65 70 74 69 6f 6e 20 7b 0a 20 20 20 20 20 20 20  eption {.       
2560: 20 70 6f 70 75 6c 61 74 65 42 6c 6f 62 54 61 62   populateBlobTab
2570: 6c 65 28 29 3b 0a 0a 20 20 20 20 20 20 20 20 53  le();..        S
2580: 74 72 69 6e 67 20 73 71 6c 20 3d 20 22 53 45 4c  tring sql = "SEL
2590: 45 43 54 20 64 61 74 61 20 46 52 4f 4d 20 62 6c  ECT data FROM bl
25a0: 6f 62 5f 74 65 73 74 20 57 48 45 52 45 20 5f 69  ob_test WHERE _i
25b0: 64 20 3d 20 3f 22 3b 0a 20 20 20 20 20 20 20 20  d = ?";.        
25c0: 53 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20  SQLiteStatement 
25d0: 73 74 6d 20 3d 20 6d 44 61 74 61 62 61 73 65 2e  stm = mDatabase.
25e0: 63 6f 6d 70 69 6c 65 53 74 61 74 65 6d 65 6e 74  compileStatement
25f0: 28 73 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 73  (sql);.        s
2600: 74 6d 2e 62 69 6e 64 4c 6f 6e 67 28 31 2c 20 30  tm.bindLong(1, 0
2610: 29 3b 0a 20 20 20 20 20 20 20 20 50 61 72 63 65  );.        Parce
2620: 6c 46 69 6c 65 44 65 73 63 72 69 70 74 6f 72 20  lFileDescriptor 
2630: 66 64 20 3d 20 73 74 6d 2e 73 69 6d 70 6c 65 51  fd = stm.simpleQ
2640: 75 65 72 79 46 6f 72 42 6c 6f 62 46 69 6c 65 44  ueryForBlobFileD
2650: 65 73 63 72 69 70 74 6f 72 28 29 3b 0a 20 20 20  escriptor();.   
2660: 20 20 20 20 20 61 73 73 65 72 74 46 69 6c 65 44       assertFileD
2670: 65 73 63 72 69 70 74 6f 72 43 6f 6e 74 65 6e 74  escriptorContent
2680: 28 42 4c 4f 42 53 5b 30 5d 2c 20 66 64 29 3b 0a  (BLOBS[0], fd);.
2690: 20 20 20 20 7d 0a 0a 20 20 20 20 70 75 62 6c 69      }..    publi
26a0: 63 20 76 6f 69 64 20 74 65 73 74 47 65 74 42 6c  c void testGetBl
26b0: 6f 62 46 61 69 6c 75 72 65 4e 6f 50 61 72 61 6d  obFailureNoParam
26c0: 28 29 20 74 68 72 6f 77 73 20 45 78 63 65 70 74  () throws Except
26d0: 69 6f 6e 20 7b 0a 20 20 20 20 20 20 20 20 70 6f  ion {.        po
26e0: 70 75 6c 61 74 65 42 6c 6f 62 54 61 62 6c 65 28  pulateBlobTable(
26f0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 53 74 72 69  );..        Stri
2700: 6e 67 20 73 71 6c 20 3d 20 22 53 45 4c 45 43 54  ng sql = "SELECT
2710: 20 64 61 74 61 20 46 52 4f 4d 20 62 6c 6f 62 5f   data FROM blob_
2720: 74 65 73 74 20 57 48 45 52 45 20 5f 69 64 20 3d  test WHERE _id =
2730: 20 31 30 30 22 3b 0a 20 20 20 20 20 20 20 20 53   100";.        S
2740: 51 4c 69 74 65 53 74 61 74 65 6d 65 6e 74 20 73  QLiteStatement s
2750: 74 6d 20 3d 20 6d 44 61 74 61 62 61 73 65 2e 63  tm = mDatabase.c
2760: 6f 6d 70 69 6c 65 53 74 61 74 65 6d 65 6e 74 28  ompileStatement(
2770: 73 71 6c 29 3b 0a 20 20 20 20 20 20 20 20 50 61  sql);.        Pa
2780: 72 63 65 6c 46 69 6c 65 44 65 73 63 72 69 70 74  rcelFileDescript
2790: 6f 72 20 66 64 20 3d 20 6e 75 6c 6c 3b 0a 20 20  or fd = null;.  
27a0: 20 20 20 20 20 20 53 51 4c 69 74 65 44 6f 6e 65        SQLiteDone
27b0: 45 78 63 65 70 74 69 6f 6e 20 65 78 70 65 63 74  Exception expect
27c0: 65 64 45 78 63 65 70 74 69 6f 6e 20 3d 20 6e 75  edException = nu
27d0: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 74 72 79 20  ll;.        try 
27e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 64  {.            fd
27f0: 20 3d 20 73 74 6d 2e 73 69 6d 70 6c 65 51 75 65   = stm.simpleQue
2800: 72 79 46 6f 72 42 6c 6f 62 46 69 6c 65 44 65 73  ryForBlobFileDes
2810: 63 72 69 70 74 6f 72 28 29 3b 0a 20 20 20 20 20  criptor();.     
2820: 20 20 20 7d 20 63 61 74 63 68 20 28 53 51 4c 69     } catch (SQLi
2830: 74 65 44 6f 6e 65 45 78 63 65 70 74 69 6f 6e 20  teDoneException 
2840: 65 78 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ex) {.          
2850: 20 20 65 78 70 65 63 74 65 64 45 78 63 65 70 74    expectedExcept
2860: 69 6f 6e 20 3d 20 65 78 3b 0a 20 20 20 20 20 20  ion = ex;.      
2870: 20 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a 20 20    } finally {.  
2880: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 66 64            if (fd
2890: 20 21 3d 20 6e 75 6c 6c 29 20 7b 0a 20 20 20 20   != null) {.    
28a0: 20 20 20 20 20 20 20 20 20 20 20 20 66 64 2e 63              fd.c
28b0: 6c 6f 73 65 28 29 3b 0a 20 20 20 20 20 20 20 20  lose();.        
28c0: 20 20 20 20 20 20 20 20 66 64 20 3d 20 6e 75 6c          fd = nul
28d0: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  l;.            }
28e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28f0: 20 20 20 61 73 73 65 72 74 4e 6f 74 4e 75 6c 6c     assertNotNull
2900: 28 22 53 68 6f 75 6c 64 20 68 61 76 65 20 74 68  ("Should have th
2910: 72 6f 77 6e 20 53 51 4c 69 74 65 44 6f 6e 65 45  rown SQLiteDoneE
2920: 78 63 65 70 74 69 6f 6e 22 2c 20 65 78 70 65 63  xception", expec
2930: 74 65 64 45 78 63 65 70 74 69 6f 6e 29 3b 0a 20  tedException);. 
2940: 20 20 20 7d 0a 0a 20 20 20 20 70 75 62 6c 69 63     }..    public
2950: 20 76 6f 69 64 20 74 65 73 74 47 65 74 42 6c 6f   void testGetBlo
2960: 62 46 61 69 6c 75 72 65 50 61 72 61 6d 28 29 20  bFailureParam() 
2970: 74 68 72 6f 77 73 20 45 78 63 65 70 74 69 6f 6e  throws Exception
2980: 20 7b 0a 20 20 20 20 20 20 20 20 70 6f 70 75 6c   {.        popul
2990: 61 74 65 42 6c 6f 62 54 61 62 6c 65 28 29 3b 0a  ateBlobTable();.
29a0: 0a 20 20 20 20 20 20 20 20 53 74 72 69 6e 67 20  .        String 
29b0: 73 71 6c 20 3d 20 22 53 45 4c 45 43 54 20 64 61  sql = "SELECT da
29c0: 74 61 20 46 52 4f 4d 20 62 6c 6f 62 5f 74 65 73  ta FROM blob_tes
29d0: 74 20 57 48 45 52 45 20 5f 69 64 20 3d 20 3f 22  t WHERE _id = ?"
29e0: 3b 0a 20 20 20 20 20 20 20 20 53 51 4c 69 74 65  ;.        SQLite
29f0: 53 74 61 74 65 6d 65 6e 74 20 73 74 6d 20 3d 20  Statement stm = 
2a00: 6d 44 61 74 61 62 61 73 65 2e 63 6f 6d 70 69 6c  mDatabase.compil
2a10: 65 53 74 61 74 65 6d 65 6e 74 28 73 71 6c 29 3b  eStatement(sql);
2a20: 0a 20 20 20 20 20 20 20 20 73 74 6d 2e 62 69 6e  .        stm.bin
2a30: 64 4c 6f 6e 67 28 31 2c 20 31 30 30 29 3b 0a 20  dLong(1, 100);. 
2a40: 20 20 20 20 20 20 20 50 61 72 63 65 6c 46 69 6c         ParcelFil
2a50: 65 44 65 73 63 72 69 70 74 6f 72 20 66 64 20 3d  eDescriptor fd =
2a60: 20 6e 75 6c 6c 3b 0a 20 20 20 20 20 20 20 20 53   null;.        S
2a70: 51 4c 69 74 65 44 6f 6e 65 45 78 63 65 70 74 69  QLiteDoneExcepti
2a80: 6f 6e 20 65 78 70 65 63 74 65 64 45 78 63 65 70  on expectedExcep
2a90: 74 69 6f 6e 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20  tion = null;.   
2aa0: 20 20 20 20 20 74 72 79 20 7b 0a 20 20 20 20 20       try {.     
2ab0: 20 20 20 20 20 20 20 66 64 20 3d 20 73 74 6d 2e         fd = stm.
2ac0: 73 69 6d 70 6c 65 51 75 65 72 79 46 6f 72 42 6c  simpleQueryForBl
2ad0: 6f 62 46 69 6c 65 44 65 73 63 72 69 70 74 6f 72  obFileDescriptor
2ae0: 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 20 63 61  ();.        } ca
2af0: 74 63 68 20 28 53 51 4c 69 74 65 44 6f 6e 65 45  tch (SQLiteDoneE
2b00: 78 63 65 70 74 69 6f 6e 20 65 78 29 20 7b 0a 20  xception ex) {. 
2b10: 20 20 20 20 20 20 20 20 20 20 20 65 78 70 65 63             expec
2b20: 74 65 64 45 78 63 65 70 74 69 6f 6e 20 3d 20 65  tedException = e
2b30: 78 3b 0a 20 20 20 20 20 20 20 20 7d 20 66 69 6e  x;.        } fin
2b40: 61 6c 6c 79 20 7b 0a 20 20 20 20 20 20 20 20 20  ally {.         
2b50: 20 20 20 69 66 20 28 66 64 20 21 3d 20 6e 75 6c     if (fd != nul
2b60: 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  l) {.           
2b70: 20 20 20 20 20 66 64 2e 63 6c 6f 73 65 28 29 3b       fd.close();
2b80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b90: 20 66 64 20 3d 20 6e 75 6c 6c 3b 0a 20 20 20 20   fd = null;.    
2ba0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bb0: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 73 73 65    }.        asse
2bc0: 72 74 4e 6f 74 4e 75 6c 6c 28 22 53 68 6f 75 6c  rtNotNull("Shoul
2bd0: 64 20 68 61 76 65 20 74 68 72 6f 77 6e 20 53 51  d have thrown SQ
2be0: 4c 69 74 65 44 6f 6e 65 45 78 63 65 70 74 69 6f  LiteDoneExceptio
2bf0: 6e 22 2c 20 65 78 70 65 63 74 65 64 45 78 63 65  n", expectedExce
2c00: 70 74 69 6f 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20  ption);.    }.. 
2c10: 20 20 20 2f 2a 0a 20 20 20 20 20 2a 20 43 6f 6e     /*.     * Con
2c20: 76 65 72 74 20 73 74 72 69 6e 67 20 6f 66 20 68  vert string of h
2c30: 65 78 20 64 69 67 69 74 73 20 74 6f 20 62 79 74  ex digits to byt
2c40: 65 20 61 72 72 61 79 2e 0a 20 20 20 20 20 2a 20  e array..     * 
2c50: 52 65 73 75 6c 74 73 20 61 72 65 20 75 6e 64 65  Results are unde
2c60: 66 69 6e 65 64 20 66 6f 72 20 70 6f 6f 72 6c 79  fined for poorly
2c70: 20 66 6f 72 6d 65 64 20 73 74 72 69 6e 67 2e 0a   formed string..
2c80: 20 20 20 20 20 2a 0a 20 20 20 20 20 2a 20 40 70       *.     * @p
2c90: 61 72 61 6d 20 73 72 63 20 68 65 78 20 73 74 72  aram src hex str
2ca0: 69 6e 67 0a 20 20 20 20 20 2a 2f 0a 20 20 20 20  ing.     */.    
2cb0: 70 72 69 76 61 74 65 20 73 74 61 74 69 63 20 62  private static b
2cc0: 79 74 65 5b 5d 20 70 61 72 73 65 42 6c 6f 62 28  yte[] parseBlob(
2cd0: 53 74 72 69 6e 67 20 73 72 63 29 20 7b 0a 20 20  String src) {.  
2ce0: 20 20 20 20 20 20 69 6e 74 20 6c 65 6e 20 3d 20        int len = 
2cf0: 73 72 63 2e 6c 65 6e 67 74 68 28 29 3b 0a 20 20  src.length();.  
2d00: 20 20 20 20 20 20 62 79 74 65 5b 5d 20 72 65 73        byte[] res
2d10: 75 6c 74 20 3d 20 6e 65 77 20 62 79 74 65 5b 6c  ult = new byte[l
2d20: 65 6e 20 2f 20 32 5d 3b 0a 0a 20 20 20 20 20 20  en / 2];..      
2d30: 20 20 66 6f 72 20 28 69 6e 74 20 69 20 3d 20 30    for (int i = 0
2d40: 3b 20 69 20 3c 20 6c 65 6e 2f 32 3b 20 69 2b 2b  ; i < len/2; i++
2d50: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
2d60: 69 6e 74 20 76 61 6c 3b 0a 20 20 20 20 20 20 20  int val;.       
2d70: 20 20 20 20 20 63 68 61 72 20 63 31 20 3d 20 73       char c1 = s
2d80: 72 63 2e 63 68 61 72 41 74 28 69 2a 32 29 3b 0a  rc.charAt(i*2);.
2d90: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
2da0: 20 63 32 20 3d 20 73 72 63 2e 63 68 61 72 41 74   c2 = src.charAt
2db0: 28 69 2a 32 2b 31 29 3b 0a 20 20 20 20 20 20 20  (i*2+1);.       
2dc0: 20 20 20 20 20 69 6e 74 20 76 61 6c 31 20 3d 20       int val1 = 
2dd0: 43 68 61 72 61 63 74 65 72 2e 64 69 67 69 74 28  Character.digit(
2de0: 63 31 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20  c1, 16);.       
2df0: 20 20 20 20 20 69 6e 74 20 76 61 6c 32 20 3d 20       int val2 = 
2e00: 43 68 61 72 61 63 74 65 72 2e 64 69 67 69 74 28  Character.digit(
2e10: 63 32 2c 20 31 36 29 3b 0a 20 20 20 20 20 20 20  c2, 16);.       
2e20: 20 20 20 20 20 76 61 6c 20 3d 20 28 76 61 6c 31       val = (val1
2e30: 20 3c 3c 20 34 29 20 7c 20 76 61 6c 32 3b 0a 20   << 4) | val2;. 
2e40: 20 20 20 20 20 20 20 20 20 20 20 72 65 73 75 6c             resul
2e50: 74 5b 69 5d 20 3d 20 28 62 79 74 65 29 76 61 6c  t[i] = (byte)val
2e60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
2e70: 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 75 6c      return resul
2e80: 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72  t;.    }..    pr
2e90: 69 76 61 74 65 20 73 74 61 74 69 63 20 76 6f 69  ivate static voi
2ea0: 64 20 61 73 73 65 72 74 46 69 6c 65 44 65 73 63  d assertFileDesc
2eb0: 72 69 70 74 6f 72 43 6f 6e 74 65 6e 74 28 62 79  riptorContent(by
2ec0: 74 65 5b 5d 20 65 78 70 65 63 74 65 64 2c 20 50  te[] expected, P
2ed0: 61 72 63 65 6c 46 69 6c 65 44 65 73 63 72 69 70  arcelFileDescrip
2ee0: 74 6f 72 20 66 64 29 0a 20 20 20 20 20 20 20 20  tor fd).        
2ef0: 20 20 20 20 74 68 72 6f 77 73 20 49 4f 45 78 63      throws IOExc
2f00: 65 70 74 69 6f 6e 20 7b 0a 20 20 20 20 20 20 20  eption {.       
2f10: 20 61 73 73 65 72 74 49 6e 70 75 74 53 74 72 65   assertInputStre
2f20: 61 6d 43 6f 6e 74 65 6e 74 28 65 78 70 65 63 74  amContent(expect
2f30: 65 64 2c 20 6e 65 77 20 50 61 72 63 65 6c 46 69  ed, new ParcelFi
2f40: 6c 65 44 65 73 63 72 69 70 74 6f 72 2e 41 75 74  leDescriptor.Aut
2f50: 6f 43 6c 6f 73 65 49 6e 70 75 74 53 74 72 65 61  oCloseInputStrea
2f60: 6d 28 66 64 29 29 3b 0a 20 20 20 20 7d 0a 0a 20  m(fd));.    }.. 
2f70: 20 20 20 70 72 69 76 61 74 65 20 73 74 61 74 69     private stati
2f80: 63 20 76 6f 69 64 20 61 73 73 65 72 74 49 6e 70  c void assertInp
2f90: 75 74 53 74 72 65 61 6d 43 6f 6e 74 65 6e 74 28  utStreamContent(
2fa0: 62 79 74 65 5b 5d 20 65 78 70 65 63 74 65 64 2c  byte[] expected,
2fb0: 20 49 6e 70 75 74 53 74 72 65 61 6d 20 69 73 29   InputStream is)
2fc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68 72  .            thr
2fd0: 6f 77 73 20 49 4f 45 78 63 65 70 74 69 6f 6e 20  ows IOException 
2fe0: 7b 0a 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a  {.        try {.
2ff0: 20 20 20 20 20 20 20 20 20 20 20 20 62 79 74 65              byte
3000: 5b 5d 20 6f 62 73 65 72 76 65 64 20 3d 20 6e 65  [] observed = ne
3010: 77 20 62 79 74 65 5b 65 78 70 65 63 74 65 64 2e  w byte[expected.
3020: 6c 65 6e 67 74 68 5d 3b 0a 20 20 20 20 20 20 20  length];.       
3030: 20 20 20 20 20 69 6e 74 20 63 6f 75 6e 74 20 3d       int count =
3040: 20 69 73 2e 72 65 61 64 28 6f 62 73 65 72 76 65   is.read(observe
3050: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  d);.            
3060: 61 73 73 65 72 74 45 71 75 61 6c 73 28 65 78 70  assertEquals(exp
3070: 65 63 74 65 64 2e 6c 65 6e 67 74 68 2c 20 63 6f  ected.length, co
3080: 75 6e 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  unt);.          
3090: 20 20 61 73 73 65 72 74 45 71 75 61 6c 73 28 2d    assertEquals(-
30a0: 31 2c 20 69 73 2e 72 65 61 64 28 29 29 3b 0a 20  1, is.read());. 
30b0: 20 20 20 20 20 20 20 20 20 20 20 4d 6f 72 65 41             MoreA
30c0: 73 73 65 72 74 73 2e 61 73 73 65 72 74 45 71 75  sserts.assertEqu
30d0: 61 6c 73 28 65 78 70 65 63 74 65 64 2c 20 6f 62  als(expected, ob
30e0: 73 65 72 76 65 64 29 3b 0a 20 20 20 20 20 20 20  served);.       
30f0: 20 7d 20 66 69 6e 61 6c 6c 79 20 7b 0a 20 20 20   } finally {.   
3100: 20 20 20 20 20 20 20 20 20 69 73 2e 63 6c 6f 73           is.clos
3110: 65 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  e();.        }. 
3120: 20 20 20 7d 0a 7d 0a                                }.}.