本文實(shí)例講述了Android數(shù)據(jù)持久化之Preferences機(jī)制。分享給大家供大家參考,具體如下:
創(chuàng)新互聯(lián)從2013年開始,先為交口等服務(wù)建站,交口等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為交口企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
在Android中,實(shí)現(xiàn)數(shù)據(jù)持久化有五種方式:Preferences,文件File,I/O操作、SQLite數(shù)據(jù)庫,ContentProvider組件。
下面逐個(gè)做一簡單的介紹:
一、Preferences的介紹:
Preferences是一種輕量級(jí)的數(shù)據(jù)存儲(chǔ)機(jī)制,他將一些簡單的數(shù)據(jù)類型的數(shù)據(jù),包括boolean類型,int類型,float類型,long類型以及String類型的數(shù)據(jù),以鍵值對(duì)的形式存儲(chǔ)在應(yīng)用程序的私有Preferences目錄(/data/data/<包名>/shared_prefs/)中,這種Preferences機(jī)制廣泛應(yīng)用于存儲(chǔ)應(yīng)用程序中的配置信息。
如下是Preferences的一個(gè)簡單代碼:
這個(gè)代碼是創(chuàng)建不同權(quán)限的數(shù)據(jù)對(duì)象:
package com.example.data_sharedpreferences; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.content.SharedPreferences; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; public class MainActivity extends Activity { private TextView text; private Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 寫入數(shù)據(jù) writeData(); text = (TextView) findViewById(R.id.text); button = (Button) findViewById(R.id.button0); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // TODO Auto-generated method stub // 讀取數(shù)據(jù) readData(); } }); } /** * 寫入數(shù)據(jù) */ public void writeData() { // 設(shè)置權(quán)限為私有MODE_PRIVATE SharedPreferences sp_p = this.getSharedPreferences("ct_sp_private", Context.MODE_PRIVATE); // 通過SharedPreferences對(duì)象的編輯器對(duì)象Editor來實(shí)現(xiàn)存入數(shù)據(jù) SharedPreferences.Editor editor = sp_p.edit(); // 通過該編輯器函數(shù)設(shè)置鍵值 editor.putString("username", "marry_private"); // 提交數(shù)據(jù),并將數(shù)據(jù)寫入xml文件中 editor.commit(); // 設(shè)置為只讀 SharedPreferences sp_or = this.getSharedPreferences("ct_sp_private", Context.MODE_WORLD_READABLE); sp_or.edit().putString("username", "marry_only_read").commit(); // 設(shè)置為只寫 SharedPreferences sp_ow = this.getSharedPreferences("ct_sp_private", Context.MODE_WORLD_WRITEABLE); sp_ow.edit().putString("username", "marry_only_write").commit(); // 設(shè)置為可讀可寫 SharedPreferences sp_x = this.getSharedPreferences("ct_sp_private", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE); sp_x.edit().putString("username", "marry_write_read").commit(); } /** * 讀取數(shù)據(jù) * 通過SharedPreferences對(duì)象的鍵key可以獲取到對(duì)應(yīng)key的鍵值value。對(duì)于不同類型的鍵值有不同的函數(shù):getBoolean * ,getInt,getFloat,getLong. */ public void readData() { // TODO Auto-generated method stub text.setText("private_username:" + this.getSharedPreferences("ct_cp_private", 0).getString( "username", "marry_private") + "\r\n" + "read_username:" + this.getSharedPreferences("ct_cp_private", 0).getString( "username", "marry_only_read") + "\r\n" + "write_username:" + this.getSharedPreferences("ct_cp_private", 0).getString( "username", "marry_only_write") + "\r\n" + "write_read_username:" + this.getSharedPreferences("ct_cp_private", 0).getString( "username", "marry_write_read") + "\r\n"); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
下面這個(gè)代碼則是實(shí)現(xiàn)在另外一個(gè)應(yīng)用中訪問上一個(gè)應(yīng)用,并讀取上面應(yīng)用的數(shù)據(jù):
package com.example.data_sharedpreferences2; import com.example.data_sharedpreferences2.R; import android.os.Bundle; import android.app.Activity; import android.content.Context; import android.content.pm.PackageManager.NameNotFoundException; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; import android.widget.TextView; /** * 該程序的功能是訪問data_sharedpreferences應(yīng)用 Sharedpreferences訪問另一個(gè)應(yīng)用的條件: * 1、被訪問的應(yīng)用權(quán)限為可讀或者可寫 2、必須要知道被訪問應(yīng)用的包名 * * @author marry * */ public class MainActivity extends Activity { private TextView text; private Button button; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); text = (TextView) findViewById(R.id.text); button = (Button) findViewById(R.id.button0); button.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 訪問應(yīng)用1,并讀取應(yīng)用1的數(shù)據(jù) try { // 獲得要訪問應(yīng)用的context Context ortherContext = createPackageContext( "com.example.data_sharedpreferences", 0); // 通過ortherContext.getSharedPreferences打開應(yīng)用1的文件 text.setText("private_username:" + ortherContext.getSharedPreferences( "ct_cp_private", 0).getString("username", "marry_private") + "\r\n" + "read_username:" + ortherContext.getSharedPreferences( "ct_cp_private", 0).getString("username", "marry_only_read") + "\r\n" + "write_username:" + ortherContext.getSharedPreferences( "ct_cp_private", 0).getString("username", "marry_only_write") + "\r\n" + "write_read_username:" + ortherContext.getSharedPreferences( "ct_cp_private", 0).getString("username", "marry_write_read") + "\r\n"); } catch (NameNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.main, menu); return true; } }
使用Preferences時(shí)有以下需要注意的地方:
1、 通過Context.getSharedPreferences(String fileName,int mode)
方法,可以打開一個(gè)xml文件,文件的位置在/data/data/package_name/shared_prefs/fileName.xml,如果不存在,則會(huì)自動(dòng)創(chuàng)建。可以對(duì)該文件進(jìn)行讀寫操作,在應(yīng)用內(nèi)的各組件之間共享數(shù)據(jù)。如果將mode設(shè)置為Context.MODE_WORLD_READ或者Context.MODE_WORLD_WRITE,則還可以被其他應(yīng)用訪問到。不過這不是android推薦的方式,要實(shí)現(xiàn)跨應(yīng)用共享數(shù)據(jù),推薦的方式是用ContentProvider實(shí)現(xiàn)
2、 如果要訪問另一個(gè)應(yīng)用創(chuàng)建的shared_prefs文件,需要滿足2個(gè)條件,首先另一個(gè)應(yīng)用要設(shè)置MODE_WORLD_READ或MODE_WORLD_WIRTE權(quán)限,并且要知道另一個(gè)應(yīng)用的package_name,然后就可以通過Context.createPackageContext()
方法,就可以得到另一個(gè)應(yīng)用的context,然后context.getSharedPreferences()
方法,就可以打開shared_prefs文件了。不過這種方法并不推薦
3、 在罕見的情況下,如果既把shared_prefs的權(quán)限設(shè)置為MODE_PRIVATE,又希望某些其他的應(yīng)用可以訪問到,那么可以在manifest文件中配置android:user_id(好像是這個(gè)屬性),讓多個(gè)應(yīng)用共享USER_ID。因?yàn)楸举|(zhì)上shared_prefs文件是采用linux的權(quán)限控制的,MODE_PRIVATE類似于-rw-------,所以如果多個(gè)應(yīng)用使用了同一個(gè)USER_ID,自然都對(duì)這個(gè)文件有訪問權(quán)限了
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android數(shù)據(jù)庫操作技巧總結(jié)》、《Android編程之a(chǎn)ctivity操作技巧總結(jié)》、《Android文件操作技巧匯總》、《Android編程開發(fā)之SD卡操作方法匯總》、《Android開發(fā)入門與進(jìn)階教程》、《Android資源操作技巧匯總》、《Android視圖View技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
網(wǎng)頁名稱:Android數(shù)據(jù)持久化之Preferences機(jī)制詳解
文章URL:http://jinyejixie.com/article42/ijjhec.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開發(fā)、App開發(fā)、虛擬主機(jī)、動(dòng)態(tài)網(wǎng)站、搜索引擎優(yōu)化、定制開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)