2013-01-17 29 views
1

我想知道在Android上處理數據庫時sqllite的工作原理。我知道它使用.db擴展名將所有內容寫入文件。但是它如何讀取或寫入一個特定的表?它是獲取整個文件還是僅獲取相關部分以及它如何執行這些操作?有人可以建議我一些鏈接?我試過谷歌,但我發現的鏈接只是解釋如何編寫查詢。sql lite如何在android中使用數據庫中的文件

回答

0

Android上的SQLite操作與任何其他平臺上的SQLite操作沒有任何區別。

非常簡短的回答你的問題:SQLite文件被分成固定大小的頁面。每個數據庫對象(表,索引等)佔用一定數量的頁面。如果對象需要增長(如將新行插入到表中),則可以從空閒頁列表中分配更多新頁面,或者通過增大數據庫文件的大小來分配更多新頁面。如果刪除行或刪除對象,則回收的可用空間將進入空閒頁面列表。在任何操作過程中,SQLite引擎都會嘗試不抓取整個文件,但它會維護頁面緩存以提高性能。

一般而言,您可以找到關於SQLite website的更詳細的解釋,尤其是關於SQLite database file format

1

爲此,您必須閱讀數據庫的基礎知識。 所有的db框架在工作方面都差不多,所以你必須研究數據庫的基礎知識(任何)。 這裏是一些相關的信息u可以像

What does a database actually do to find out what matches a select statement? 

坦率地說,這是蠻力的問題。簡單地說,它讀取數據庫中的每個候選記錄並將表達式與字段匹配。所以,如果你有「select * from table where name ='fred'」,它會逐字地遍歷每條記錄,抓住「name」字段,並將其與'fred'進行比較。

現在,如果「table.name」字段被索引,那麼數據庫將(可能,但不一定)首先使用索引來定位候選記錄以應用實際的過濾器。

這減少了應用表達式的候選記錄的數量,否則它只會做我們稱之爲「表掃描」,即讀取每一行。

但是,從根本上說,它定位的候選記錄與它如何應用實際的過濾表達式是分開的,顯然,有一些聰明的優化可以完成。

How does a database interpret a join differently to a query with several "where key1 = key2" statements? 

那麼,一個聯接是用來製作一個新的「僞表」,應用過濾器。所以,你有過濾標準和連接標準。連接標準用於構建這個「僞表」,然後過濾器應用於此。現在,在解釋連接時,它又是與過濾器相同的問題 - 強力比較和索引讀取來構建「僞表」的子集。

How does the database store all its memory? 

良好的數據庫的關鍵之一是它如何管理其I/O緩衝區。但它基本上將RAM塊匹配到磁盤塊。使用現代虛擬內存管理器,簡單的數據庫幾乎可以依靠虛擬機作爲內存緩衝區管理器。高端數據庫自己完成所有這些工作。

How are indexes stored? 

B +樹通常,你應該看看它。這是一種直截了當的技術,已經存在多年。與大多數任何平衡樹共享它的好處:對節點的一致訪問,以及所有葉節點的鏈接,因此您可以按鍵順序輕鬆地從節點到節點進行遍歷。因此,對於索引,可以將這些行視爲數據庫中特定字段的「排序」,並且數據庫可以利用該信息使其受益於優化。這與使用散列表的索引截然不同,它只能讓您快速獲取特定記錄。在B-Tree中,您不僅可以快速獲取特定記錄,還可以快速獲取排序列表中的某個點。

在數據庫中存儲和索引行的實際機制非常直截了當並且很好理解。遊戲正在管理緩衝區,並將SQL轉換爲高效的查詢路徑以利用這些基本存儲習慣用法。

然後,在存儲方式上,存在整個多用戶鎖定,日誌記錄和事務複雜性。

相關問題