四種Android數(shù)據(jù)存儲(chǔ)方式
Android提供以下四種存儲(chǔ)方式:
- SharePreference
- SQLite
- File
- ContentProvider
Android系統(tǒng)中數(shù)據(jù)基本都是私有的,一般存放在“data/data/程序包名”目錄下。如果要實(shí)現(xiàn)數(shù)據(jù)共享,正確的方式是使用ContentProvider。
SharedPreference
SharedPreference是一種輕型的數(shù)據(jù)存儲(chǔ)方式,實(shí)際上是基于XML文件存儲(chǔ)的“key-value”鍵值對(duì)數(shù)據(jù)。通常用來存儲(chǔ)程序的一些配置信息。其存儲(chǔ)在“data/data/程序包名/shared_prefs目錄下。
SharedPreference本身只能獲取數(shù)據(jù),不支持存儲(chǔ)和修改。存儲(chǔ)和修改要通過Editor對(duì)象來實(shí)現(xiàn)。
1)、修改和存儲(chǔ)數(shù)據(jù)
- 根據(jù)Context的getSharedPrerences(key, [模式])方法獲取SharedPreference對(duì)象;
- 利用SharedPreference的editor()方法獲取Editor對(duì)象;
- 通過Editor的putXXX()方法,將鍵值對(duì)存儲(chǔ)數(shù)據(jù);
- 通過Editor的commit()方法將數(shù)據(jù)提交到SharedPreference內(nèi)。
綜合例子:
//設(shè)置單例里面的數(shù)值,然后再將數(shù)值寫入到SharedPreference里 private String setCityName(String _cityName){ City.getCity().setCityName(_cityName); Context ctx =MainActivity.this; SharedPreferences sp =ctx.getSharedPreferences("CITY", MODE_PRIVATE); Editor editor=sp.edit(); editor.putString("CityName", City.getCity().getCityName()); editor.commit(); return City.getCity().getCityName(); }
2)、獲取數(shù)據(jù)
- 同樣根據(jù)Context對(duì)象獲取SharedPreference對(duì)象;
- 直接使用SharedPreference的getXXX(key)方法獲取數(shù)據(jù)。
綜合例子:
//從單例里面找,如果不存在則在SharedPreferences里面讀取 private String getCityName(){ String cityName = City.getCity().getCityName(); if(cityName==null ||cityName==""){ Context ctx =MainActivity.this; SharedPreferences sp =ctx.getSharedPreferences("CITY", MODE_PRIVATE); City.getCity().setCityName(sp.getString("CityName", "廣州")); } return City.getCity().getCityName(); }
注意
getSharedPrerences(key, [模式])方法中,第一個(gè)參數(shù)其實(shí)對(duì)應(yīng)到XML的文件名,相同key的數(shù)據(jù)會(huì)保存到同一個(gè)文件下。
使用SharedPreference的getXXX(key)方法獲取數(shù)據(jù)的時(shí)候,如果key不存在的活,不會(huì)出現(xiàn)報(bào)錯(cuò),會(huì)返回none。建議使用getXXX()的時(shí)候指定默認(rèn)值。
SQLite
SQLite是一個(gè)輕量級(jí)關(guān)系型數(shù)據(jù)庫,既然是關(guān)系型數(shù)據(jù)庫,那操作起來其實(shí)跟mysql、sql server差不多的。
需要注意的一點(diǎn)是,SQLite只有NULL、INTEGER、REAL(浮點(diǎn)數(shù))、TEXT(字符串)和BLOB(大數(shù)據(jù))五種類型,不存在BOOLEAN和DATE類型。
1)、創(chuàng)建數(shù)據(jù)庫
通過openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory)方法創(chuàng)建,如果庫已創(chuàng)建,則打開數(shù)據(jù)庫。
2)、創(chuàng)建表
SQLiteDatabase沒有提供創(chuàng)建表的方法,所以要靠execSQL()方法來實(shí)現(xiàn)??疵忠仓纄xecSQL()用于直接執(zhí)行sql的。
db.execSQL(sql);
增
使用SQLiteDatabase的insert(String table, String nullColumnHack, ContentValues values)方法插入數(shù)據(jù)。ContentValues 類,類似于java中的Map,以鍵值對(duì)的方式保存數(shù)據(jù)。
ContentValues values=new ContentValues(); values.put("name", "liangjh"); values.put("password", "123456"); db.insert("t_user", "id", values);
刪
刪除數(shù)據(jù)就比較直接了。使用SQLiteDatabase的delete(String table, String whereClause, String[] whereArgs)實(shí)現(xiàn)。如果不想把參數(shù)寫在whereArgs里面,可以直接把條件寫在whereClause里面。
// 方式1 直接將條件寫入到條件里面(個(gè)人覺得容易被注入,但其實(shí)數(shù)據(jù)都在客戶端,沒啥安全性可言) db.delete("t_user", "id=1", null); // 方式2 條件分開寫,感覺比較安全 db.delete("t_user", "name=? and password =?", new String[]{"weiyg","112233"});
查
查詢有2個(gè)方法,query()和rawQuery()兩個(gè)方法,區(qū)別在于query()是將sql里面的各參數(shù)提取出query()對(duì)應(yīng)的參數(shù)中??蓞⒖枷旅胬?。
// 使用rawQuery // Cursor c = db.rawQuery("select * from t_user", null); // db.rawQuery("select * from t_user where id=1", null); // db.rawQuery("select * from t_user where id=?", new String[]{"1"}); // 使用query() Cursor c = db.query("t_user", new String[]{"id","name"}, "name=?", new String[]{"weiyg"}, null, null, null); c.moveToFirst(); while(!c.isAfterLast()){ String msg=""; for(int i=0,j=c.getColumnCount();i<j;i++){ msg+="--"+c.getString(i); } Log.v("SQLite", "data:"+msg); c.moveToNext(); }
改
使用SQLiteDatabase的update(String table, ContentValues values, String whereClause, String[] whereArgs)可以修改數(shù)據(jù)。whereClause和whereArgs用于設(shè)置其條件。ContentValues對(duì)象為數(shù)據(jù)。
ContentValues values=new ContentValues(); values.put("password", "111111"); // 方式1 條件寫在字符串內(nèi) db.update("t_user", values, "id=1", null); // 方式2 條件和字符串分開 db.update("t_user", values, "name=? or password=?",new String[]{"weiyg","123456"});
其它
無論何時(shí),打開的數(shù)據(jù)庫,記得關(guān)閉。
db.close()
另外使用beginTransaction()和endTransaction()可以設(shè)置事務(wù)。
File
文件儲(chǔ)存方式,很久以前講過,這里不說明。
ContentProvider
ContentProvider相對(duì)于其它的方式比較復(fù)雜,當(dāng)然其功能相對(duì)于其它的方式也是革命性的改變。它能夠?qū)崿F(xiàn)跨應(yīng)用之間的數(shù)據(jù)操作。利用ContentResolver對(duì)象的delete、update、insert、query等方法去操ContentProvider的對(duì)象,讓ContentProvider對(duì)象的方法去對(duì)數(shù)據(jù)操作。實(shí)現(xiàn)方式為:
在A程序中定義一個(gè)ContentProvider,重載其增刪查改等方法;
在A程序中的AndroidManifest.xml中注冊(cè)ContentProvider;
在B程序中通過ContentResolver和Uri來獲取ContentProvider的數(shù)據(jù),同樣利用Resolver的增刪查改方法來獲得和處理數(shù)據(jù)。
1)、在A程序定義一個(gè)Provider
新建一個(gè)類,繼承ContentProvider,并重載其delete()、insert()、query()、update()、getType()、onCreate()方法。譬如下面的例子,重載其onCreate和query方法。
public class MyProvider extends ContentProvider { @Override public int delete(Uri uri, String selection, String[] selectionArgs) { // TODO Auto-generated method stub return 0; } @Override public String getType(Uri uri) { // TODO Auto-generated method stub return null; } @Override public Uri insert(Uri uri, ContentValues values) { // TODO Auto-generated method stub return null; } @Override public boolean onCreate() { // 新建個(gè)數(shù)據(jù)庫并插入一條數(shù)據(jù) SQLiteDatabase db=this.getContext().openOrCreateDatabase("test_db2.db", Context.MODE_PRIVATE, null); db.execSQL("CREATE TABLE t_user (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL)"); ContentValues values=new ContentValues(); values.put("name", "liangjh2"); db.insert("t_user", "id", values); db.close(); return false; } @Override public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) { // 獲取數(shù)據(jù) SQLiteDatabase db=this.getContext().openOrCreateDatabase("test_db2.db", Context.MODE_PRIVATE, null); Cursor c = db.query("t_user", null, null, null, null, null, null); db.close(); return c; } @Override public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) { // TODO Auto-generated method stub return 0; } }
注冊(cè)ContentProvider
在AndroidManifest.xml中聲明ContentProvider,authorities屬性定義了ContentProvider的Uri標(biāo)識(shí)。關(guān)于Uri標(biāo)識(shí)屬另一個(gè)范疇,自行查詢。provider標(biāo)識(shí)要放在<application></application>里面。如果遇到了"Permission Denial: opening provide..."的錯(cuò)誤,可以試試在節(jié)點(diǎn)加“android:exported="true"”。
<application ...> ... <provider android:name=".MyProvider" android:authorities="com.example.androidtestdemo" android:exported="true"/> </application>
2)、在B程序獲取數(shù)據(jù)
用Context獲取到當(dāng)前的ContentResolver,根據(jù)Uri地址和ContentResolver的query方法獲取A程序的數(shù)據(jù)。Uri地址和A程序中AndroidManifest.xml定義的autorities要一致。當(dāng)然,同類可以進(jìn)行其它的操作。
Context ctx=MainActivity.this; ContentResolver resolver =ctx.getContentResolver(); Uri uri=Uri.parse("content://com.example.androidtestdemo"); Cursor c = resolver.query(uri, null, null, null, null); c.moveToFirst(); while(!c.isAfterLast()){ for(int i=0,j=c.getColumnCount();i<j;i++){ Log.v("Android2",""+c.getString(i)); } c.moveToNext(); }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助。
- android中使用SharedPreferences進(jìn)行數(shù)據(jù)存儲(chǔ)的操作方法
- Android開發(fā)筆記之: 數(shù)據(jù)存儲(chǔ)方式詳解
- 在android開發(fā)中進(jìn)行數(shù)據(jù)存儲(chǔ)與訪問的多種方式介紹
- Android使用文件進(jìn)行數(shù)據(jù)存儲(chǔ)的方法
- Android 數(shù)據(jù)存儲(chǔ)之 FileInputStream 工具類及FileInputStream類的使用
- Android 數(shù)據(jù)存儲(chǔ)方式有哪幾種
- Android編程中的5種數(shù)據(jù)存儲(chǔ)方式
- Android數(shù)據(jù)存儲(chǔ)之SQLite使用
- Android通過記住密碼功能學(xué)習(xí)數(shù)據(jù)存儲(chǔ)類SharedPreferences詳解及實(shí)例
- Android平臺(tái)中實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)的5種方式
相關(guān)文章
一文帶你深入理解Android Window系統(tǒng)
Android中的窗口系統(tǒng)是應(yīng)用程序用戶界面的核心組件之一,它負(fù)責(zé)管理可視化區(qū)域、處理用戶輸入事件以及與系統(tǒng)UI交互,本文將深入介紹與Android窗口系統(tǒng)相關(guān)的重要概念,需要的朋友可以參考下2023-10-10Ubuntu中為Android系統(tǒng)上編寫Linux內(nèi)核驅(qū)動(dòng)程序?qū)崿F(xiàn)方法
本文主要介紹在Ubuntu 上為Android系統(tǒng)編寫Linux內(nèi)核驅(qū)動(dòng)程序, 這里對(duì)編寫驅(qū)動(dòng)程序做了詳細(xì)的說明,對(duì)研究Android源碼和HAL都有巨大的幫助,有需要的小伙伴可以參考下2016-08-08Android ContentProvider實(shí)現(xiàn)手機(jī)聯(lián)系人讀取和插入
這篇文章主要為大家詳細(xì)介紹了Android ContentProvider實(shí)現(xiàn)手機(jī)聯(lián)系人讀取和插入,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05Android中RecyclerView實(shí)現(xiàn)Item添加和刪除的代碼示例
本篇文章主要介紹了Android中RecyclerView實(shí)現(xiàn)Item添加和刪除的代碼示例,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-09-09Android實(shí)現(xiàn)一個(gè)帶粘連效果的LoadingBar
Loading效果相信大家應(yīng)該都實(shí)現(xiàn)過,最近發(fā)現(xiàn)了一個(gè)不錯(cuò)的效果,決定分享給大家,所以下面這篇文章主要給大家介紹了關(guān)于利用Android實(shí)現(xiàn)一個(gè)帶粘連效果的LoadingBar的相關(guān)資料,需要的朋友可以參考借鑒,下面來一起看看吧。2017-12-12android SQLite數(shù)據(jù)庫總結(jié)
本文主要介紹了android SQLite數(shù)據(jù)庫的相關(guān)知識(shí)。具有一定的參考價(jià)值,下面跟著小編一起來看下吧2017-01-01