中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Android數據持久化之Preferences機制詳解

發布時間:2020-09-06 16:44:56 來源:腳本之家 閱讀:289 作者:android小豬 欄目:移動開發

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

在Android中,實現數據持久化有五種方式:Preferences,文件File,I/O操作、SQLite數據庫,ContentProvider組件。

下面逐個做一簡單的介紹:

一、Preferences的介紹:

Preferences是一種輕量級的數據存儲機制,他將一些簡單的數據類型的數據,包括boolean類型,int類型,float類型,long類型以及String類型的數據,以鍵值對的形式存儲在應用程序的私有Preferences目錄(/data/data/<包名>/shared_prefs/)中,這種Preferences機制廣泛應用于存儲應用程序中的配置信息。

如下是Preferences的一個簡單代碼:

這個代碼是創建不同權限的數據對象:

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);
    // 寫入數據
    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
        // 讀取數據
        readData();
      }
    });
  }
  /**
   * 寫入數據
   */
  public void writeData() {
    // 設置權限為私有MODE_PRIVATE
    SharedPreferences sp_p = this.getSharedPreferences("ct_sp_private",
        Context.MODE_PRIVATE);
    // 通過SharedPreferences對象的編輯器對象Editor來實現存入數據
    SharedPreferences.Editor editor = sp_p.edit();
    // 通過該編輯器函數設置鍵值
    editor.putString("username", "marry_private");
    // 提交數據,并將數據寫入xml文件中
    editor.commit();
    // 設置為只讀
    SharedPreferences sp_or = this.getSharedPreferences("ct_sp_private",
        Context.MODE_WORLD_READABLE);
    sp_or.edit().putString("username", "marry_only_read").commit();
    // 設置為只寫
    SharedPreferences sp_ow = this.getSharedPreferences("ct_sp_private",
        Context.MODE_WORLD_WRITEABLE);
    sp_ow.edit().putString("username", "marry_only_write").commit();
    // 設置為可讀可寫
    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();
  }
  /**
   * 讀取數據
   * 通過SharedPreferences對象的鍵key可以獲取到對應key的鍵值value。對于不同類型的鍵值有不同的函數: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;
  }
}

下面這個代碼則是實現在另外一個應用中訪問上一個應用,并讀取上面應用的數據:

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應用 Sharedpreferences訪問另一個應用的條件:
 * 1、被訪問的應用權限為可讀或者可寫 2、必須要知道被訪問應用的包名
 *
 * @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) {
        // 訪問應用1,并讀取應用1的數據
        try {
          // 獲得要訪問應用的context
          Context ortherContext = createPackageContext(
              "com.example.data_sharedpreferences", 0);
          // 通過ortherContext.getSharedPreferences打開應用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,如果不存在,則會自動創建。可以對該文件進行讀寫操作,在應用內的各組件之間共享數據。如果將mode設置為Context.MODE_WORLD_READ或者Context.MODE_WORLD_WRITE,則還可以被其他應用訪問到。不過這不是android推薦的方式,要實現跨應用共享數據,推薦的方式是用ContentProvider實現

2、 如果要訪問另一個應用創建的shared_prefs文件,需要滿足2個條件,首先另一個應用要設置MODE_WORLD_READMODE_WORLD_WIRTE權限,并且要知道另一個應用的package_name,然后就可以通過Context.createPackageContext()方法,就可以得到另一個應用的context,然后context.getSharedPreferences()方法,就可以打開shared_prefs文件了。不過這種方法并不推薦

3、 在罕見的情況下,如果既把shared_prefs的權限設置為MODE_PRIVATE,又希望某些其他的應用可以訪問到,那么可以在manifest文件中配置android:user_id(好像是這個屬性),讓多個應用共享USER_ID。因為本質上shared_prefs文件是采用linux的權限控制的,MODE_PRIVATE類似于-rw-------,所以如果多個應用使用了同一個USER_ID,自然都對這個文件有訪問權限了

更多關于Android相關內容感興趣的讀者可查看本站專題:《Android數據庫操作技巧總結》、《Android編程之activity操作技巧總結》、《Android文件操作技巧匯總》、《Android編程開發之SD卡操作方法匯總》、《Android開發入門與進階教程》、《Android資源操作技巧匯總》、《Android視圖View技巧總結》及《Android控件用法總結》

希望本文所述對大家Android程序設計有所幫助。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

大同县| 同德县| 大竹县| 屯门区| 新乡县| 建宁县| 闸北区| 房产| 封开县| 三门县| 固阳县| 上思县| 乌拉特后旗| 抚松县| 格尔木市| 页游| 泗洪县| 宽甸| 北票市| 高台县| 阿拉善盟| 和政县| 康乐县| 拉孜县| 盐源县| 仁怀市| 大方县| 遵化市| 镇沅| 桃园县| 富顺县| 佛冈县| 常山县| 宁武县| 文化| 奉节县| 肇州县| 城固县| 姜堰市| 保德县| 延长县|