一、Android数据的存储方式:

Android系统一共提供了四种数据存储方式。分别是:SharePreference、SQLite、Content Provider和File;此外还有一种网络存储。由于Android系统中,数据基本都是私有的,都是存放于“data/data/程序包名”目录下,所以要实现数据共享,正确方式是使用Content Provider。

在Android中,可以使用几种方式实现数据持久化:

  • Shared Preferences:除SQLite数据库外,另一种常用的数据存储方式。共享参数形式,一种以Key-Value的键值对形式保存数据的方式,其本质就是一个xml文件。Android内置的,一般应用的配置信息,推荐使用此种方式保存。
  • Internal Storage:使用Android设备自带的内存存储数据。
  • External Storage:使用外部存储设备存储数据,一般是指Sdcard。
  • SQLite Databases:以SQLite数据库存储结构化的数据。SQLite是一个轻量级的数据库,支持基本SQL语法,是常被采用的一种数据存储方式。Android为此数据库提供了一个名为SQLiteDatabase的类,封装了一些操作数据库的API。
  • Network Connection:使用基于网络的服务获取数据。

二、Android的文件系统:

1、Android系统文件目录:

2、Android的应用数据存储机制:

在Android中,第三方应用及其数据,都存放在data目录下。其中,应用安装包会被存放到/data/app/目录下,每个安装包的文件名都形如:应用包名.apk,以避免重复。比如包名为com.test.sample的应用,其应用数据的目录为/data/data/com.test.sample/。对应的数据库文件存储在/data/data/com.test.sample/database/目录下,设置文件存储在/data/data/com.test.sample/shared_prefs/,自定义的应用数据文件存储在目录/data/data/com.test.sample/files/下,等等。

不仅如此,Android还会为每个应用创建一个账号,只有通过本应用的账号才有权限去运行该应用的安装包文件,读写应用数据目录下的文件(当然root权限除外),从而保证了该应用数据不会再被其他应用获取或破坏。

3、Android的文件操作:

从应用数据目录下可以看出,数据文件可以分成两类,一类是放置在扩展存储器中的文件,即/sdcard/目录下的文件,它们可以被各个应用共享;而另一类则是放在该应用数据目录下文件,它们仅能被各个应用独享,不能被其他应用读写。

三、SharedPreferences:

在所有应用程序中,都必然涉及数据的交互。有些时候,应用程序有少量的数据需要保存,并且这些数据的格式很简单。比如:软件设置、用户账户设置,用户习惯设置等,这个时候就可以用到SharedPreferences。

其实,SharedPreferences使用xml格式为Android应用提供一种永久的数据存贮方式,并且是使用键值对的方式来存储数据的。对于一个Android应用,它存贮在文件系统的/data/data/your_app_package_name/shared_prefs/目录下,可以被处在同一个应用中的所有Activity 访问。Android 提提供了相关的API来处理这些数据而不需要程序员直接操作这些文件或者考虑数据同步的问题。

因为SharedPreferences本身是一个接口,程序无法直接创建SharedPreferences的实例,只能通过Context提供的getSharedPreferences(String name,int mode)方法来获取SharedPreferences的实例:

public abstract SharedPreferences getSharedPreferences(String name,int mode)

此方法接收两个参数,第一个参数用于指定SharedPreferences文件的名称(格式为xml文件),如果指定的文件不存在则会创建一个。SharedPreferences文件都是存放在/data/data/<packagename>/shared_prefs/目录下的;第二个参数用于指定操作模式:

  • MODE_PRIVATE:默认操作模式,和直接传0效果相同,表示只有当前应用程序才可以对这个SharedPreferences文件进行读写
  • MODE_WORLD_READABLE:指定此SharedPreferences对其他程序只读且无法修改。
  • MODE_WORLD_WRITEABLE:指定此SharedPreferences能被其他程序读写。
  • MODE_MULTI_PROCESS:Android2.3之后已经弃之不用了。

得到SharedPreferences对象后,就可以向SharedPreferences文件中存储数据了,主要分为以下三步

  • 调用SharedPreferences对象的edit()方法来获取一个SharedPreferences.Editor对象
  • 向SharedPreferences.Editor对象中添加数据,比如添加一个布尔型数据就使用putBoolean方法,添加一个字符串就用putString()方法,以此类推
  • 调用commit()方法将添加的数据提交,从而完成数据存储操作

三、实例:保存编辑的短信内容:

通常情况下会发生这样的问题,我们在编辑短信的同时有电话打进来,那么接电话肯定是要启动另一个Activiy,那么当前编辑短信的Activity所编辑的信息我们想暂时保存下来,等接完电话后回到该Activity时,可以继续编辑短信。该功能需要如何去实现呢?

