Android 小项目之--数据存储【Shared Preferences】

任何一个应用程序都要依赖数据存储,而且这种存储必须不丢失数据,并且有效、简便使用和更新这些数据。在 Android 操作系统中一共提供了4种数据存储方式,但是由于存储的这些数据都是私有的,所以如果需要共享其他应用程序的数据,就需要我们上篇文章说到的 Content Provider。4种数据存储方式分别为如下:
  • 1、Shared Preferences。
    用来存储 “键-值”格式的数据。
  • 2、Files。
    通过FileInputStream和FileOutputStream对文件进行操作。
  • 3、SQLite。
    标准数据库,支持SQL语句。
  • NetWork。
    通过网络存储和获取数据。
本篇中主要讲述4种之一的Shared Preferences,因为在前几篇己经有SQLite的用法做了简单介绍,所以在以下的几篇将会跳过SQLite的讲解。下面开始讲述Shared Preferences。主要内容如下:
  • 1、Shared Preferences 是什么?
  • 2、如何使用 Shared Preferences 获得数据?
  • 3、如何使用 Shared Preferences 保存数据?
    • 3.1、使用getPreferences方法创建文件的模式。
  • 4、模拟用户参数设置。
  • 5、查看 Preferences 产生的文件。
1、Shared Preferences 是什么?

Shared Preferences 类似于winform中做一些小型配置的ini文件,用来保存一些用户设置的参数。例如,可以通过它保存上一次用户所做的修改或者自定义参数设定,当再次启动程序后依然保持原有设置。


2、如何使用 Shared Preferences 保存数据? 

Shared Preferences提供了getPreferences方法来获得Preferences对象,取得该对象了,即可以使用Editor取得编辑对象


3、如何使用 Shared Preferences 保存数据?


上文获得Editor对象之后即可通过 Android 提供的各自操作函数进行数据提交,如:putBoolean()提交一个键值 为bool值的数据,最后通过commit方法保存这些数据。

      3.1、使用getPreferences方法创建文件的模式
在 Android系统提供的API中, 获取 Preferences对象有四种类型,分别如下:
  • 文件创建模式:Activity.MODE_APPEND
    如果该文件已经存在,然后将数据写入,而不是抹掉它现有文件的末尾。
  • 文件创建模式:MODE_PRIVATE
    默认模式,在那里创建的文件只能由应用程序调用,即为私有的
  • 文件创建模式:Activity.MODE_WORLD_READABLE
    允许所有其他应用程序有读取和创建文件的权限。
  • 文件创建模式:Activity.MODE_WORLD_WRITEABLE
    允许所有其他应用程序具有写入、访问和创建的文件权限。
本例中使用到了私有的文件创建模式,来获取Preferences对象。
4、 模拟用户参数设置
在模拟的例子中,我们放了一个复选框和一个文本显示控件,然后通过播放音乐来达到模拟效果。当复选框选中时打开音乐,文本显示控件显示当前音乐为:打开,如果反选复选框则音乐停止,文本显示控件显示当前音乐为:关闭。如果你按下模拟器的返回按钮退出的同时保存当前的状态,如果复选框选中则一打开程序立刻播放音乐,反之则不播放音乐。代码如下:


