標籤:儲存 儲存 ogr 調用 通訊 cti get 一個 ase
Android中的資料存放區使用的小巧的SQLite資料庫。
為了方便java層使用SQLite,android做了大量的封裝。提供了一些列的類和API。本文章就揭露這些封裝背後的類圖關係。
老規矩,首先:
SQLiteOpenHelper是Android SDK所提供的一個協助類,通過此類來管理資料庫的建立和版本號碼控制。
通過SQLiteOpenHelper函數getReadableDatabase和函數getWritableDatabase能夠得到一個SQLiteDatabase對象。使用者通過繼承SQLiteOpenHelper類,實現其抽象函數,以實現資料庫表格的建立,版本號碼的升級等功能。
從UML途中能夠看到SQLiteDatabase中有一個成員變數指向DatabaseErrorHandler介面。這個對象用來處理資料庫發生異常的case。我們能夠實現這個介面來處理資料的異常case,比方資料庫損壞打不開,就會調用到這個介面的onCorruption函數。
SQLiteDatabase提供了對資料庫的一些操作函數。比方query。insert,delete等。這裡僅僅說一種case:query。途中綠色的線條代表著query的調用流程走向。
通過SQLiteDatabse的query函數,能夠得到一個SQLiteCursor對象。它實現了Cursor介面。
SQLiteCursor代表著查詢資料庫後的結果集。假設是本進程內調用SQLiteDatabse,那麼得到Cursor介面實際上是SQLiteCursor對象,假設是跨進程,比方通過ContentProvider的query介面查詢一個Uri得帶一個Curosr介面,那麼實際的對象將是一個支援跨進程通訊的Cursor對象。這裡就不做具體的描寫敘述了,在以後的文章中再單獨解說Cursor的結構體系。
SQLiteDatabse的一個特色是對多線程的訪問做了封裝。
每一個線程都有儲存著一個session,用來和資料庫通訊。而實際的通訊過程是seesion從connect pool中得到一個SQLiteConnection串連,通過這個串連來操作native層真正的資料庫。每次操作資料庫的時候都必須得到一個串連。
SQLiteConnectionPool控制了串連的類型。對於WAL模式的資料庫,僅僅能有一個可寫的串連,能夠有多個讀的串連。這樣讀和寫就能夠同一時候進行了。當一個可寫的串連已經被佔用了。假設此時有線程申請寫的串連,那麼這個線程會進入等待隊列,直到有可利用的寫串連為止。對於journal mode的資料庫,4.2的代碼是僅僅同意有一個串連。
SQLiteProgram代表著一次對資料庫操作的各種資源。它裡面儲存著SQL語句。所操作的資料庫物件,以及SQL語句所綁定的參數。
Android SQLiteDatabase分析