Android 的數據存儲方式

Android 提供了5種方式存儲數據:android

--使用SharedPreferences存儲數據;sql

--文件存儲數據;數據庫

--SQLite數據庫存儲數據;網絡

--使用ContentProvider存儲數據;數據結構

--網絡存儲數據;

ide

先說下,Preference,File, DataBase這三種方式分別對應的目錄是/data/data/Package Name/Shared_Pref, /data/data/Package Name/files, /data/data/Package Name/database 。函數

在Android中一般使用File存儲方式是用 Context.openFileOutput(String fileName, int mode)和Context.openFileInput(String fileName)。工具

Context.openFileOutput(String fileName, int mode)生成的文件自動存儲在/data/data/Package Name/files目錄下,其全路徑是/data/data/Package Name/files/fileName 。注意下,這裏的參數fileName不能夠包含路徑分割符(如"/")。性能

一般來講,這種方式生成的文件只能在這個apk內訪問。但這個結論是指使用Context.openFileInput(String fileName)的方式。使用這種方式,每一個apk只能夠訪問本身的/data/data/Package Name/files目錄下的文件,緣由很簡單,參數fileName中不能夠包含路徑分割符,Android會自動在/data/data /Package Name/files目錄下尋找文件名爲fileName的文件。學習


一: 使用SharedPreferences存儲數據

首先說明SharedPreferences存儲方式,它是 Android提供的用來存儲一些簡單配置信息的一種機制,例如:登陸用戶的用戶名與密碼。其採用了Map數據結構來存儲數據,以鍵值的方式存儲,能夠簡 單的讀取與寫入,具體實例以下:

void ReadSharedPreferences(){

String strName,strPassword;

SharedPreferences   user = getSharedPreferences(「user_info」,0);

strName = user.getString(「NAME」,」」);

strPassword = user getString(「PASSWORD」,」」);

}

void WriteSharedPreferences(String strName,String strPassword){

SharedPreferences   user = getSharedPreferences(「user_info」,0);

uer.edit();

user.putString(「NAME」, strName);

user.putString(「PASSWORD」 ,strPassword);

user.commit();

}

數據讀取與寫入的方法都很是簡單,只是在寫入的時候有些區別:先調用edit()使其處於編輯狀態,而後才能修改數據,最後使用commit()提交修改 的數據。實際上SharedPreferences是採用了XML格式將數據存儲到設備中,在DDMS中的File Explorer中的/data/data/<package name>/shares_prefs下。以上面的數據存儲結果爲例,打開後能夠看到一個user_info.xml的文件,打開後能夠看到:

<?xml version=」1.0″ encoding=」UTF-8″?>

<map>

<string name=」NAME」>moandroid</string>

<string name=」 PASSWORD」>SharedPreferences</string>

</map>

使用SharedPreferences是有些限制的:只能在同一個包內使用,不能在不一樣的包之間使用。


二: 文件存儲數據

文件存儲方式是一種較經常使用的方法,在Android中讀取/寫入文件的方法,與 Java中實現I/O的程序是徹底同樣的,提供了openFileInput()和openFileOutput()方法來讀取設備上的文件。 FilterInputStream, FilterOutputStream等能夠到Java io package說明中去詳細學習,再也不此詳細說明,具體實例以下:

String fn = 「moandroid.log」;

FileInputStream fis = openFileInput(fn);

FileOutputStream fos = openFileOutput(fn,Context.MODE_PRIVATE);

除此以外,Android還提供了其餘函數來操做文件,詳細說明請閱讀Android SDK。


三: 網絡存儲數據

網絡存儲方式,須要與Android 網絡數據包打交道,關於Android 網絡數據包的詳細說明,請閱讀Android SDK引用了Java SDK的哪些package?。


四: ContentProvider

一、ContentProvider簡介

