android主要有5中數據存儲方式,如下:
1. 使用SharedPreferences存儲數據。
2. 使用文件存儲
3. 使用SQLlite存儲
4. 使用ContentProvider存儲
5. 網絡存儲
1.使用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是有些限制的:只能在同一個包內使用,不能在不同的包之間使用。
2.使用文件存儲
Android中讀取/寫入文件的方法,與Java中的I/O是一樣的,提供了openFileInput()和openFileOutput()方法來讀取設備上的文件。但是在默認狀態下,文件是不能在不同的程序之間共享的,以上兩個方法只支持讀取該應用目錄下的文件,讀取非其自身目錄下的文件將會拋出FileNotFoundException異常。創建的文件存放在/data/data/<package name>/files目錄下。
//讀取文件
FileInputStream fis = openFileInput(“text1.txt”);
… …
fis.close(); //關閉輸入流
//寫入文件
FileOutputStream fos = openFileOutput(“text1.txt”,MODE_APPEND);
… …
fos.close(); //關閉輸出流
3.SQLLite存儲數據
SQLLite是最常見和使用最多的存儲方式了。
SQLite 的數據庫的結構如下:
SQLite DataBaseName 由N個TableName構成,每個Table相當於一個Excel表格,也就是說每個表格的數據由行和列組成。一般我們的一組數據,構成一行。例如通訊錄的一個記錄:名字,地址,郵件,電話,手機等列構成一個完成的信息,這條信息在數據庫裏面就是一列。
每一列都是有標識的,就像我們做的Excel一樣。例如姓名:則這一列下面全部都是姓名。這樣,整個數據庫的結構就很簡單了。
操作數據庫:創建、打開
SQLiteDatabase.openDatabase(string path,SQLiteDatabase.CursorFactory factory ,int flags).
或者
Context.openOrCreateDatabase(String name,int mode,SQLiteDatabase.CursorFactory factory)
不管你如何執行查詢,都會返回一個 Cursor,這是 Android 的 SQLite 數據庫遊標,使用遊標,你可以:
通過使用 getCount() 方法得到結果集中有多少記錄;
通過 moveToFirst(), moveToNext(), 和 isAfterLast() 方法遍歷所有記錄;
通過 getColumnNames() 得到字段名;
通過 getColumnIndex() 轉換成字段號;
通過 getString(),getInt() 等方法得到給定字段當前記錄的值;
通過 requery() 方法重新執行查詢得到遊標;
通過 close() 方法釋放遊標資源;
Android平臺下數據庫相關類
1。SQLiteOpenHelper 抽象類:通過從此類繼承實現用戶類,來提供數據庫打開、關閉等操作函數。
2。SQLiteDatabase 數據庫訪問類:執行對數據庫的插入記錄、查詢記錄等操作。
3。SQLiteCursor 查詢結構操作類:用來訪問查詢結果中的記錄。
4.contentProvider存儲方式
ContentResolver是通過ContentProvider來獲取其他與應用程序共享的數據
其中ContentProvider負責
- 組織應用程序的數據;
- 向其他應用程序提供數據;
ContentResolver則負責
- 獲取ContentProvider提供的數據;
- 修改/添加/刪除更新數據等;
ContentProvider 是如何向外界提供數據的?
Android提供了ContentProvider,一個程序可以通過實現一個ContentProvider的抽象接口將自己的數據完全暴露出去,而且ContentProviders是以類似數據庫中表的方式將數據暴露,也就是說ContentProvider就像一個“數據庫”。那麼外界獲取其提供的數據,也就應該與從數據庫中獲取數據的操作基本一樣,只不過是採用URI來表示外界需要訪問的“數據庫”。至於如何從URI中識別出外界需要的是哪個“數據庫”,這就是Android底層需要做的事情了,不在此詳細說。簡要分析下ContentProvider向外界提供數據操作的接口:
query(Uri, String[], String, String[], String)
update(Uri, ContentValues, String, String[])
- ContentProvider是什麼時候創建的,是誰創建的?訪問某個應用程序共享的數據,是否需要啓動這個應用程序?這個問題在Android SDK中沒有明確說明,但是從數據共享的角度出發,ContentProvider應該是Android在系統啓動時就創建了,否則就談不上數據共享了。這就要求在AndroidManifest.XML中使用<provider>元素明確定義。
- 可能會有多個程序同時通過ContentResolver訪問一個ContentProvider,會不會導致像數據庫那樣的“髒數據”?這個問題一方面需要數據庫訪問的同步,尤其是數據寫入的同步,在AndroidManifest.XML中定義ContentProvider的時候,需要考慮是<provider>元素multiprocess屬性的值;另外一方面Android在ContentResolver中提供了notifyChange()接口,在數據改變時會通知其他ContentObserver,這個地方應該使用了觀察者模式,在ContentResolver中應該有一些類似register,unregister的接口。
5.網絡存儲
需要與Android 網絡數據包打交道
Android的網絡存儲使用HTTP協議,我們編寫的Android網絡應用就相當於一個瀏覽器。由於Android的應用是使用Java來開發的,所以網絡應用使用的也是J2SE的包。
Android如何與服務器交互數據?我們可以建立一個WEB應用,這對我們來說是一件十分容易的事。在WEB應用的相關請求處理中接收Andorid提交的數據、返回XML數據或JSON數據。Android發送相應的請求並接收服務相應的數據。這就是Android與WEB應用的數據交互。
Android發送請求和獲取數據如下:
String path = "http://www.android.com/images/opensourceproject.gif"; URL url = new URL(path); HttpURLConnection conn = (HttpURLConnection)url.openConnection(); conn.setConnectTimeout(6 * 1000); InputStream inStream = conn.getInputStream(); |
既然獲得了InputStream,那麼對數據進行操作就比較容易了。