欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android数据持久化之Preferences机制详解

程序员文章站 2023-08-15 10:11:33
本文实例讲述了android数据持久化之preferences机制。分享给大家供大家参考,具体如下: 在android中,实现数据持久化有五种方式:preferences...

本文实例讲述了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程序设计有所帮助。