音乐播放示例代码
  1. package com.terry;

  2. import android.app.Activity;
  3. import android.content.SharedPreferences;
  4. import android.os.Bundle;
  5. import android.view.KeyEvent;
  6. import android.widget.CheckBox;
  7. import android.widget.CompoundButton;
  8. import android.widget.TextView;
  9. import android.widget.CompoundButton.OnCheckedChangeListener;

  10. public class sharedPreActivity extends Activity {
  11.     private TextView myTextView;
  12.     private CheckBox myBox;
  13.     private playMusic PLAYER=null;
  14.     private boolean isplay=false;

  15.     /** Called when the activity is first created. */
  16.     @Override
  17.     public void onCreate(Bundle savedInstanceState) {
  18.         super.onCreate(savedInstanceState);
  19.         setContentView(R.layout.main);
  20.         myTextView=(TextView)findViewById(R.id.TextView01);
  21.         
  22.         myBox=(CheckBox)findViewById(R.id.CheckBox01);
  23.         PLAYER=new playMusic(this); 
  24.         /*
  25.          * 文件创建模式:Activity.MODE_APPEND
  26.          * 如果该文件已经存在,然后将数据写入,而不是抹掉它现有文件的末尾。
  27.          */ 
  28.         /*
  29.          * 文件创建模式:MODE_PRIVATE
  30.          * 默认模式,在那里创建的文件只能由应用程序调用,即为私有的
  31.          */ 
  32.         /*
  33.          * 文件创建模式:Activity.MODE_WORLD_READABLE
  34.          * 允许所有其他应用程序有读取和创建文件的权限。
  35.          */
  36.         /*
  37.          * 文件创建模式:Activity.MODE_WORLD_WRITEABLE
  38.          * 允许所有其他应用程序具有写入、访问和创建的文件权限。
  39.          */
  40.         SharedPreferences settings=getPreferences(Activity.MODE_PRIVATE);
  41.         
  42.         isplay=settings.getBoolean("isplay", false); //通过key值找到value,如果不存在即返回false
  43.         myBox.setChecked(isplay);
  44.         if(isplay){
  45.             
  46.             myTextView.setText("当前音乐的播放状态:开");
  47.             isplay=true;
  48.             PLAYER.Play();
  49.         }
  50.         else{
  51.             myTextView.setText("当前音乐的播放状态:关");
  52.         }
  53.        
  54.         myBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
  55.             
  56.             @Override
  57.             public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
  58.                 // TODO Auto-generated method stub
  59.                 if(isChecked)
  60.                 {
  61.                     myTextView.setText("当前音乐的播放状态:开");
  62.                     isplay=true;
  63.                     PLAYER.Play();
  64.                 }
  65.                 else{
  66.                     myTextView.setText("当前音乐的播放状态:关");
  67.                     isplay=false;
  68.                     PLAYER.FreeMusc();
  69.                 }
  70.             }
  71.         });
  72.         
  73.     }
  74.     
  75.     @Override
  76.     public boolean onKeyDown(int keyCode, KeyEvent event) {
  77.         // TODO Auto-generated method stub
  78.         if(keyCode==KeyEvent.KEYCODE_BACK){
  79.             SharedPreferences uiState=getPreferences(0);
  80.             SharedPreferences.Editor editor=uiState.edit();
  81.             editor.putBoolean("isplay", isplay);
  82.             editor.commit();
  83.             if(isplay)
  84.             {
  85.                 PLAYER.FreeMusc();
  86.             }
  87.             this.finish();
  88.             return true;
  89.         }
  90.             
  91.         return super.onKeyDown(keyCode, event);
  92.     }
  93.     
  94.     
  95.     
  96.     
  97.     
  98. }
复制代码
其中,settings.getBoolean提供了两个参数,第一个参数为键值,第二个则为默认值。当通过键值获取空数据时,则返回第二个参数。
以上代码的音乐播放类如下:
  1. package com.terry;

  2. import java.io.IOException;

  3. import android.content.Context;
  4. import android.media.MediaPlayer;

  5. public class playMusic {

  6.     public MediaPlayer music=null;
  7.     private Context myContext;
  8.     
  9.     public playMusic(Context cc)
  10.     {
  11.         myContext=cc;
  12.     }
  13.     
  14.     public void Play()
  15.     {
  16.          
  17.             music=MediaPlayer.create(myContext, R.raw.start);
  18.         
  19.             music.setLooping(true);
  20.             try {
  21.                 music.prepare();
  22.             } catch (IllegalStateException e) {
  23.                 // TODO: handle exception
  24.                 e.printStackTrace();
  25.             }
  26.             catch (IOException e) {
  27.                 // TODO: handle exception
  28.                 e.printStackTrace();
  29.             }
  30.             music.start();
  31.          
  32.          
  33.     }
  34.     
  35.     public void FreeMusc()
  36.     {
  37.         if(music!=null)
  38.         {
  39.             music.stop();
  40.             music.release();
  41.         }
  42.     }
  43. }
复制代码
5、查看 Preferences 产生的文件
通过上面的例子和代码的实现,己经实现了我们当初期望得到的效果,如果说它像winform中的ini文件,那么它就会创建在一个地方咯。没错,下面我们就来找到它。
在每安装一个Android 应用程序时,data/data目录下都会产生一个文件夹,如果应用程序中使用了 Preferences 则会在该应用程序文件夹下产生一个shared_prefs文件夹,我们产生的文件正安静的躺在那里等着我们呢。。。。(YY中。。。),查看步骤要求:
  • 必须启动模拟器,运行程序。
  • 在 你使用的IDE中切换到DDMS视图,选择File Explorer标签。注意:如果你的File Explorer里面没有任何东西,请根据此步骤找回--》DDMS-在Devices标签中选择
     
    点击Reset adb即可将你的 File Explorer还原。
  • 找到/data/data目录中对应的项目文件夹下的shared_prefs文件夹
 
好了,今天的数据存储就讲到这里,例子的运行图如下:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值