最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

四種Android數據存儲方式

 更新時間:2016年03月07日 15:06:54   作者:Ron Ngai  
這篇文章主要為大家詳細介紹了四種Android數據存儲方式,感興趣的小伙伴們可以參考一下

Android提供以下四種存儲方式

  • SharePreference
  • SQLite
  • File
  • ContentProvider

Android系統(tǒng)中數據基本都是私有的,一般存放在“data/data/程序包名”目錄下。如果要實現數據共享,正確的方式是使用ContentProvider。 

SharedPreference
SharedPreference是一種輕型的數據存儲方式,實際上是基于XML文件存儲的“key-value”鍵值對數據。通常用來存儲程序的一些配置信息。其存儲在“data/data/程序包名/shared_prefs目錄下。
SharedPreference本身只能獲取數據,不支持存儲和修改。存儲和修改要通過Editor對象來實現。 

1)、修改和存儲數據

  1. 根據Context的getSharedPrerences(key, [模式])方法獲取SharedPreference對象;
  2. 利用SharedPreference的editor()方法獲取Editor對象;
  3. 通過Editor的putXXX()方法,將鍵值對存儲數據;
  4. 通過Editor的commit()方法將數據提交到SharedPreference內。

綜合例子:   

//設置單例里面的數值,然后再將數值寫入到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)、獲取數據

  1. 同樣根據Context對象獲取SharedPreference對象;
  2. 直接使用SharedPreference的getXXX(key)方法獲取數據。 

綜合例子:  

 //從單例里面找,如果不存在則在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, [模式])方法中,第一個參數其實對應到XML的文件名,相同key的數據會保存到同一個文件下。
使用SharedPreference的getXXX(key)方法獲取數據的時候,如果key不存在的活,不會出現報錯,會返回none。建議使用getXXX()的時候指定默認值。

SQLite
SQLite是一個輕量級關系型數據庫,既然是關系型數據庫,那操作起來其實跟mysql、sql server差不多的。
需要注意的一點是,SQLite只有NULL、INTEGER、REAL(浮點數)、TEXT(字符串)和BLOB(大數據)五種類型,不存在BOOLEAN和DATE類型。 

1)、創(chuàng)建數據庫
通過openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory)方法創(chuàng)建,如果庫已創(chuàng)建,則打開數據庫。

復制代碼 代碼如下:
SQLiteDatabase db =this.openOrCreateDatabase("test_db.db", Context.MODE_PRIVATE, null);

2)、創(chuàng)建表
SQLiteDatabase沒有提供創(chuàng)建表的方法,所以要靠execSQL()方法來實現??疵忠仓纄xecSQL()用于直接執(zhí)行sql的。
復制代碼 代碼如下:
String sql="create table t_user (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL,password TEXT NOT NULL)";
db.execSQL(sql);
 


使用SQLiteDatabase的insert(String table, String nullColumnHack, ContentValues values)方法插入數據。ContentValues 類,類似于java中的Map,以鍵值對的方式保存數據。

ContentValues values=new ContentValues();
values.put("name", "liangjh");
values.put("password", "123456");
db.insert("t_user", "id", values);


刪除數據就比較直接了。使用SQLiteDatabase的delete(String table, String whereClause, String[] whereArgs)實現。如果不想把參數寫在whereArgs里面,可以直接把條件寫在whereClause里面。

// 方式1 直接將條件寫入到條件里面(個人覺得容易被注入,但其實數據都在客戶端,沒啥安全性可言)
db.delete("t_user", "id=1", null);
// 方式2 條件分開寫,感覺比較安全
db.delete("t_user", "name=? and password =?", new String[]{"weiyg","112233"});


        查詢有2個方法,query()和rawQuery()兩個方法,區(qū)別在于query()是將sql里面的各參數提取出query()對應的參數中??蓞⒖枷旅胬?。

// 使用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)可以修改數據。whereClause和whereArgs用于設置其條件。ContentValues對象為數據。

ContentValues values=new ContentValues();
values.put("password", "111111");
// 方式1 條件寫在字符串內
db.update("t_user", values, "id=1", null);
// 方式2 條件和字符串分開
db.update("t_user", values, "name=? or password=?",new String[]{"weiyg","123456"});

其它
無論何時,打開的數據庫,記得關閉。

db.close()
另外使用beginTransaction()和endTransaction()可以設置事務。 

File
        文件儲存方式,很久以前講過,這里不說明。

ContentProvider
ContentProvider相對于其它的方式比較復雜,當然其功能相對于其它的方式也是革命性的改變。它能夠實現跨應用之間的數據操作。利用ContentResolver對象的delete、update、insert、query等方法去操ContentProvider的對象,讓ContentProvider對象的方法去對數據操作。實現方式為:

