全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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程序设计有所帮助。


# Android  # 数据持久化  # Preferences  # Android startActivityForResult实例详解  # Android在Fragment中实现监听触摸事件  # Android 使用FragmentTabhost代替Tabhost  # Android数据持久化之File机制分析  # Android 如何本地加载pdf文件  # Android利用FlexboxLayout轻松实现流动布局  # android手机端与PC端使用adb forword通信  # Android 中SwipeRefreshLayout与ViewPager滑动事件冲突解决方法  # Android 7.0行为变更 FileUriExposedException解决方法  # 设置为  # 键值  # 操作技巧  # 多个  # 要知道  # 编辑器  # 就可以  # 应用程序  # 进阶  # 是一种  # 相关内容  # 还可以  # 则是  # 其他的  # 感兴趣  # 可以通过  # 给大家  # 这不是  # 并将  # 不存在 


相关文章: 建站主机数据库如何配置才能提升网站性能?  如何快速搭建虚拟主机网站?新手必看指南  建站主机选购指南与交易推荐:核心配置解析  如何选择美橙互联多站合一建站方案?  移民网站制作流程,怎么看加拿大移民官网?  建站之星安装后如何配置SEO及设计样式?  网站制作报价单模板图片,小松挖机官方网站报价?  如何快速搭建高效可靠的建站解决方案?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  公众号网站制作网页,微信公众号怎么制作?  宝塔建站后网页无法访问如何解决?  已有域名如何快速搭建专属网站?  建站之星备案是否影响网站上线时间?  宝塔建站助手安装配置与建站模板使用全流程解析  建站三合一如何选?哪家性价比更高?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  平台云上自主建站:模板化设计与智能工具打造高效网站  如何在Golang中使用encoding/gob序列化对象_存储和传输数据  如何在建站之星网店版论坛获取技术支持?  建站之星如何快速解决建站难题?  贸易公司网站制作流程,出口贸易网站设计怎么做?  网站建设设计制作营销公司南阳,如何策划设计和建设网站?  宝塔Windows建站如何避免显示默认IIS页面?  建站主机与虚拟主机有何区别?如何选择最优方案?  建站与域名管理如何高效结合?  制作电商网页,电商供应链怎么做?  如何挑选优质建站一级代理提升网站排名?  建站主机类型有哪些?如何正确选型  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  北京专业网站制作设计师招聘,北京白云观官方网站?  英语简历制作免费网站推荐,如何将简历翻译成英文?  建站之星如何助力网站排名飙升?揭秘高效技巧  教学论文网站制作软件有哪些,写论文用什么软件 ?  专业网站设计制作公司,如何制作一个企业网站,建设网站的基本步骤有哪些?  建站之星代理商如何保障技术支持与售后服务?  如何通过智能用户系统一键生成高效建站方案?  建站ABC备案流程中有哪些关键注意事项?  网站制作需要会哪些技术,建立一个网站要花费多少?  Python文件管理规范_工程实践说明【指导】  北京企业网站设计制作公司,北京铁路集团官方网站?  巅云智能建站系统:可视化拖拽+多端适配+免费模板一键生成  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  高端企业智能建站程序:SEO优化与响应式模板定制开发  香港服务器租用费用高吗?如何避免常见误区?  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  网站制作的方法有哪些,如何将自己制作的网站发布到网上?  建站之星展会模版如何一键下载生成?  美食网站链接制作教程视频,哪个教做美食的网站比较专业点?  XML的“混合内容”是什么 怎么用DTD或XSD定义  外贸公司网站制作,外贸网站建设一般有哪些步骤? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。