android主要有5中數據存儲方式

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)

insert(Uri, ContentValues)

update(Uri, ContentValues, String, String[])

delete(Uri, String, String[])

 

  1. ContentProvider是什麼時候創建的,是誰創建的?訪問某個應用程序共享的數據,是否需要啓動這個應用程序?這個問題在Android SDK中沒有明確說明,但是從數據共享的角度出發,ContentProvider應該是Android在系統啓動時就創建了,否則就談不上數據共享了。這就要求在AndroidManifest.XML中使用<provider>元素明確定義。
  2. 可能會有多個程序同時通過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,那麼對數據進行操作就比較容易了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章