Skip to content

Commit 607263a

Browse files
committed
格式修改
1 parent 3e8bde1 commit 607263a

File tree

1 file changed

+16
-18
lines changed

1 file changed

+16
-18
lines changed

SQLite_Android.md

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
两个方法:getReadableDatabase()、getWritableDatabase()。需要注意的一点是这两个方法都加锁,是线程安全的。这两个方法最终调用getDatabaseLocked(boolean writable):
1717

1818

19-
```
19+
```java
2020
private SQLiteDatabase getDatabaseLocked(boolean writable) {
2121
if (mDatabase != null) {
2222

@@ -147,7 +147,7 @@ WAL支持读写并发,是通过将修改的数据单独写到一个wal文件
147147

148148
获取SQLiteDatabase对象,从上面可以看到getReadableDatabase()、getWritableDatabase()是通过SQLiteDatabase.openDatabase(..)创建数据库,那么其中包含那些细节呢?
149149

150-
```
150+
```java
151151
public static SQLiteDatabase openDatabase(String path, CursorFactory factory, int flags,
152152
DatabaseErrorHandler errorHandler) {
153153
SQLiteDatabase db = new SQLiteDatabase(path, flags, factory, errorHandler);
@@ -160,7 +160,7 @@ public static SQLiteDatabase openDatabase(String path, CursorFactory factory, in
160160

161161
open():
162162

163-
```
163+
```java
164164

165165
open():
166166
private void open() {
@@ -277,7 +277,7 @@ private void open() {
277277

278278
先分析一下insert()和insertOrThrow()插入函数:
279279

280-
```
280+
```java
281281
// 最终会调用insertWithOnConflict
282282
public long insertWithOnConflict(String table, String nullColumnHack,
283283
ContentValues initialValues, int conflictAlgorithm) {
@@ -373,13 +373,13 @@ public long executeForLastInsertedRowId(String sql, Object[] bindArgs,
373373
这里有几个需要注意一下:
374374

375375
- SQLiteSession:
376-
```
376+
```java
377377
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+
};
383383
```
384384

385385
每个线程都拥有自己的SQLiteSession对象。多个线程进行数据操作的时候需要注意和处理保持数据的原子性
@@ -388,7 +388,7 @@ private final ThreadLocal<SQLiteSession> mThreadSession = new ThreadLocal<SQLite
388388

389389
SQLiteStatement类代表一个sql语句,其父类为SQLiteProgram,从上面可以看到,insert操作会先构造出SQLiteStatement,其构造方法:
390390

391-
```
391+
```java
392392
SQLiteProgram(SQLiteDatabase db, String sql, Object[] bindArgs,
393393
CancellationSignal cancellationSignalForPrepare) {
394394
mDatabase = db;
@@ -443,7 +443,7 @@ SQLiteProgram(SQLiteDatabase db, String sql, Object[] bindArgs,
443443

444444
从源码可以看出查询操作最终会调用rawQueryWithFactory():
445445

446-
```
446+
```java
447447

448448
public Cursor rawQueryWithFactory(
449449
CursorFactory cursorFactory, String sql, String[] selectionArgs,
@@ -462,8 +462,7 @@ public Cursor rawQueryWithFactory(
462462

463463
可以看出先构造出SQLiteDirectCursorDriver,再调用其query操作:
464464

465-
```
466-
465+
```java
467466

468467
// SQLiteDirectCursorDriver::query():
469468
public Cursor query(CursorFactory factory, String[] selectionArgs) {
@@ -497,7 +496,7 @@ public Cursor query(CursorFactory factory, String[] selectionArgs) {
497496

498497
SQLiteCursor分析:
499498

500-
```
499+
```java
501500
public final boolean moveToFirst() {
502501
return moveToPosition(0);
503502
}
@@ -575,7 +574,7 @@ protected void clearOrCreateWindow(String name) {
575574

576575
到这里你会发现CursorWindow,那这个对象是干嘛的呢?从文档上看可以发现其保存查询数据库的缓存,那么数据是缓存在哪的呢?先看器构造器:
577576

578-
```
577+
```java
579578
public CursorWindow(String name) {
580579
// ...
581580
mWindowPtr = nativeCreate(mName, sCursorWindowSize);
@@ -587,8 +586,7 @@ public CursorWindow(String name) {
587586

588587
nativeCreate通过JNI调用CursorWindow.cpp的create():
589588

590-
```
591-
589+
```java
592590
status_t CursorWindow::create(const String8& name, size_t size, CursorWindow** outCursorWindow) {
593591
String8 ashmemName("CursorWindow: ");
594592
ashmemName.append(name);

0 commit comments

Comments
 (0)