當應用繼承ContentProvider類,並重寫該類用於提供數據和存儲數據的方法,就能夠向其餘應用共享其數據。雖然使用其餘方法也能夠對外共享數 據,但數據訪問方式會因數據存儲的方式而不一樣,如:採用文件方式對外共享數據,須要進行文件操做讀寫數據;採用sharedpreferences共享數 據,須要使用sharedpreferences API讀寫數據。而使用ContentProvider共享數據的好處是統一了數據訪問方式。?

二、Uri類簡介

Uri表明了要操做的數據,Uri主要包含了兩部分信息:1.須要操做的ContentProvider ,2.對ContentProvider中的什麼數據進行操做,一個Uri由如下幾部分組成:

1.scheme:ContentProvider(內容提供者)的scheme已經由Android所規定爲:content://。

2.主機名(或Authority):用於惟一標識這個ContentProvider,外部調用者能夠根據這個標識來找到它。

3.路徑(path):能夠用來表示咱們要操做的數據,路徑的構建應根據業務而定,以下:

 要操做contact表中id爲10的記錄,能夠構建這樣的路徑:/contact/10

 要操做contact表中id爲10的記錄的name字段, contact/10/name

要操做contact表中的全部記錄,能夠構建這樣的路徑:/contact?

要操做的數據不必定來自數據庫,也能夠是文件等他存儲方式,以下:

要操做xml文件中contact節點下的name節點,能夠構建這樣的路徑:/contact/name

若是要把一個字符串轉換成Uri,可使用Uri類中的parse()方法,以下:

Uri uri = Uri.parse("content://com.changcheng.provider.contactprovider/contact")

三、UriMatcher、ContentUrist和ContentResolver簡介

由於Uri表明了要操做的數據,因此咱們很常常須要解析Uri,並從 Uri中獲取數據。Android系統提供了兩個用於操做Uri的工具類,分別爲UriMatcher 和ContentUris 。掌握它們的使用,會便於咱們的開發工做。

 UriMatcher:用於匹配Uri,它的用法以下:

1.首先把你須要匹配Uri路徑所有給註冊上,以下:

//常量UriMatcher.NO_MATCH表示不匹配任何路徑的返回碼(-1)。

UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);

//若是match()方法匹配content://com.changcheng.sqlite.provider.contactprovider /contact路徑,返回匹配碼爲1

uriMatcher.addURI(「com.changcheng.sqlite.provider.contactprovider」, 「contact」, 1);//添加須要匹配uri,若是匹配就會返回匹配碼

//若是match()方法匹配 content://com.changcheng.sqlite.provider.contactprovider/contact/230路徑,返 回匹配碼爲2

uriMatcher.addURI(「com.changcheng.sqlite.provider.contactprovider」, 「contact/#」, 2);//#號爲通配符

2.註冊完須要匹配的Uri後,就可使用uriMatcher.match(uri)方法對輸入的Uri進行匹配,若是匹配就返回匹配碼,匹配碼是調用 addURI()方法傳入的第三個參數,假設匹配 content://com.changcheng.sqlite.provider.contactprovider/contact路徑,返回的匹配 碼爲1。

ContentUris:用於獲取Uri路徑後面的ID部分,它有兩個比較實用的方法:

 withAppendedId(uri, id)用於爲路徑加上ID部分

parseId(uri)方法用於從路徑中獲取ID部分

 ContentResolver:當外部應用須要對ContentProvider中的數據進行添加、刪除、修改和查詢操做時,可使用 ContentResolver 類來完成,要獲取ContentResolver 對象,可使用Activity提供的getContentResolver()方法。 ContentResolver使用insert、delete、update、query方法,來操做數據。


五: 總結說明

以上5中存儲方式,在之後的開發過程當中,根據設計目標、性能需求、空間需求等找到 合適的數據存儲方式。Android 中的數據存儲都是私有的,其餘應用程序都是沒法訪問的,除非經過ContentResolver獲取其餘程序共享的數據。採用文件方式對外共享數據,須要 進行文件操做讀寫數據;採用sharedpreferences共享數據,須要使用sharedpreferences API讀寫數據。而使用ContentProvider共享數據的好處是統一了數據訪問方式。

相關文章
相關標籤/搜索