16
16
两个方法:getReadableDatabase()、getWritableDatabase()。需要注意的一点是这两个方法都加锁,是线程安全的。这两个方法最终调用getDatabaseLocked(boolean writable):
17
17
18
18
19
- ```
19
+ ``` java
20
20
private SQLiteDatabase getDatabaseLocked(boolean writable) {
21
21
if (mDatabase != null ) {
22
22
@@ -147,7 +147,7 @@ WAL支持读写并发,是通过将修改的数据单独写到一个wal文件
147
147
148
148
获取SQLiteDatabase对象,从上面可以看到getReadableDatabase()、getWritableDatabase()是通过SQLiteDatabase.openDatabase(..)创建数据库,那么其中包含那些细节呢?
149
149
150
- ```
150
+ ``` java
151
151
public static SQLiteDatabase openDatabase(String path, CursorFactory factory, int flags,
152
152
DatabaseErrorHandler errorHandler) {
153
153
SQLiteDatabase db = new SQLiteDatabase (path, flags, factory, errorHandler);
@@ -160,7 +160,7 @@ public static SQLiteDatabase openDatabase(String path, CursorFactory factory, in
160
160
161
161
open():
162
162
163
- ```
163
+ ``` java
164
164
165
165
open():
166
166
private void open() {
@@ -277,7 +277,7 @@ private void open() {
277
277
278
278
先分析一下insert()和insertOrThrow()插入函数:
279
279
280
- ```
280
+ ``` java
281
281
// 最终会调用insertWithOnConflict
282
282
public long insertWithOnConflict(String table, String nullColumnHack,
283
283
ContentValues initialValues, int conflictAlgorithm) {
@@ -373,13 +373,13 @@ public long executeForLastInsertedRowId(String sql, Object[] bindArgs,
373
373
这里有几个需要注意一下:
374
374
375
375
- SQLiteSession:
376
- ```
376
+ ``` java
377
377
private final ThreadLocal<SQLiteSession > mThreadSession = new ThreadLocal<SQLiteSession > () {
378
- @Override
379
- protected SQLiteSession initialValue() {
380
- return createSession();
381
- }
382
- };
378
+ @Override
379
+ protected SQLiteSession initialValue () {
380
+ return createSession();
381
+ }
382
+ };
383
383
```
384
384
385
385
每个线程都拥有自己的SQLiteSession对象。多个线程进行数据操作的时候需要注意和处理保持数据的原子性
@@ -388,7 +388,7 @@ private final ThreadLocal<SQLiteSession> mThreadSession = new ThreadLocal<SQLite
388
388
389
389
SQLiteStatement类代表一个sql语句,其父类为SQLiteProgram,从上面可以看到,insert操作会先构造出SQLiteStatement,其构造方法:
390
390
391
- ```
391
+ ``` java
392
392
SQLiteProgram(SQLiteDatabase db, String sql, Object [] bindArgs,
393
393
CancellationSignal cancellationSignalForPrepare) {
394
394
mDatabase = db;
@@ -443,7 +443,7 @@ SQLiteProgram(SQLiteDatabase db, String sql, Object[] bindArgs,
443
443
444
444
从源码可以看出查询操作最终会调用rawQueryWithFactory():
445
445
446
- ```
446
+ ``` java
447
447
448
448
public Cursor rawQueryWithFactory(
449
449
CursorFactory cursorFactory, String sql, String [] selectionArgs,
@@ -462,8 +462,7 @@ public Cursor rawQueryWithFactory(
462
462
463
463
可以看出先构造出SQLiteDirectCursorDriver,再调用其query操作:
464
464
465
- ```
466
-
465
+ ``` java
467
466
468
467
// SQLiteDirectCursorDriver::query():
469
468
public Cursor query(CursorFactory factory, String [] selectionArgs) {
@@ -497,7 +496,7 @@ public Cursor query(CursorFactory factory, String[] selectionArgs) {
497
496
498
497
SQLiteCursor分析:
499
498
500
- ```
499
+ ``` java
501
500
public final boolean moveToFirst() {
502
501
return moveToPosition(0 );
503
502
}
@@ -575,7 +574,7 @@ protected void clearOrCreateWindow(String name) {
575
574
576
575
到这里你会发现CursorWindow,那这个对象是干嘛的呢?从文档上看可以发现其保存查询数据库的缓存,那么数据是缓存在哪的呢?先看器构造器:
577
576
578
- ```
577
+ ``` java
579
578
public CursorWindow(String name) {
580
579
// ...
581
580
mWindowPtr = nativeCreate(mName, sCursorWindowSize);
@@ -587,8 +586,7 @@ public CursorWindow(String name) {
587
586
588
587
nativeCreate通过JNI调用CursorWindow.cpp的create():
589
588
590
- ```
591
-
589
+ ``` java
592
590
status_t CursorWindow :: create(const String8 & name, size_t size, CursorWindow ** outCursorWindow) {
593
591
String8 ashmemName(" CursorWindow: " );
594
592
ashmemName. append(name);
0 commit comments