Android数据持久化之Preferences机制详解
作者:android小猪 发布时间:2021-09-04 23:42:32
本文实例讲述了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_READ或MODE_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程序设计有所帮助。


猜你喜欢
- 电商项目中经常有这样的需求:在商品列表页面中,切换列表的展现形式,一般分为列表形式和表格形式。如京东:本文最终实现的效果:关键词:Recyc
- Interface Segregation Principle,ISP接口隔离原则主张使用多个专门的接口比使用单一的总接口要好。一个类对另外
- Android 3.0引入了CursorLoader实现异步加载数据,为了避免同步查询数据库时阻塞UI线程的问题。在API 11之前可以通过
- 一、Java语言本身也是多线程,回顾Java创建线程方式如下:1、继承Thread类,(Thread类实现Runnable接口),来个类图加
- 有时候我们需要多列表中的数据进行特定的排序,最近项目中用到的是按名称排序,所以简单来说一下:效果图:排序方法:Collections.sor
- package 移位运算;public class 移位运算 { public static void main(String[] args
- Android动态修改ToolBar的Menu菜单效果图实现实现很简单,就是一个具有3个Action的Menu,在我们滑动到不同状态的时候,
- 获取resources文件路径背景在SpringBoot项目中,需要获取resources文件的路径,网上找了好多文章都不行,后面还是结合官
- 1. 要求获取指定文件夹下(包含子文件夹),所有指定后缀(如txt)的文件路径(即文件所在目录+文件名),返回一个字符串数组。2. 代码获取
- 本文实例为大家分享了Android实现随手指移动小球的具体代码,供大家参考,具体内容如下这个随手指移动小球,首先要使用paint画笔在can
- 1. 日志的作用日志是程序的重要组成部分,在程序报错的时候,如果我们不看日志,是很难排查出错误的,除非你真的是很有经验.所以日志最主要的作用
- 本文是Neward & Associates的总裁Ted Neward为developerworks独家撰稿“你不知道5个……”系列
- 在Activity之间传递数据还可以利用一些技巧,不管windows还是Linux操作系统,都会支持一种叫剪切板的技术,也就是某一个程序将一
- 前言定时/计划功能在Java应用的各个领域都使用得非常多,比方说Web层面,可能一个项目要定时采集话单、定时更新某些缓存、定时清理一批不活跃
- 对于QQ截图,肯定是早就有认识了,只是一直没有去认真观察这个操作的具体实现步骤。所以这里将自己的记忆中的步骤简单的写一下:习惯性用QQ或者T
- 在写程序的时候,有时候可能需要设置小数的位数,那么java中有哪几种保留小数位数的方法呢?本文以两位小数为例给出四种方法。package C
- transport请求的发送和处理过程前一篇分析对nettytransport的启动及连接,本篇主要分析transport请求的发送和处理过
- 智能指针(auto_ptr) 这个名字听起来很酷是不是?其实auto_ptr 只是C++标准库提供的一个类模板,它与传统的new/delet
- 最近在研究rabbitmq,项目中有这样一个场景:在用户要支付订单的时候,如果超过30分钟未支付,会把订单关掉。当然我们可以做一个定时任务
- Java公众号【Java技术迷】一个在互联网领先地位,微信搜索【Java技术迷】第一时间阅读最新文章,通过下面下载链接,即可获得我精心整理的