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

 更新时间:2017年05月02日 11:48:48   作者:android小猪  
这篇文章主要介绍了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程序设计有所帮助。

相关文章

  • Flutter Android应用启动白屏的解决方案

    Flutter Android应用启动白屏的解决方案

    任何一个app基本都会设计一个启动页,今天我们就来看看怎么在flutter项目中设置启动页,这篇文章主要给大家介绍了关于Flutter Android应用启动白屏解决的相关资料,需要的朋友可以参考下
    2021-11-11
  • Flutter项目在 iOS14 启动崩溃的解决方法

    Flutter项目在 iOS14 启动崩溃的解决方法

    这篇文章主要介绍了Flutter项目在 iOS14 启动崩溃的解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • Android Kotlin 实现底部弹框日历组件的案例

    Android Kotlin 实现底部弹框日历组件的案例

    这篇文章主要介绍了Android Kotlin 实现底部弹框日历组件的案例,本文通过实例代码给大家介绍的非常详细,对大家大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2024-08-08
  • android图像绘制(五)画布保存为指定格式/大小的图片

    android图像绘制(五)画布保存为指定格式/大小的图片

    将图片进行编辑(放缩,涂鸦等),最后保存成指定格式、大小的图片,接下来将介绍保存方法,感兴趣的朋友可以了解下啊
    2013-01-01
  • android 开发 文件读写应用案例分析

    android 开发 文件读写应用案例分析

    在Android应用中保存文件会使用到文件读写技术,本文将详细介绍,需要的朋友可以参考下
    2012-12-12
  • Android Handler多线程详解

    Android Handler多线程详解

    本文主要介绍Android Handler的知识,这里整理了详细的资料及简单示例代码和实现效果图,有兴趣的小伙伴可以参考下
    2016-09-09
  • Kotlin四大组件中的broadcast广播

    Kotlin四大组件中的broadcast广播

    Android开发的四大组件分别是:活动(activity),用于表现功能;服务(service),后台运行服务,不提供界面呈现;广播接受者(Broadcast Receive),勇于接收广播;内容提供者(Content Provider),支持多个应用中存储和读取数据,相当于数据库,本篇着重介绍广播组件
    2022-12-12
  • Android底部菜单简单应用

    Android底部菜单简单应用

    这篇文章主要为大家详细介绍了Android底部菜单简单应用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-02-02
  • Flutter中网络图片加载和缓存的实现

    Flutter中网络图片加载和缓存的实现

    这篇文章主要介绍了Flutter中网络图片加载和缓存的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • Android利用Dom对XML进行增删改查操作详解

    Android利用Dom对XML进行增删改查操作详解

    使用DOM进行增删改查,这个是DOM的优势所在,其实代码很简单,不需要过多的解释,下面这篇文章主要给大家介绍了关于Android利用Dom对XML进行增删改查操作的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考下。
    2018-01-01

最新评论