在A程序中定義一個ContentProvider,重載其增刪查改等方法;
在A程序中的AndroidManifest.xml中注冊ContentProvider;
在B程序中通過ContentResolver和Uri來獲取ContentProvider的數據,同樣利用Resolver的增刪查改方法來獲得和處理數據。
1)、在A程序定義一個Provider
新建一個類,繼承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() {
  // 新建個數據庫并插入一條數據
  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) {
  // 獲取數據
  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;
 }

}

注冊ContentProvider
在AndroidManifest.xml中聲明ContentProvider,authorities屬性定義了ContentProvider的Uri標識。關于Uri標識屬另一個范疇,自行查詢。provider標識要放在<application></application>里面。如果遇到了"Permission Denial: opening provide..."的錯誤,可以試試在節(jié)點加“android:exported="true"”。

<application ...>
 ...
 <provider android:name=".MyProvider" android:authorities="com.example.androidtestdemo" android:exported="true"/>
</application>

2)、在B程序獲取數據
用Context獲取到當前的ContentResolver,根據Uri地址和ContentResolver的query方法獲取A程序的數據。Uri地址和A程序中AndroidManifest.xml定義的autorities要一致。當然,同類可以進行其它的操作。

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();
}

以上就是本文的全部內容,希望對大家的學習有所幫助。

相關文章

  • Android實現圖片異步請求加三級緩存

    Android實現圖片異步請求加三級緩存

    這篇文章主要向大家詳細介紹了Android實現圖片異步請求加三級緩存的相關資料,需要的朋友可以參考下
    2016-02-02
  • Android自定義圖片輪播Banner控件使用解析

    Android自定義圖片輪播Banner控件使用解析

    這篇文章主要為大家詳細介紹了Android自定義圖片輪播Banner控件的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • Android開發(fā)實現TextView顯示豐富的文本

    Android開發(fā)實現TextView顯示豐富的文本

    這篇文章主要介紹了Android開發(fā)實現TextView顯示豐富的文本,涉及Android中TextView的使用技巧,需要的朋友可以參考下
    2015-12-12
  • android使用surfaceview+MediaPlayer播放視頻

    android使用surfaceview+MediaPlayer播放視頻

    這篇文章主要為大家詳細介紹了android使用surfaceview+MediaPlayer播放視頻,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • Android開發(fā)環(huán)境搭建過程圖文詳解

    Android開發(fā)環(huán)境搭建過程圖文詳解

    這篇文章主要介紹了Android開發(fā)環(huán)境搭建過程圖文詳解,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • Android 8.0如何完美適配全局dialog懸浮窗彈出

    Android 8.0如何完美適配全局dialog懸浮窗彈出

    這篇文章主要給大家介紹了關于Android 8.0如何完美適配全局dialog懸浮窗彈出的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起看看吧
    2018-07-07
  • Android超詳細講解組件AdapterView的使用

    Android超詳細講解組件AdapterView的使用

    AdapterView組件是一組重要的組件,AdapterView本身是一個抽象基類,它派生的子類在用法上十分相似,從AdapterView派生出的三個子類:AdsListView、AdsSpinner、AdapterViewAnimator,這3個子類依然是抽象的,實際運用時需要它們的子類
    2022-03-03
  • Android開發(fā)之拼音轉換工具類PinyinUtils示例

    Android開發(fā)之拼音轉換工具類PinyinUtils示例

    這篇文章主要介紹了Android開發(fā)之拼音轉換工具類PinyinUtils,涉及Android基于pinyin4j-2.5.0.jar包文件實現漢字轉拼音功能的相關操作技巧,需要的朋友可以參考下
    2017-11-11
  • android開發(fā)中ListView與Adapter使用要點介紹

    android開發(fā)中ListView與Adapter使用要點介紹

    項目用到ListView,由于要用到 ImageView ,圖片源不是在資源里面的,沒法使用資源 ID,因此無法直接使用SimpleAdapter,要自己寫一個Adapter。 在使用ListView和Adapter需要注意以下幾點
    2013-06-06
  • Android Studio配置Kotlin開發(fā)環(huán)境詳細步驟

    Android Studio配置Kotlin開發(fā)環(huán)境詳細步驟

    這篇文章主要介紹了Android Studio配置Kotlin開發(fā)環(huán)境詳細步驟的相關資料,需要的朋友可以參考下
    2017-05-05

最新評論

安阳县| 肇东市| 新巴尔虎右旗| 尼木县| 东莞市| 宜兰市| 顺平县| 汉源县| 高碑店市| 白朗县| 康保县| 南和县| 新巴尔虎右旗| 措勤县| 府谷县| 和政县| 双流县| 双流县| 拉孜县| 和田市| 上高县| 新巴尔虎左旗| 泸溪县| 沐川县| 天镇县| 梅州市| 明水县| 玛曲县| 奉新县| 博罗县| 卓尼县| 大连市| 巨野县| 佛教| 华容县| 花莲县| 抚顺市| 鄂州市| 无棣县| 曲周县| 教育|