android關於多執行緒操作sqlite知識點

2021-07-09 06:53:46 字數 2403 閱讀 7472

1.關於getwriteabledatabase()和getreadabledatabase()的真正作用

getwriteabledatabase()其實是相當於getreadabledatabase()的乙個子方法,getwriteabledatabase()是只能返回乙個以讀寫方式開啟的sqlitedatabase的引用,如果此時資料庫不可寫時就會丟擲異常,比如資料庫的磁碟空間滿了的情況。而getreadabledatabase()一般預設是呼叫getwriteabledatabase()方法,如果資料庫不可寫時就會返回乙個以唯讀方式開啟的sqlitedatabase的引用,這就是二者最明顯的區別。

關鍵原始碼如下:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

publicsynchronizedsqlitedatabase getwritabledatabase()elseif(!mdatabase.isreadonly())

}

... ...

publicsynchronizedsqlitedatabase getreadabledatabase()else

}

... ...

try

... ...

2.sqlitedatabase的同步鎖

其實在只使用乙個sqlitedatabase的引用時,sqlitedatabase對crud操作都會加上乙個鎖(因為是db檔案,所以精確至資料庫級),這就保證了在同一時間你只能進行一項操作,無論是不是在同乙個執行緒中,這就導致了如果你在程式中對sqliteopenhelper使用了單例模式,那麼你對資料庫讀寫進行任何的優化操作都是"徒勞"。

3.多執行緒讀資料庫

仔細看原始碼你會發現,在資料庫操作中只有add,delete,update會呼叫lock(),而query()是不會呼叫的,但是在載入資料時,呼叫了sqlitequery的fillwindow方法,而該方法依然會呼叫sqlitedatabase.lock(),所以要想真正的實現多執行緒讀資料庫,只能每個執行緒使用各自的sqliteopenhelper物件進行讀操作,這樣就可避開同步鎖。關鍵原始碼如下:

?

1

2

3

4

5

6

/* package */int fillwindow(cursorwindow window,

int maxread, int lastpos)catch(exception e)

}

returnmdatabase;

}

//關閉資料庫方法

public synchronized void closedatabase()

}

(3)還有一些比較好的習慣和常識,例如關閉cursor,使用transaction,sqlite儲存資料時其實不區分型別,以及sqlite支援大部分標準sql語句,增刪改查語句都是通用的等等。

**:

Android 多執行緒

1 簡介 2 android 平台下的多執行緒 package com.powerise.thread import android.os.bundle import android.view.view import android.view.view.onclicklistener import ...

Android 多執行緒

1,常用的thread 和running的方法 public static void thread thread.start private static void running thread thread new thread runnable thread.start private stat...

Android 多執行緒

最近開始做安卓專案,然而對多執行緒的理解和應用還是欠缺,最近就系統的學習一下 public class testthreadactivity extends baseactivity private void initviews private class mytask extends asynct...