Android數(shù)據(jù)持久化之Preferences機制詳解
本文實例講述了Android數(shù)據(jù)持久化之Preferences機制。分享給大家供大家參考,具體如下:
在Android中,實現(xiàn)數(shù)據(jù)持久化有五種方式:Preferences,文件File,I/O操作、SQLite數(shù)據(jù)庫,ContentProvider組件。
下面逐個做一簡單的介紹:
一、Preferences的介紹:
Preferences是一種輕量級的數(shù)據(jù)存儲機制,他將一些簡單的數(shù)據(jù)類型的數(shù)據(jù),包括boolean類型,int類型,float類型,long類型以及String類型的數(shù)據(jù),以鍵值對的形式存儲在應(yīng)用程序的私有Preferences目錄(/data/data/<包名>/shared_prefs/)中,這種Preferences機制廣泛應(yīng)用于存儲應(yīng)用程序中的配置信息。
如下是Preferences的一個簡單代碼:
這個代碼是創(chuàng)建不同權(quán)限的數(shù)據(jù)對象:
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對象的編輯器對象Editor來實現(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對象的鍵key可以獲取到對應(yīng)key的鍵值value。對于不同類型的鍵值有不同的函數(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;
}
}
下面這個代碼則是實現(xiàn)在另外一個應(yīng)用中訪問上一個應(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訪問另一個應(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時有以下需要注意的地方:
1、 通過Context.getSharedPreferences(String fileName,int mode)方法,可以打開一個xml文件,文件的位置在/data/data/package_name/shared_prefs/fileName.xml,如果不存在,則會自動創(chuàng)建??梢詫υ撐募M行讀寫操作,在應(yīng)用內(nèi)的各組件之間共享數(shù)據(jù)。如果將mode設(shè)置為Context.MODE_WORLD_READ或者Context.MODE_WORLD_WRITE,則還可以被其他應(yīng)用訪問到。不過這不是android推薦的方式,要實現(xiàn)跨應(yīng)用共享數(shù)據(jù),推薦的方式是用ContentProvider實現(xiàn)
2、 如果要訪問另一個應(yīng)用創(chuàng)建的shared_prefs文件,需要滿足2個條件,首先另一個應(yīng)用要設(shè)置MODE_WORLD_READ或MODE_WORLD_WIRTE權(quán)限,并且要知道另一個應(yīng)用的package_name,然后就可以通過Context.createPackageContext()方法,就可以得到另一個應(yīng)用的context,然后context.getSharedPreferences()方法,就可以打開shared_prefs文件了。不過這種方法并不推薦
3、 在罕見的情況下,如果既把shared_prefs的權(quán)限設(shè)置為MODE_PRIVATE,又希望某些其他的應(yīng)用可以訪問到,那么可以在manifest文件中配置android:user_id(好像是這個屬性),讓多個應(yīng)用共享USER_ID。因為本質(zhì)上shared_prefs文件是采用linux的權(quán)限控制的,MODE_PRIVATE類似于-rw-------,所以如果多個應(yīng)用使用了同一個USER_ID,自然都對這個文件有訪問權(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ā)入門與進階教程》、《Android資源操作技巧匯總》、《Android視圖View技巧總結(jié)》及《Android控件用法總結(jié)》
希望本文所述對大家Android程序設(shè)計有所幫助。
- Android startActivityForResult實例詳解
- Android在Fragment中實現(xiàn)監(jiān)聽觸摸事件
- Android 使用FragmentTabhost代替Tabhost
- Android數(shù)據(jù)持久化之File機制分析
- Android 如何本地加載pdf文件
- Android利用FlexboxLayout輕松實現(xiàn)流動布局
- android手機端與PC端使用adb forword通信
- Android 中SwipeRefreshLayout與ViewPager滑動事件沖突解決方法
- Android 7.0行為變更 FileUriExposedException解決方法
相關(guān)文章
Flutter Android應(yīng)用啟動白屏的解決方案
任何一個app基本都會設(shè)計一個啟動頁,今天我們就來看看怎么在flutter項目中設(shè)置啟動頁,這篇文章主要給大家介紹了關(guān)于Flutter Android應(yīng)用啟動白屏解決的相關(guān)資料,需要的朋友可以參考下2021-11-11
Android Kotlin 實現(xiàn)底部彈框日歷組件的案例
這篇文章主要介紹了Android Kotlin 實現(xiàn)底部彈框日歷組件的案例,本文通過實例代碼給大家介紹的非常詳細,對大家大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2024-08-08
android 開發(fā) 文件讀寫應(yīng)用案例分析
在Android應(yīng)用中保存文件會使用到文件讀寫技術(shù),本文將詳細介紹,需要的朋友可以參考下2012-12-12
Flutter中網(wǎng)絡(luò)圖片加載和緩存的實現(xiàn)
這篇文章主要介紹了Flutter中網(wǎng)絡(luò)圖片加載和緩存的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-03-03