(1)保存数据:

首先使用SharedPreferences这个工具类:

     private EditText etMsg ;
private Button sendButton;
private SharedPreferences sp; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); etMsg = (EditText)findViewById(R.id.editText1);
sendButton = (Button)findViewById(R.id.button1); // 获取共享属性操作的工具(文件名,操作模式)
sp = This.getSharedPreferences("data", 0);
}

上方第14行代码中,调用的方法是:public SharedPreferences getSharedPreferences (String name, int mode)

其中,第一个参数代表XML文件(不要加后缀名),如果有这个文件,就会操作这个文件,如果没有这个文件,就会创建这个文件;第二个参数代表一种操作模式,0代表私有。

然后,我们要在onPause()方法里保存数据,之所以在onPause()方法里保存,是因为在所有可能会被内存销毁的生命周期函数中,而onPause()方法最先执行。代码如下:

//在onPause()方法中保存数据
@Override
protected void onPause() {
super.onPause();
String msg = etMsg.getText().toString();
Editor editor = sp.edit();
editor.putString("msg", msg); //执行方法:public abstract SharedPreferences.Editor putString (String key, String value)
editor.commit();
}

将数据保存在msg变量中,然后拿到Editor这个编辑器,给它put进去。当然,这些只是在内存中操作,如果要反映到文件当中,还要执行commit()方法。

(2)还原数据:

紧接着,我们要在onResume()方法中重新还原数据:(为什么要在这个方法中还原数据,不用我多解释)

@Override
protected void onResume() {
super.onResume();
etMsg.setText(sp.getString("msg", ""));
}

当程序中第一次启动的时候,并没有保存数据,所以返回一个默认的空值。将这个返回的数据放到etMsg控件中就行了。

现在我们运行程序,是可以执行的。

例如,现在编辑内容,然后去别的程序,再回来的时候(就算我们把程序退出了),编辑的内容还依然存在。这个时候,我们打开文件浏览器,发现数据是保存在/data/data/<packagename>/shared_prefs/目录的data.xml文件当中的,而且是永久保存;所以,当在onResume()方法还原数据之后,我们还要加一部分代码,来删掉这个文件里的内容(无法删除文件本身),不然就会永久保存本地成为垃圾了。代码如下:

protected void onResume() {
super.onResume();
etMsg.setText(sp.getString("msg", ""));
Editor editor = sp.edit();
editor.clear();
editor.commit();

}

总结之后,最终的完整版代码如下:

activity_main.xml文件代码:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context=".MainActivity" >
<EditText
android:id="@+id/editText1"
android:layout_width="match_parent"
android:layout_height="0dp"
android:gravity="top"
android:layout_weight="1"
android:ems="10" />
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Button" />
</LinearLayout>

MainActivity.java的代码如下:

 package com.example.smyh001;
import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.os.Bundle;
import android.view.Menu;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends Activity {
private EditText etMsg ;
private Button sendButton;
private SharedPreferences sp; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); etMsg = (EditText)findViewById(R.id.editText1);
sendButton = (Button)findViewById(R.id.button1); // 获取共享属性操作的工具
sp = getSharedPreferences("data", 0);
}
//在onPause()方法中保存数据
@Override
protected void onPause() {
super.onPause();
String msg = etMsg.getText().toString();
Editor editor = sp.edit();
editor.putString("msg", msg);//执行方法:public abstract SharedPreferences.Editor putString (String key, String value)
editor.commit();
} //在onResume()方法中还原数据
@Override
protected void onResume() {
super.onResume();
etMsg.setText(sp.getString("msg", ""));
Editor editor = sp.edit();
editor.clear();
editor.commit();
}
}

运行程序之后,我们在编辑框输入一些文字:

退出程序,然后导出data.xml文件,打开后显示如下:

说明输入的文本被保存在了data.xml文件当中。当我们再回到程序,之前输入的文字会被保留在界面上,而data.xml文件中的文本则会被清空。

代码优化:

上方代码中如果我们在第40行代码的后面加下面这一行代码:

etMsg.setSelection((sp.getString("msg", "")).length());

当返回到原程序时,setSelection方法可将输入光标移动到文本的末尾位置以便继续输入。里面的参数sp.getString("msg", "")是之前所输入的字符串。

四、实例:实现记住密码的功能

暂略。


五、PreferenceActivity类的使用:

后面的章节会讲到。

