1. 程式人生 > >Android 資料庫開發(一)SQLite3概述

Android 資料庫開發(一)SQLite3概述

前言

SQLite是一款輕型的資料庫,是遵守ACID的關係型資料庫管理系統,它包含在一個相對小的C庫中。它是D.RichardHipp建立的公有領域專案,設計目標是嵌入式的,而且目前已經在很多嵌入式產品中使用了它,它佔用資源非常的低,在Android、iOS等移動作業系統中的資料庫實現也是使用的SQLite3。對於Android開發者來說資料庫並不算很好維護,所以深入瞭解SQLite資料庫也變得很有必要,本文就來先介紹下SQLite3。

1.SQLite3簡單介紹

SQLite並不是一個獨立的程序,而是作為程式的一部分,應用程式經由程式語言內的API直接呼叫SQLite,這能有效的減少資料庫訪問的延遲,因為在一個程序中呼叫函式要比跨程序通訊更有效率。SQLite將整個資料庫作為一個單獨的、可跨平臺的檔案儲存再主機中,它採用了再寫入資料時將整個資料庫檔案加鎖的簡單的設計,儘管寫操作只能序列進行,但SQLite的讀操作可以多工同時進行。
程式庫實現了多數的SQL-92標準,包括事務以及實現原子性、一致性、隔離性和永續性,但它缺失了某些特性,例如它僅部分支援觸發器: 支援 FOR EACH ROW 觸發器,但不支援 FOR EACH STATEMENT 觸發器。儘管它支援大多數複雜查詢,但它的ALTER TABLE 功能有所限制:只能新增和重新命名列,不能修改或者刪除列。因此,當需要修改或者刪除列名時只能重新建立表。

2. 為什麼要用 SQLite

  • 不需要一個單獨的伺服器程序或操作的系統(無伺服器的);
  • 不需要配置,這意味著不需要安裝或管理;
  • 非常小,是輕量級的,完全配置時小於 400KiB,省略可選功能配置時小於250KiB;
  • 自給自足的,這意味著不需要任何外部的依賴;
  • 支援 SQL92(SQL2)標準的大多數查詢語言的功能。 SQLite 使用 ANSI-C 編寫的,並提供了簡單和易於使用的 API;
  • 支援資料庫大小至2TB;
  • 可在 UNIX(Linux, Mac OS-X, Android, iOS)和 Windows(Win32, WinCE, WinRT)中執行。

3. SQLite的系統架構

  SQLite採用了模組的設計,它由三個子系統,包括8個獨立的模組構成;模組將複雜的查詢過程分解為細小的工作進行處理。

這裡寫圖片描述

如上圖所示,sqlite主要由7個構件子系統(也就是模組)組成,這些模組被分割為兩個部分:
前端解析系統和後端引擎。

前端解析系統

前端預處理應用程式傳遞過來的SQL語句和SQLite命令,對獲取的編碼分析,優化,並轉換 為後端能夠執行的SQLite內部位元組編碼。前端可分為三個模組:

  • 詞法分析器(Tokenizer)
    將輸入的SQL語句分成識別符號,並把這些標示符傳遞給解析器;

  • 語法分析器(Parser)
    解析器分析通過標識器產生的標識分析語句的結構,並且得到一顆語法樹。解析器同時也包含了重構語法樹的優化器,因此能夠找到一顆產生一個高效的位元組編碼程式的語法樹。

  • 程式碼生成器(Code Generator)
    語法分析器再把標示符組裝成完整的SQL語句後,呼叫程式碼生成器產生虛擬機器程式碼,以執行SQL語句的請求作用。

後端引擎

後端是用來解釋位元組編碼程式的引擎,該引擎做的才是真正的資料庫處理工作。後端部分由四個模組組成:

  • 虛擬機器(VM)
    VM模組是一個內部位元組編碼語言的直譯器。它通過執行位元組編碼語句來實現SQL語句的工作。它是資料庫中資料的最終的操作者。它把資料庫看成表和索引的集合,而表和索引則是一系列的元組或者記錄。

  • B/B+樹
    B/B+樹模組把每一個元組集組織進一個一次排好序的樹狀資料結構中,表和索引被分別置於單獨的B+和B樹中。該模組幫助VM進行搜尋,插入和刪除樹中的元組。它也幫助VM建立新的樹和刪除舊的樹。

  • 頁面排程程式(pager)
    頁面排程程式模組在原始檔案的上層實現了一個面向頁面的資料庫檔案抽象。它管理B/B+樹使用的記憶體內快取(資料庫頁的),另外,他也管理檔案的鎖定,並用日誌來實現事物的ACID屬性。

  • 作業系統交介面(system interface)
    作業系統介面模組提供了對應於不同本地作業系統的統一交介面。