亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > Android > 正文

四種Android數據存儲方式

2020-01-02 07:01:44
字體:
來源:轉載
供稿:網友

Android提供以下四種存儲方式

  • SharePreference
  • SQLite
  • File
  • ContentProvider

Android系統中數據基本都是私有的,一般存放在“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)、創建數據庫
通過openOrCreateDatabase(String path, SQLiteDatabase.CursorFactory factory)方法創建,如果庫已創建,則打開數據庫。

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

2)、創建表
SQLiteDatabase沒有提供創建表的方法,所以要靠execSQL()方法來實現??疵忠仓纄xecSQL()用于直接執行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()兩個方法,區別在于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..."的錯誤,可以試試在節點加“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();}

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩亚洲国产中文字幕| 久久精品成人欧美大片| 91免费人成网站在线观看18| 亚洲理论在线a中文字幕| 国产精品日韩欧美综合| 成人精品久久一区二区三区| 欧美精品videossex88| 最近2019中文字幕第三页视频| 久久综合久中文字幕青草| 国产成人精品久久亚洲高清不卡| 大荫蒂欧美视频另类xxxx| 亚洲天堂日韩电影| 在线视频免费一区二区| 国产69精品久久久久99| 国产精品美乳一区二区免费| 中文字幕日韩在线视频| 精品国产一区二区三区久久狼5月| 日韩在线免费观看视频| 91九色综合久久| 欧美黄网免费在线观看| 伊人久久免费视频| 正在播放欧美一区| 国产狼人综合免费视频| 欧美成人免费视频| 亚洲视频一区二区三区| 亚洲欧美资源在线| 九九热精品视频在线播放| 精品中文字幕在线2019| 国产91色在线播放| 中文国产亚洲喷潮| 在线观看精品国产视频| 亚洲最新av在线网站| www国产亚洲精品久久网站| 中文字幕久久亚洲| 欧美与欧洲交xxxx免费观看| 亚洲福利在线播放| 亚洲一区二区中文字幕| 国产精品美女无圣光视频| 欧美成年人视频网站| 国产精品福利在线观看| 亚洲毛片在线免费观看| 国产日韩av在线| 欧美激情极品视频| 欧美日韩中文字幕日韩欧美| 日韩欧美成人区| 欧美疯狂性受xxxxx另类| 欧美成人免费在线视频| 国产欧美欧洲在线观看| 国产精品人成电影| 国产精品一区二区久久久| 欧美日本高清一区| 日韩欧美在线视频| 97精品在线观看| 欧美性色视频在线| 国产欧美精品一区二区三区介绍| 欧美俄罗斯性视频| 国产精品老牛影院在线观看| 国产精品久久久久久久久久久久久| 久久久久久成人| 日韩高清免费观看| 日韩在线观看网站| 亚洲国产精品女人久久久| 日韩精品在线观看网站| 欧美日韩免费看| 欧美孕妇孕交黑巨大网站| 91精品国产自产在线| 亚洲毛片在线观看.| 久久久国产视频91| 国产在线观看精品| 亚洲欧美在线免费观看| 久久精品一本久久99精品| 亚洲欧美制服丝袜| 一区二区三区视频观看| 久久久久久久一| 91国内揄拍国内精品对白| 久久国产加勒比精品无码| 精品国产鲁一鲁一区二区张丽| 欧美成人精品不卡视频在线观看| 成人h片在线播放免费网站| 色yeye香蕉凹凸一区二区av| 日韩在线视频网| www.久久久久久.com| 日韩黄色高清视频| 黑人极品videos精品欧美裸| 欧美视频免费在线观看| 啪一啪鲁一鲁2019在线视频| 亚洲男人7777| 日韩精品在线私人| 97人洗澡人人免费公开视频碰碰碰| 久久久国产一区| 色视频www在线播放国产成人| 国产精品看片资源| 国内精品一区二区三区四区| 国产精品视频网址| 国产日本欧美在线观看| 久久91精品国产| 91探花福利精品国产自产在线| www.午夜精品| 亚洲精品美女网站| 亚洲国产精品人久久电影| 国产色综合天天综合网| 中文字幕亚洲天堂| 亚州欧美日韩中文视频| 欧美在线激情视频| 欧美国产一区二区三区| 中文字幕日韩欧美| 最好看的2019的中文字幕视频| 亚洲黄色av网站| 欧美电影免费播放| 精品久久久精品| 欧美人与性动交a欧美精品| 亚洲日本欧美日韩高观看| 久久全国免费视频| 国产精品美女在线观看| 亚洲一区二区久久久久久久| 欧美精品久久久久久久久| 国产午夜精品全部视频播放| 欧美人交a欧美精品| 日韩电影免费观看在线| 久久天天躁日日躁| 国产精品成人观看视频国产奇米| 亚洲在线免费视频| 国产精品麻豆va在线播放| 91社影院在线观看| 日韩精品视频在线观看网址| 国产亚洲欧美另类中文| 91精品国产91久久久久| 久久躁狠狠躁夜夜爽| 色婷婷亚洲mv天堂mv在影片| 日韩精品在线电影| 91在线观看免费高清| 日韩av中文在线| 91视频国产一区| 国产精品色悠悠| 亚洲色图国产精品| 国产美女被下药99| 国产精品成人国产乱一区| 国产女人18毛片水18精品| 最近2019好看的中文字幕免费| 亚洲国内精品视频| 亚洲人高潮女人毛茸茸| 国产视频在线一区二区| 久久韩剧网电视剧| 久久久久久美女| 国产精品高精视频免费| 亚洲欧美制服综合另类| 奇米4444一区二区三区| 日韩在线观看视频免费| 中文字幕国产精品| 久久久噜噜噜久噜久久| 午夜精品久久17c| 欧美亚洲一区在线| 久久99精品国产99久久6尤物| 91在线网站视频| 日韩亚洲欧美中文在线| 亚洲成人久久久久| 91超碰caoporn97人人| 中文字幕亚洲专区| 2019中文在线观看| 日韩视频在线一区| 在线观看91久久久久久| 精品美女永久免费视频| www.久久撸.com| 欧美日本在线视频中文字字幕|