數據存儲在開發中是使用最頻繁的,在這里主要介紹Android平台中實現數據存儲的5種方式,分別是:
1 使用SharedPreferences存儲數據
2 文件存儲數據
3 SQLite數據庫存儲數據
4 使用ContentProvider存儲數據
5 網絡存儲數據
①SharedPreferences
SharedPreferences是Android平台下輕量級的存儲類,主要保存一些常用的配置如窗口狀態。
它的本質是基於XML文件存儲key-value鍵值對數據,通常用來存儲一些簡單的配置信息。
其存儲位置在/data/data/包名/shared_prefs目錄下。
SharedPreferences對象本身只能獲取數據而不支持存儲和修改,存儲修改是通過Editor對象實現。
實現SharedPreferences存儲的步驟如下:
③SQLite數據庫存儲數據
一、根據Context獲取SharedPreferences對象
SharedPreferences sp=getSharedPreferences("SP",MODE_PRIVATE);
二、利用edit()方法獲取Editor對象。
Editor editor=sp.edit();
三、通過Editor對象存儲key-value鍵值對數據。
editor.putString("STRING_KEY","string");
editor.putInt("INT_KEY",0);
editor.putBoolean("BOOLEAN_KEY",true);
四、通過commit()方法提交數據
editor.commit();
SharedPreferences存儲對比SQLite儲存,免去了創建數據庫,創建表,寫SQL語句等操作,但是其只能儲存boolean,int,float,long,string5種數據類型,無法進行條件查詢,所以說到底,它也是一種簡單的存儲方式補充,而無法完全替代SQLite。
②文件存儲數據
關於文件存儲,Activity提供了openFileOutput()方法可以用於把數據輸出到文件中,具體的實現過程與在J2SE環境中保存數據到文件中是一樣的。
文件可用來存放大量數據,如文本、圖片、音頻等。
默認位置:/data/data/包名/files/***.***。
openFileOutput()指定兩個參數,第一個參數是指定文件名稱,不能包含路徑分隔符"/",如果文件不存在,則自動創建。
第二個參數指定操作模式,有四種操作模式,分別是:
Context.MODE_PRIVATE = 0
Context.MODE_APPEND = 32768
Context.MODE_WORLD_READABLE = 1
Context.MODE_WORLD_WRITEABLE = 2
Context.MODE_PRIVATE是默認操作,代表該文件是私有數據,只能被應用本身訪問,在該模式下,寫入的內容會覆蓋原文件的內容,
Context.MODE_APPEND是追加模式,首先檢查文件存不存在,存在就往文件里追加,不存在就創建。
Context.MODE_WORLD_READABLE代表當前文件可被其他應用讀取。
Context.MODE_WORLD_WRITEABLE代表當前文件可被其他應用寫入。
寫入的代碼:
FileOutputStream fos= openFileOutput("test.txt",Context.MODE_APPEND); fos.write(text.getText().toString()); fos.close();
讀取的代碼:
FileInputStream fis=openFileInput("test.txt"); ByteArrayOutputStream stream = new ByteArrayOutputStream(); byte[] buffer=new byte[1024]; int length=-1; while((length=fis.read(buffer)!=-1){ stream.write(buffer,0,length); } stream.close(); fis.close();
*往SD卡中存儲文件
獲取SD卡的狀態:Environment.getExternalStorageState(),如果手機有SD卡且可以讀寫,則返回Environment.MEDIA_MOUNTED。
獲取SD卡的目錄:Environment.getExternalStorageDirectory()。
通常的代碼為:
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNT)){ File sdCardDir=Environment.getExternalStorageDireactory(); File saveFile=new File(sdCardDir,"a.txt"); FileOutputStream fos=new FileOutputStream(saveFile); fos.write("test".getBytes()); fos.close(); }
③SQLite數據庫存儲數據
SQLite是輕量級嵌入式數據庫引擎,它支持 SQL 語言,並且只利用很少的內存就有很好的性能。
數據庫存儲在 data/< 項目文件夾 >/databases/ 下。 Android 開發中使用 SQLite 數據庫 Activites 可以通過 Content Provider 或者 Service 訪問一個數據庫。
Android 提供了 SQLiteOpenHelper 幫助你創建一個數據庫,你只要繼承 SQLiteOpenHelper 類,就可以輕松的創建數據庫。SQLiteOpenHelper 類根據開發應用程序的需要,封裝了創建和更新數據庫使用的邏輯。
SQLiteOpenHelper 的子類,至少需要實現三個方法:
1.構造方法
調用父類SQLiteOpenHelper的構造函數。該方法需要四個函數,分別是上下文Context,數據庫名,游標工廠(通常為null),還有一個代表版本號的version。
2.onCreate()
在此方法中我們需要創建表和初始化數據。
如:CREATE TABLE mytable (_id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, value REAL)
3.onUpGrage()
升級數據庫時調用的方法。需要三個參數,分別是SQLiteDatabase對象,舊的版本號,新的版本號。
*使用SQLite對數據進行操作
我們通過SQLiteOpenHelper的getReadableDatabase或getWriteableDatabase獲得了可寫或可讀的數據庫后
insert():可以通過insert()進行插入操作,接收三個參數,分別是表名,第二個參數代表未指定添加數據的情況下可為空的列賦值為null,我們在這里一般填null就可,第三個是ContentValues,它提供一系列的put(),供我們往里面填充數據。
SQLiteDatabase db=dbHelper.getWriteableDatabase(); ContentValues values=new ContentValues(); values.put("name","string"); values.put("page",23); values.put("price",55.85); db.insert("Book",null,values);
update():更新的操作。接收四個參數,分別是表名,ContentValues,指定哪一行,相應的填充指定哪一行的數組。
SQLiteDatabase db=dbHelper.getWriteableDatabase(); ContentValues values=new ContentValues(); values.put("page",33); db.update("Book",values,"name=?",new String[]{"23"});
delete():刪除操作。接收三個參數,第一個為表名,第二個為指定哪一行,第三個為相應的填充哪一行的數據。
SQLiteDatabase db=dbHelper.getWriteableDatabase(); db.delete("Book","page>?",new String[]{50});
query():查詢操作。至少要傳入七個參數。分別是表名tablename,列名columns,where的約束條件selection,為where占位符提供數據的selectionArgs,需要group by的列,group by后進一步約束的having,還有對結果進行排序的orderBy,最后返回一個Cursor對象,我們可以從中獲取到相應的數據。
SQLiteDatabase db=dbHelper.getReadableDatabase(); //把頁數大於20的篩選出來 Cursor cursor=db.query("Book","page>?",new String[]{20},null,null,null,null); if(cursor!=null){ String name=cursor.getString(cursor.getColumnIndex("name")); ... } cursor.close();
④CotentProvider存儲數據
詳見ContentProvider介紹。