天天看點

Android 工具庫 pandora 簡介 - 沙盒的實作

Pandora 是一個優秀的開源 Android 開發工具,用來進行開發時候的一些輔助工作。本文簡單介紹下 pandora 以下重要功能的對應實作方式:

沙盒檔案

pandora 展示的沙河檔案有如下三類:

Database 資料庫的檔案

SharedPreferences 檔案

應用沙盒目錄下的檔案樹(即 <code>context.getRootDir()</code> 所擷取到的目錄)

接下來我們分别說這三類資訊是如何擷取到的,其關鍵的 API 分别是什麼?

主要涉及以下幾個資料庫相關 API :

<code>context.databaseList()</code> 用來擷取應用的資料庫清單,傳回一個字元串數組

<code>context.getDatabasePath(String databaseName)</code> 用來擷取某個資料庫對應的檔案,傳回一個 <code>File</code> 對象

<code>SQLiteDatabase.openDatabase(File databaseFile, SQLiteDatabase.CursorFactory factory, int flags)</code> 用來擷取資料庫資訊,傳回一個 <code>SQLiteDatabase</code> 對象用來進行查詢。

該 <code>openDatabase</code> 函數執行後需要使用 <code>SQLiteDatabase.close()</code> 方法關閉。類似于檔案操作

<code>SQLiteDatabase</code> 對象的 <code>rawQuery(String querySQL,String[] selectionArgs)</code> 方法,擷取遊标後進行查詢。

<code>SQLiteDatabase</code> 對象的 <code>compileStatement(String sql)</code> 用來擷取一個操作對象進行執行,傳回一個 <code>SQLiteStatement</code> 對象

<code>SQLiteStatement</code> 對象類似于 <code>FragmentTransaction</code> 對象,隻是描述動作,并沒有真正執行,需要下面的幾個方法來送出執行

<code>SQLiteStatement</code> 送出執行的方法根據實際的語句不同而有差别,具體有使用 <code>executeUpdateDelete()</code> 、 <code>executeInsert</code> 這兩種執行方式。

基于以上的 API,就可以實作以下操作:

查詢應用所有的資料庫

查詢指定資料庫的表

查詢指定表中的資料

修改指定表中的資料

周遊應用 dataDirectory 的 <code>/shared_prefs</code> 目錄,擷取其中所有的 <code>.xml</code> 檔案,這裡面的 xml 檔案正常來說就是應用的 sharedPreferencnes 資料。

<code>context.getSharedPreferences(String prefName, int mode)</code> 方法用來讀取指定 pref 檔案裡的資料資訊。傳回的是 <code>SharedPreferences</code> 對象

<code>SharedPreferences</code> 對象的 <code>edit()</code> 方法擷取一個 <code>SharedPreferences.Editor</code> 對象,并且使用 <code>putInt</code> / <code>putBoolean</code> 等方法進行更新。

除了 dataDirectory 下的 <code>/shared_prefs</code> 目錄包含有應用的 pref 檔案外,還有一處和 "deviceProtect" 有關的目錄也可能會有 pref 檔案的存在,這個主要是目錄問題,在此不讨論這個情況。具體可以參見 Android 官方文檔 - DeviceProtectStorage

基于以上的 API,可以實作:

查詢應用所有的 SharedPreferences 資訊

擷取指定的 SharedPreferences 裡的資料

修改執行 SharedPreferences 中的資料

該功能主要使用 <code>File</code> 一族相關的方法,因為及其常用,是以在此不加贅述了,主要包含:

<code>File</code> 對象的 <code>listFiles()</code> 方法用來擷取目錄下的子檔案。

<code>exists()</code> 、 <code>isDirectory()</code> 等判斷檔案等。