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

Android數(shù)據(jù)持久化之Preferences機(jī)制詳解

 更新時(shí)間:2017年05月02日 11:48:48   作者:android小豬  
這篇文章主要介紹了Android數(shù)據(jù)持久化之Preferences機(jī)制,較為詳細(xì)的分析了Android數(shù)據(jù)持久化的概念、Preferences機(jī)制的原理與相關(guān)實(shí)現(xiàn)、使用技巧,需要的朋友可以參考下

本文實(shí)例講述了Android數(shù)據(jù)持久化之Preferences機(jī)制。分享給大家供大家參考,具體如下:

在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_READMODE_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ì)有所幫助。

相關(guān)文章

  • Flutter Android應(yīng)用啟動(dòng)白屏的解決方案

    Flutter Android應(yīng)用啟動(dòng)白屏的解決方案

    任何一個(gè)app基本都會(huì)設(shè)計(jì)一個(gè)啟動(dòng)頁,今天我們就來看看怎么在flutter項(xiàng)目中設(shè)置啟動(dòng)頁,這篇文章主要給大家介紹了關(guān)于Flutter Android應(yīng)用啟動(dòng)白屏解決的相關(guān)資料,需要的朋友可以參考下
    2021-11-11
  • Flutter項(xiàng)目在 iOS14 啟動(dòng)崩潰的解決方法

    Flutter項(xiàng)目在 iOS14 啟動(dòng)崩潰的解決方法

    這篇文章主要介紹了Flutter項(xiàng)目在 iOS14 啟動(dòng)崩潰的解決方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • Android Kotlin 實(shí)現(xiàn)底部彈框日歷組件的案例

    Android Kotlin 實(shí)現(xiàn)底部彈框日歷組件的案例

    這篇文章主要介紹了Android Kotlin 實(shí)現(xiàn)底部彈框日歷組件的案例,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2024-08-08
  • android圖像繪制(五)畫布保存為指定格式/大小的圖片

    android圖像繪制(五)畫布保存為指定格式/大小的圖片

    將圖片進(jìn)行編輯(放縮,涂鴉等),最后保存成指定格式、大小的圖片,接下來將介紹保存方法,感興趣的朋友可以了解下啊
    2013-01-01
  • android 開發(fā) 文件讀寫應(yīng)用案例分析

    android 開發(fā) 文件讀寫應(yīng)用案例分析

    在Android應(yīng)用中保存文件會(huì)使用到文件讀寫技術(shù),本文將詳細(xì)介紹,需要的朋友可以參考下
    2012-12-12
  • Android Handler多線程詳解

    Android Handler多線程詳解

    本文主要介紹Android Handler的知識(shí),這里整理了詳細(xì)的資料及簡單示例代碼和實(shí)現(xiàn)效果圖,有興趣的小伙伴可以參考下
    2016-09-09
  • Kotlin四大組件中的broadcast廣播

    Kotlin四大組件中的broadcast廣播

    Android開發(fā)的四大組件分別是:活動(dòng)(activity),用于表現(xiàn)功能;服務(wù)(service),后臺(tái)運(yùn)行服務(wù),不提供界面呈現(xiàn);廣播接受者(Broadcast Receive),勇于接收廣播;內(nèi)容提供者(Content Provider),支持多個(gè)應(yīng)用中存儲(chǔ)和讀取數(shù)據(jù),相當(dāng)于數(shù)據(jù)庫,本篇著重介紹廣播組件
    2022-12-12
  • Android底部菜單簡單應(yīng)用

    Android底部菜單簡單應(yīng)用

    這篇文章主要為大家詳細(xì)介紹了Android底部菜單簡單應(yīng)用,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • Flutter中網(wǎng)絡(luò)圖片加載和緩存的實(shí)現(xiàn)

    Flutter中網(wǎng)絡(luò)圖片加載和緩存的實(shí)現(xiàn)

    這篇文章主要介紹了Flutter中網(wǎng)絡(luò)圖片加載和緩存的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • Android利用Dom對(duì)XML進(jìn)行增刪改查操作詳解

    Android利用Dom對(duì)XML進(jìn)行增刪改查操作詳解

    使用DOM進(jìn)行增刪改查,這個(gè)是DOM的優(yōu)勢所在,其實(shí)代碼很簡單,不需要過多的解釋,下面這篇文章主要給大家介紹了關(guān)于Android利用Dom對(duì)XML進(jìn)行增刪改查操作的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下。
    2018-01-01

最新評(píng)論

汾西县| 黄冈市| 乐昌市| 开封县| 资兴市| 白水县| 靖州| 乡宁县| 佛冈县| 宝鸡市| 任丘市| 绥芬河市| 荔浦县| 无棣县| 城固县| 阿荣旗| 阳泉市| 襄垣县| 巍山| 德阳市| 来安县| 巴东县| 郴州市| 惠来县| 桓台县| 扎兰屯市| 隆回县| 新干县| 东乌珠穆沁旗| 荥经县| 修水县| 上虞市| 敖汉旗| 红安县| 玉屏| 隆德县| 东兰县| 霸州市| 太仓市| 湘潭市| 大关县|