SQLite Android Bindings
Hex Artifact Content
Not logged in

Artifact 11540d59e21d43bb4c8c6db2e9a073d1761937da:


0000: 70 61 63 6b 61 67 65 20 6f 72 67 2e 73 71 6c 69  package org.sqli
0010: 74 65 2e 64 61 74 61 62 61 73 65 3b 0a 0a 69 6d  te.database;..im
0020: 70 6f 72 74 20 61 6e 64 72 6f 69 64 2e 63 6f 6e  port android.con
0030: 74 65 6e 74 2e 43 6f 6e 74 65 78 74 3b 0a 69 6d  tent.Context;.im
0040: 70 6f 72 74 20 61 6e 64 72 6f 69 64 2e 64 61 74  port android.dat
0050: 61 62 61 73 65 2e 43 75 72 73 6f 72 3b 0a 69 6d  abase.Cursor;.im
0060: 70 6f 72 74 20 61 6e 64 72 6f 69 64 2e 6f 73 2e  port android.os.
0070: 41 73 79 6e 63 54 61 73 6b 3b 0a 69 6d 70 6f 72  AsyncTask;.impor
0080: 74 20 61 6e 64 72 6f 69 64 2e 73 75 70 70 6f 72  t android.suppor
0090: 74 2e 74 65 73 74 2e 49 6e 73 74 72 75 6d 65 6e  t.test.Instrumen
00a0: 74 61 74 69 6f 6e 52 65 67 69 73 74 72 79 3b 0a  tationRegistry;.
00b0: 69 6d 70 6f 72 74 20 61 6e 64 72 6f 69 64 2e 73  import android.s
00c0: 75 70 70 6f 72 74 2e 74 65 73 74 2e 72 75 6e 6e  upport.test.runn
00d0: 65 72 2e 41 6e 64 72 6f 69 64 4a 55 6e 69 74 34  er.AndroidJUnit4
00e0: 3b 0a 69 6d 70 6f 72 74 20 61 6e 64 72 6f 69 64  ;.import android
00f0: 2e 75 74 69 6c 2e 4c 6f 67 3b 0a 0a 69 6d 70 6f  .util.Log;..impo
0100: 72 74 20 6a 75 6e 69 74 2e 66 72 61 6d 65 77 6f  rt junit.framewo
0110: 72 6b 2e 41 73 73 65 72 74 3b 0a 0a 69 6d 70 6f  rk.Assert;..impo
0120: 72 74 20 6f 72 67 2e 6a 75 6e 69 74 2e 42 65 66  rt org.junit.Bef
0130: 6f 72 65 3b 0a 69 6d 70 6f 72 74 20 6f 72 67 2e  ore;.import org.
0140: 6a 75 6e 69 74 2e 54 65 73 74 3b 0a 69 6d 70 6f  junit.Test;.impo
0150: 72 74 20 6f 72 67 2e 6a 75 6e 69 74 2e 72 75 6e  rt org.junit.run
0160: 6e 65 72 2e 52 75 6e 57 69 74 68 3b 0a 0a 69 6d  ner.RunWith;..im
0170: 70 6f 72 74 20 6f 72 67 2e 73 71 6c 69 74 65 2e  port org.sqlite.
0180: 64 61 74 61 62 61 73 65 2e 73 71 6c 69 74 65 2e  database.sqlite.
0190: 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69 6f 6e  SQLiteConnection
01a0: 3b 0a 69 6d 70 6f 72 74 20 6f 72 67 2e 73 71 6c  ;.import org.sql
01b0: 69 74 65 2e 64 61 74 61 62 61 73 65 2e 73 71 6c  ite.database.sql
01c0: 69 74 65 2e 53 51 4c 69 74 65 44 61 74 61 62 61  ite.SQLiteDataba
01d0: 73 65 3b 0a 69 6d 70 6f 72 74 20 6f 72 67 2e 73  se;.import org.s
01e0: 71 6c 69 74 65 2e 64 61 74 61 62 61 73 65 2e 73  qlite.database.s
01f0: 71 6c 69 74 65 2e 53 51 4c 69 74 65 4f 70 65 6e  qlite.SQLiteOpen
0200: 48 65 6c 70 65 72 3b 0a 0a 69 6d 70 6f 72 74 20  Helper;..import 
0210: 6a 61 76 61 2e 69 6f 2e 46 69 6c 65 3b 0a 69 6d  java.io.File;.im
0220: 70 6f 72 74 20 6a 61 76 61 2e 69 6f 2e 46 69 6c  port java.io.Fil
0230: 65 49 6e 70 75 74 53 74 72 65 61 6d 3b 0a 69 6d  eInputStream;.im
0240: 70 6f 72 74 20 6a 61 76 61 2e 75 74 69 6c 2e 41  port java.util.A
0250: 72 72 61 79 73 3b 0a 0a 69 6d 70 6f 72 74 20 73  rrays;..import s
0260: 74 61 74 69 63 20 6f 72 67 2e 6a 75 6e 69 74 2e  tatic org.junit.
0270: 41 73 73 65 72 74 2e 2a 3b 0a 0a 0a 63 6c 61 73  Assert.*;...clas
0280: 73 20 4d 79 48 65 6c 70 65 72 20 65 78 74 65 6e  s MyHelper exten
0290: 64 73 20 53 51 4c 69 74 65 4f 70 65 6e 48 65 6c  ds SQLiteOpenHel
02a0: 70 65 72 20 7b 0a 0a 20 20 20 20 70 75 62 6c 69  per {..    publi
02b0: 63 20 73 74 61 74 69 63 20 66 69 6e 61 6c 20 53  c static final S
02c0: 74 72 69 6e 67 20 44 41 54 41 42 41 53 45 5f 4e  tring DATABASE_N
02d0: 41 4d 45 20 3d 20 22 6d 79 64 62 2e 64 62 22 3b  AME = "mydb.db";
02e0: 0a 0a 20 20 20 20 70 75 62 6c 69 63 20 4d 79 48  ..    public MyH
02f0: 65 6c 70 65 72 28 43 6f 6e 74 65 78 74 20 63 74  elper(Context ct
0300: 78 29 7b 0a 20 20 20 20 20 20 20 20 73 75 70 65  x){.        supe
0310: 72 28 63 74 78 2c 20 22 66 69 6c 65 3a 22 20 2b  r(ctx, "file:" +
0320: 20 63 74 78 2e 67 65 74 44 61 74 61 62 61 73 65   ctx.getDatabase
0330: 50 61 74 68 28 44 41 54 41 42 41 53 45 5f 4e 41  Path(DATABASE_NA
0340: 4d 45 29 2e 67 65 74 41 62 73 6f 6c 75 74 65 50  ME).getAbsoluteP
0350: 61 74 68 28 29 20 2b 20 22 3f 6b 65 79 3d 73 65  ath() + "?key=se
0360: 63 72 65 74 22 2c 20 6e 75 6c 6c 2c 20 31 29 3b  cret", null, 1);
0370: 0a 20 20 20 20 7d 0a 20 20 20 20 70 75 62 6c 69  .    }.    publi
0380: 63 20 76 6f 69 64 20 6f 6e 43 6f 6e 66 69 67 75  c void onConfigu
0390: 72 65 28 53 51 4c 69 74 65 44 61 74 61 62 61 73  re(SQLiteDatabas
03a0: 65 20 64 62 29 7b 0a 20 20 20 20 20 20 20 20 64  e db){.        d
03b0: 62 2e 65 6e 61 62 6c 65 57 72 69 74 65 41 68 65  b.enableWriteAhe
03c0: 61 64 4c 6f 67 67 69 6e 67 28 29 3b 0a 20 20 20  adLogging();.   
03d0: 20 7d 0a 20 20 20 20 70 75 62 6c 69 63 20 76 6f   }.    public vo
03e0: 69 64 20 6f 6e 43 72 65 61 74 65 28 53 51 4c 69  id onCreate(SQLi
03f0: 74 65 44 61 74 61 62 61 73 65 20 64 62 29 7b 0a  teDatabase db){.
0400: 20 20 20 20 20 20 20 20 64 62 2e 65 78 65 63 53          db.execS
0410: 51 4c 28 22 43 52 45 41 54 45 20 54 41 42 4c 45  QL("CREATE TABLE
0420: 20 74 31 28 78 29 22 29 3b 0a 20 20 20 20 7d 0a   t1(x)");.    }.
0430: 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20      public void 
0440: 6f 6e 55 70 67 72 61 64 65 28 53 51 4c 69 74 65  onUpgrade(SQLite
0450: 44 61 74 61 62 61 73 65 20 64 62 2c 20 69 6e 74  Database db, int
0460: 20 69 4f 6c 64 2c 20 69 6e 74 20 69 4e 65 77 29   iOld, int iNew)
0470: 7b 0a 20 20 20 20 7d 0a 7d 0a 0a 0a 2f 2a 2a 0a  {.    }.}.../**.
0480: 20 2a 20 43 72 65 61 74 65 64 20 62 79 20 64 61   * Created by da
0490: 6e 20 6f 6e 20 35 2f 33 2f 31 37 2e 0a 20 2a 2f  n on 5/3/17.. */
04a0: 0a 40 52 75 6e 57 69 74 68 28 41 6e 64 72 6f 69  .@RunWith(Androi
04b0: 64 4a 55 6e 69 74 34 2e 63 6c 61 73 73 29 0a 70  dJUnit4.class).p
04c0: 75 62 6c 69 63 20 63 6c 61 73 73 20 53 65 65 54  ublic class SeeT
04d0: 65 73 74 31 20 7b 0a 20 20 20 20 70 72 69 76 61  est1 {.    priva
04e0: 74 65 20 43 6f 6e 74 65 78 74 20 6d 43 6f 6e 74  te Context mCont
04f0: 65 78 74 3b 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  ext;..    /*.   
0500: 20 2a 2a 20 54 65 73 74 20 69 66 20 74 68 65 20   ** Test if the 
0510: 64 61 74 61 62 61 73 65 20 61 74 20 70 61 74 68  database at path
0520: 20 69 73 20 65 6e 63 72 79 70 74 65 64 20 6f 72   is encrypted or
0530: 20 6e 6f 74 2e 20 54 68 65 20 64 62 0a 20 20 20   not. The db.   
0540: 20 2a 2a 20 69 73 20 61 73 73 75 6d 65 64 20 74   ** is assumed t
0550: 6f 20 62 65 20 65 6e 63 72 79 70 74 65 64 20 69  o be encrypted i
0560: 66 20 74 68 65 20 66 69 72 73 74 20 36 20 62 79  f the first 6 by
0570: 74 65 73 20 61 72 65 20 61 6e 79 74 68 69 6e 67  tes are anything
0580: 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72 20 74 68  .    ** other th
0590: 61 6e 20 22 53 51 4c 69 74 65 22 2e 0a 20 20 20  an "SQLite"..   
05a0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68   **.    ** If th
05b0: 65 20 74 65 73 74 20 72 65 76 65 61 6c 73 20 74  e test reveals t
05c0: 68 61 74 20 74 68 65 20 64 62 20 69 73 20 65 6e  hat the db is en
05d0: 63 72 79 70 74 65 64 2c 20 72 65 74 75 72 6e 20  crypted, return 
05e0: 74 68 65 20 73 74 72 69 6e 67 0a 20 20 20 20 2a  the string.    *
05f0: 2a 20 22 65 6e 63 72 79 70 74 65 64 22 2e 20 4f  * "encrypted". O
0600: 74 68 65 72 77 69 73 65 2c 20 22 75 6e 65 6e 63  therwise, "unenc
0610: 72 79 70 74 65 64 22 2e 0a 20 20 20 20 2a 2f 0a  rypted"..    */.
0620: 20 20 20 20 70 75 62 6c 69 63 20 53 74 72 69 6e      public Strin
0630: 67 20 64 62 5f 69 73 5f 65 6e 63 72 79 70 74 65  g db_is_encrypte
0640: 64 28 53 74 72 69 6e 67 20 70 61 74 68 29 20 74  d(String path) t
0650: 68 72 6f 77 73 20 45 78 63 65 70 74 69 6f 6e 20  hrows Exception 
0660: 7b 0a 20 20 20 20 20 20 46 69 6c 65 49 6e 70 75  {.      FileInpu
0670: 74 53 74 72 65 61 6d 20 69 6e 20 3d 20 6e 65 77  tStream in = new
0680: 20 46 69 6c 65 49 6e 70 75 74 53 74 72 65 61 6d   FileInputStream
0690: 28 6d 43 6f 6e 74 65 78 74 2e 67 65 74 44 61 74  (mContext.getDat
06a0: 61 62 61 73 65 50 61 74 68 28 70 61 74 68 29 29  abasePath(path))
06b0: 3b 0a 0a 20 20 20 20 20 20 62 79 74 65 5b 5d 20  ;..      byte[] 
06c0: 62 75 66 66 65 72 20 3d 20 6e 65 77 20 62 79 74  buffer = new byt
06d0: 65 5b 36 5d 3b 0a 20 20 20 20 20 20 69 6e 2e 72  e[6];.      in.r
06e0: 65 61 64 28 62 75 66 66 65 72 2c 20 30 2c 20 36  ead(buffer, 0, 6
06f0: 29 3b 0a 0a 20 20 20 20 20 20 53 74 72 69 6e 67  );..      String
0700: 20 72 65 73 20 3d 20 22 65 6e 63 72 79 70 74 65   res = "encrypte
0710: 64 22 3b 0a 20 20 20 20 20 20 69 66 28 20 41 72  d";.      if( Ar
0720: 72 61 79 73 2e 65 71 75 61 6c 73 28 62 75 66 66  rays.equals(buff
0730: 65 72 2c 20 28 6e 65 77 20 53 74 72 69 6e 67 28  er, (new String(
0740: 22 53 51 4c 69 74 65 22 29 29 2e 67 65 74 42 79  "SQLite")).getBy
0750: 74 65 73 28 29 29 20 29 7b 0a 20 20 20 20 20 20  tes()) ){.      
0760: 20 20 72 65 73 20 3d 20 22 75 6e 65 6e 63 72 79    res = "unencry
0770: 70 74 65 64 22 3b 0a 20 20 20 20 20 20 7d 0a 20  pted";.      }. 
0780: 20 20 20 20 20 72 65 74 75 72 6e 20 72 65 73 3b       return res;
0790: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 40 42 65 66  .    }..    @Bef
07a0: 6f 72 65 0a 20 20 20 20 70 75 62 6c 69 63 20 76  ore.    public v
07b0: 6f 69 64 20 73 65 74 75 70 28 29 20 74 68 72 6f  oid setup() thro
07c0: 77 73 20 45 78 63 65 70 74 69 6f 6e 20 7b 0a 0a  ws Exception {..
07d0: 20 20 20 20 20 20 20 20 53 79 73 74 65 6d 2e 6c          System.l
07e0: 6f 61 64 4c 69 62 72 61 72 79 28 22 73 71 6c 69  oadLibrary("sqli
07f0: 74 65 58 22 29 3b 0a 0a 20 20 20 20 20 20 20 20  teX");..        
0800: 6d 43 6f 6e 74 65 78 74 20 3d 20 49 6e 73 74 72  mContext = Instr
0810: 75 6d 65 6e 74 61 74 69 6f 6e 52 65 67 69 73 74  umentationRegist
0820: 72 79 2e 67 65 74 54 61 72 67 65 74 43 6f 6e 74  ry.getTargetCont
0830: 65 78 74 28 29 3b 0a 0a 20 20 20 20 20 20 20 20  ext();..        
0840: 2f 2f 20 64 65 6c 65 74 65 20 61 6e 79 20 65 78  // delete any ex
0850: 69 73 74 69 6e 67 20 64 61 74 61 62 61 73 65 0a  isting database.
0860: 20 20 20 20 20 20 20 20 46 69 6c 65 20 64 61 74          File dat
0870: 61 62 61 73 65 46 69 6c 65 20 3d 20 6d 43 6f 6e  abaseFile = mCon
0880: 74 65 78 74 2e 67 65 74 44 61 74 61 62 61 73 65  text.getDatabase
0890: 50 61 74 68 28 4d 79 48 65 6c 70 65 72 2e 44 41  Path(MyHelper.DA
08a0: 54 41 42 41 53 45 5f 4e 41 4d 45 29 3b 0a 20 20  TABASE_NAME);.  
08b0: 20 20 20 20 20 20 64 61 74 61 62 61 73 65 46 69        databaseFi
08c0: 6c 65 2e 6d 6b 64 69 72 73 28 29 3b 0a 20 20 20  le.mkdirs();.   
08d0: 20 20 20 20 20 69 66 20 28 64 61 74 61 62 61 73       if (databas
08e0: 65 46 69 6c 65 2e 65 78 69 73 74 73 28 29 29 20  eFile.exists()) 
08f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 61  {.            da
0900: 74 61 62 61 73 65 46 69 6c 65 2e 64 65 6c 65 74  tabaseFile.delet
0910: 65 28 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  e();.        }. 
0920: 20 20 20 7d 0a 0a 20 20 20 20 40 54 65 73 74 0a     }..    @Test.
0930: 20 20 20 20 70 75 62 6c 69 63 20 76 6f 69 64 20      public void 
0940: 74 65 73 74 45 6e 63 72 79 70 74 65 64 57 61 6c  testEncryptedWal
0950: 4d 6f 64 65 28 29 20 74 68 72 6f 77 73 20 45 78  Mode() throws Ex
0960: 63 65 70 74 69 6f 6e 20 7b 0a 20 20 20 20 20 20  ception {.      
0970: 20 20 2f 2f 20 63 72 65 61 74 65 20 64 61 74 61    // create data
0980: 62 61 73 65 0a 20 20 20 20 20 20 20 20 66 69 6e  base.        fin
0990: 61 6c 20 4d 79 48 65 6c 70 65 72 20 68 65 6c 70  al MyHelper help
09a0: 65 72 20 3d 20 6e 65 77 20 4d 79 48 65 6c 70 65  er = new MyHelpe
09b0: 72 28 6d 43 6f 6e 74 65 78 74 29 3b 0a 20 20 20  r(mContext);.   
09c0: 20 20 20 20 20 68 65 6c 70 65 72 2e 67 65 74 57       helper.getW
09d0: 72 69 74 61 62 6c 65 44 61 74 61 62 61 73 65 28  ritableDatabase(
09e0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 20 76  );..        // v
09f0: 65 72 69 66 79 20 74 68 61 74 20 57 41 4c 20 6a  erify that WAL j
0a00: 6f 75 72 6e 61 6c 20 6d 6f 64 65 20 69 73 20 73  ournal mode is s
0a10: 65 74 0a 20 20 20 20 20 20 20 20 66 69 6e 61 6c  et.        final
0a20: 20 43 75 72 73 6f 72 20 70 72 61 67 6d 61 43 75   Cursor pragmaCu
0a30: 72 73 6f 72 20 3d 20 68 65 6c 70 65 72 2e 67 65  rsor = helper.ge
0a40: 74 57 72 69 74 61 62 6c 65 44 61 74 61 62 61 73  tWritableDatabas
0a50: 65 28 29 2e 72 61 77 51 75 65 72 79 28 22 50 52  e().rawQuery("PR
0a60: 41 47 4d 41 20 6a 6f 75 72 6e 61 6c 5f 6d 6f 64  AGMA journal_mod
0a70: 65 22 2c 20 6e 75 6c 6c 29 3b 0a 20 20 20 20 20  e", null);.     
0a80: 20 20 20 70 72 61 67 6d 61 43 75 72 73 6f 72 2e     pragmaCursor.
0a90: 6d 6f 76 65 54 6f 46 69 72 73 74 28 29 3b 0a 20  moveToFirst();. 
0aa0: 20 20 20 20 20 20 20 41 73 73 65 72 74 2e 61 73         Assert.as
0ab0: 73 65 72 74 45 71 75 61 6c 73 28 22 77 61 6c 22  sertEquals("wal"
0ac0: 2c 20 70 72 61 67 6d 61 43 75 72 73 6f 72 2e 67  , pragmaCursor.g
0ad0: 65 74 53 74 72 69 6e 67 28 70 72 61 67 6d 61 43  etString(pragmaC
0ae0: 75 72 73 6f 72 2e 67 65 74 43 6f 6c 75 6d 6e 49  ursor.getColumnI
0af0: 6e 64 65 78 28 22 6a 6f 75 72 6e 61 6c 5f 6d 6f  ndex("journal_mo
0b00: 64 65 22 29 29 29 3b 0a 20 20 20 20 20 20 20 20  de")));.        
0b10: 70 72 61 67 6d 61 43 75 72 73 6f 72 2e 63 6c 6f  pragmaCursor.clo
0b20: 73 65 28 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f  se();..        /
0b30: 2f 20 73 74 61 72 74 20 6c 6f 6e 67 20 72 75 6e  / start long run
0b40: 6e 69 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e  ning transaction
0b50: 0a 20 20 20 20 20 20 20 20 41 73 79 6e 63 54 61  .        AsyncTa
0b60: 73 6b 2e 65 78 65 63 75 74 65 28 6e 65 77 20 52  sk.execute(new R
0b70: 75 6e 6e 61 62 6c 65 28 29 20 7b 0a 20 20 20 20  unnable() {.    
0b80: 20 20 20 20 20 20 20 20 40 4f 76 65 72 72 69 64          @Overrid
0b90: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 75  e.            pu
0ba0: 62 6c 69 63 20 76 6f 69 64 20 72 75 6e 28 29 20  blic void run() 
0bb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
0bc0: 20 20 68 65 6c 70 65 72 2e 67 65 74 57 72 69 74    helper.getWrit
0bd0: 61 62 6c 65 44 61 74 61 62 61 73 65 28 29 2e 62  ableDatabase().b
0be0: 65 67 69 6e 54 72 61 6e 73 61 63 74 69 6f 6e 4e  eginTransactionN
0bf0: 6f 6e 45 78 63 6c 75 73 69 76 65 28 29 3b 0a 0a  onExclusive();..
0c00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c10: 2f 2f 20 73 69 6d 75 6c 61 74 65 20 6c 6f 6e 67  // simulate long
0c20: 20 69 6e 73 65 72 74 0a 20 20 20 20 20 20 20 20   insert.        
0c30: 20 20 20 20 20 20 20 20 74 72 79 20 7b 0a 20 20          try {.  
0c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0c50: 20 20 54 68 72 65 61 64 2e 73 6c 65 65 70 28 35    Thread.sleep(5
0c60: 30 30 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  000);.          
0c70: 20 20 20 20 20 20 7d 20 63 61 74 63 68 20 28 49        } catch (I
0c80: 6e 74 65 72 72 75 70 74 65 64 45 78 63 65 70 74  nterruptedExcept
0c90: 69 6f 6e 20 65 29 20 7b 0a 20 20 20 20 20 20 20  ion e) {.       
0ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 2e 70               e.p
0cb0: 72 69 6e 74 53 74 61 63 6b 54 72 61 63 65 28 29  rintStackTrace()
0cc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
0cd0: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 20    }..           
0ce0: 20 20 20 20 20 68 65 6c 70 65 72 2e 67 65 74 57       helper.getW
0cf0: 72 69 74 61 62 6c 65 44 61 74 61 62 61 73 65 28  ritableDatabase(
0d00: 29 2e 73 65 74 54 72 61 6e 73 61 63 74 69 6f 6e  ).setTransaction
0d10: 53 75 63 63 65 73 73 66 75 6c 28 29 3b 0a 20 20  Successful();.  
0d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 68 65                he
0d30: 6c 70 65 72 2e 67 65 74 57 72 69 74 61 62 6c 65  lper.getWritable
0d40: 44 61 74 61 62 61 73 65 28 29 2e 65 6e 64 54 72  Database().endTr
0d50: 61 6e 73 61 63 74 69 6f 6e 28 29 3b 0a 20 20 20  ansaction();.   
0d60: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
0d70: 20 20 20 7d 29 3b 0a 0a 20 20 20 20 20 20 20 20     });..        
0d80: 2f 2f 20 77 61 69 74 20 61 20 73 68 6f 72 74 20  // wait a short 
0d90: 74 69 6d 65 20 75 6e 74 69 6c 20 74 68 65 20 6c  time until the l
0da0: 6f 6e 67 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ong transaction 
0db0: 73 74 61 72 74 73 0a 20 20 20 20 20 20 20 20 54  starts.        T
0dc0: 68 72 65 61 64 2e 73 6c 65 65 70 28 33 30 30 29  hread.sleep(300)
0dd0: 3b 0a 0a 20 20 20 20 20 20 20 20 6c 6f 6e 67 20  ;..        long 
0de0: 73 74 61 72 74 54 69 6d 65 20 3d 20 53 79 73 74  startTime = Syst
0df0: 65 6d 2e 63 75 72 72 65 6e 74 54 69 6d 65 4d 69  em.currentTimeMi
0e00: 6c 6c 69 73 28 29 3b 0a 0a 20 20 20 20 20 20 20  llis();..       
0e10: 20 2f 2f 74 72 79 20 74 6f 20 72 65 61 64 20 73   //try to read s
0e20: 6f 6d 65 74 68 69 6e 67 20 66 72 6f 6d 20 74 68  omething from th
0e30: 65 20 64 61 74 61 62 61 73 65 20 77 68 69 6c 65  e database while
0e40: 20 74 68 65 20 73 6c 6f 77 20 74 72 61 6e 73 61   the slow transa
0e50: 63 74 69 6f 6e 20 69 73 20 72 75 6e 6e 69 6e 67  ction is running
0e60: 0a 20 20 20 20 20 20 20 20 68 65 6c 70 65 72 2e  .        helper.
0e70: 67 65 74 57 72 69 74 61 62 6c 65 44 61 74 61 62  getWritableDatab
0e80: 61 73 65 28 29 2e 65 78 65 63 53 51 4c 28 22 53  ase().execSQL("S
0e90: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 22  ELECT * FROM t1"
0ea0: 29 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2f 76 65  );..        //ve
0eb0: 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6f 70  rify that the op
0ec0: 65 72 61 74 69 6f 6e 20 64 69 64 6e 27 74 20 77  eration didn't w
0ed0: 61 69 74 20 75 6e 74 69 6c 20 74 68 65 20 33 30  ait until the 30
0ee0: 30 30 6d 73 20 6c 6f 6e 67 20 6f 70 65 72 61 74  00ms long operat
0ef0: 69 6f 6e 20 66 69 6e 69 73 68 65 64 0a 20 20 20  ion finished.   
0f00: 20 20 20 20 20 69 66 20 28 53 79 73 74 65 6d 2e       if (System.
0f10: 63 75 72 72 65 6e 74 54 69 6d 65 4d 69 6c 6c 69  currentTimeMilli
0f20: 73 28 29 20 2d 20 73 74 61 72 74 54 69 6d 65 20  s() - startTime 
0f30: 3e 20 33 30 30 30 29 20 7b 0a 20 20 20 20 20 20  > 3000) {.      
0f40: 20 20 20 20 20 20 74 68 72 6f 77 20 6e 65 77 20        throw new 
0f50: 45 78 63 65 70 74 69 6f 6e 28 22 57 41 4c 20 6d  Exception("WAL m
0f60: 6f 64 65 20 69 73 6e 27 74 20 77 6f 72 6b 69 6e  ode isn't workin
0f70: 67 20 63 6f 72 65 63 74 6c 79 20 2d 20 72 65 61  g corectly - rea
0f80: 64 20 6f 70 65 72 61 74 69 6f 6e 20 77 61 73 20  d operation was 
0f90: 62 6c 6f 63 6b 65 64 22 29 3b 0a 20 20 20 20 20  blocked");.     
0fa0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 69 66     }..        if
0fb0: 28 20 53 51 4c 69 74 65 43 6f 6e 6e 65 63 74 69  ( SQLiteConnecti
0fc0: 6f 6e 2e 68 61 73 43 6f 64 65 63 28 29 20 29 7b  on.hasCodec() ){
0fd0: 0a 20 20 20 20 20 20 20 20 20 20 41 73 73 65 72  .          Asser
0fe0: 74 2e 61 73 73 65 72 74 45 71 75 61 6c 73 28 22  t.assertEquals("
0ff0: 65 6e 63 72 79 70 74 65 64 22 2c 20 64 62 5f 69  encrypted", db_i
1000: 73 5f 65 6e 63 72 79 70 74 65 64 28 4d 79 48 65  s_encrypted(MyHe
1010: 6c 70 65 72 2e 44 41 54 41 42 41 53 45 5f 4e 41  lper.DATABASE_NA
1020: 4d 45 29 29 3b 0a 20 20 20 20 20 20 20 20 7d 20  ME));.        } 
1030: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
1040: 20 41 73 73 65 72 74 2e 61 73 73 65 72 74 45 71   Assert.assertEq
1050: 75 61 6c 73 28 22 75 6e 65 6e 63 72 79 70 74 65  uals("unencrypte
1060: 64 22 2c 20 64 62 5f 69 73 5f 65 6e 63 72 79 70  d", db_is_encryp
1070: 74 65 64 28 4d 79 48 65 6c 70 65 72 2e 44 41 54  ted(MyHelper.DAT
1080: 41 42 41 53 45 5f 4e 41 4d 45 29 29 3b 0a 20 20  ABASE_NAME));.  
1090: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 7d 0a        }.    }.}.