Android数据存储(一)----SharedPreferences详解的更多相关文章

  1. Android数据存储-通过SharedPreferences实现记住密码的操作

    在Android中登陆中,为了实现用户的方便,往往需要根据用户的需要进行记住密码的操作,所以,在Android数据存储中SharedPreferences恰恰可以实现这一点 下面,小编将带领大家通过S ...

  2. Android数据存储方式--SharedPreferences

    Android数据存储方式有如下四种:SharedPreferences.存储到文件.SQLite数据库.内容提供者(Content provider).存储到网络服务器. 本文主要介绍一下Share ...

  3. Android 数据存储之 SharedPreferences储存

    ------------------------------------------SharedPreferences存储--------------------------------------- ...

  4. Android数据存储三剑客——SharedPreferences、File、SQLite

    Android中常用的数据存储一般有三种方式:SharedPreferences.文件和SQLite数据库,用来保存需要长时间保存的数据.本文将通过几个具体的小实例来讲解这三种方式的具体实现. 数据存 ...

  5. Android开发数据存储之ContentProvider详解

    转载:十二.ContentProvider和Uri详解 一.使用ContentProvider(内容提供者)共享数据 ContentProvider在android中的作用是对外共享数据,也就是说你可 ...

  6. Android数据存储之SharedPreferences及如何安全存储

    前言: 最近一直在学习ios的数据存储,当学习到NSUserDefaults的时候让我回想起了SharedPreferences,今天闲来无事,想着总结一下SharedPreferences的使用. ...

  7. Android数据存储之SharedPreferences存储

    安卓系统为应用提供了系统级的配置存储方案,它就是靠SharedPreferences接口来实现的,该接口存储的所有信息都是以名值对的形式保存,但其保存的数据类型也仅限于基本数据类型,如字符串.整形.布 ...

  8. android数据存储之SharedPreferences

    一.SharedPreferences简介      (1)SharedPreferences是Android平台上一个轻量级的存储类,用来保存应用的一些常用配置,比如Activity状态,Activ ...

  9. Android数据存储之SharedPreferences使用

    SharedPreferences是Android中一种轻型的数据存储类.本质上是基于XML文件进行存储Key-Value键值对的数据,生成的XML文件的目录在/data/data/包名/Shared ...

  10. Android数据存储之sharedpreferences与Content Provider

    android中对数据操作包含有: file, sqlite3, Preferences, ContectResolver与ContentProvider前三种数据操作方式都只是针对本应用内数据,程序 ...

随机推荐

  1. js文件被浏览器缓存的思考

        我们的用户量大,修改js文件后,用户反馈登录出现问题.实际上刷新一下就没事了.就是因为用户的浏览器使用的还是本地缓存的js代码.   强制刷新一般就会重新去服务器获取新的js代码.但不能让用户 ...

  2. 【iOS】通知监听

    下例为:监听文本框  accountField  内容的改变, 当发生改变时, 调用textChange方法(多次).监听结束需要移除通知. - (void)viewDidLoad { [super ...

  3. Linux初学者指南

    1.为啥我们要学习Linux? 我们干嘛要学习Linux? Linux能给我们带来什么价值呢? Linux给我的感觉就是稳定,免费,性能好. 稳定,体现在哪里?我们使用PC机,安装的操作系统一般是wi ...

  4. SAP ST05数据跟踪使用

    有时我们想知道SAP操作,对数据库中的那些表进行的增删查改. 可以使用ST05跟踪SQL语句. ST05功能界面如下: 1---激活跟踪 2---结束跟踪 3---显示跟踪结果. 如果想跟踪SQL语句 ...

  5. spring和mybatis整合配置

    <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...

  6. 蓝牙防丢器原理、实现与Android BLE接口编程

    本文是对已实现的蓝牙防丢器项目的总结,阐述蓝牙防丢器的原理.实现与android客户端的蓝牙BLE接口编程.在这里重点关注如何利用BLE接口来进行工程实现,对于BLE的协议.涉及到JNI的BLE接口内 ...

  7. java网络---再论URL & URI

    关于URL 和URI的关系,在本系列的第二篇:java网络---基本web概念 中已经简述了. 这里重复一点,就是URI包含URL,或者说URI是父类,URL就是子类的概念. 本篇再来详述这2个概念. ...

  8. linux64位操作系统装32位jdk解决方法

    /opt/tomcat/tomcat7.0/bin/catalina.sh: /usr/local/java/jdk1.7.0_79/bin/java: /lib/ld-linux.so.2: bad ...

  9. vi, vim 基本使用(1)

    本文介绍了vi (vim)的基本使用方法,但对于普通用户来说基本上够了!vi 编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一下它的用法和 ...

  10. openswitch db files

    http://openvswitch.org/support/dist-docs/ovsdb-tool.1.html FILES The default db is /etc/openvswitch/ ...