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

  • Shared Preferences:共享参数形式,一种以Key-Value的键值对形式保存数据的方式,Android内置的,一般应用的配置信息,推荐使用此种方式保存。

  • Internal Storage:使用Android设备自带的内存存储数据。

  • External Storage:使用外部存储设备存储数据,一般是指Sdcard

  • SQLite Databases:以SQLite数据库存储结构化的数据。

  1. SharedPreferences

也是一种轻型的数据存储方式,它的本质是基于XML文件存储key-value键值对数据,通常用来存储一些简单的配置信息。其存储位置在/data/data/<包名>/shared_prefs目录下。SharedPreferences对象本身只能获取数据而不支持存储和修改,存储修改是通过Editor对象实现。实现SharedPreferences存储的步骤如下:

  一、根据Context获取SharedPreferences对象

  二、利用edit()方法获取Editor对象。

  三、通过Editor对象存储key-value键值对数据。

四、通过commit()方法提交数据。

赋值:

putBoolean(KEY_SHOW_DIALOG_AT_START, false)

取值:

getBoolean(KEY_SHOW_DIALOG_AT_START,false);

SharedPreferences案例分析:

  1. 加进一检查框

<CheckBox

android:id="@+id/cbSent"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:layout_alignLeft="@+id/textView1"

android:layout_below="@+id/textView1"

android:layout_marginTop="60dp"

android:text="测试语句"/>

  1. 定义三变量

private CheckBox cbSent;

private SharedPreferences sp;

privatestaticfinal String KEY_SHOW_DIALOG_AT_START = "showDialog";

  1. onCreate中添加

sp = getSharedPreferences("mysp", Context.MODE_PRIVATE);

cb = (CheckBox) findViewById(R.id.cb);

cb.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {

@Override

publicvoid onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

Editor e = sp.edit();

e.putBoolean(KEY_SHOW_DIALOG_AT_START, isChecked);

e.commit();

}

});

cb.setChecked(sp.getBoolean(KEY_SHOW_DIALOG_AT_START, false));

if (cb.isChecked()) {

new AlertDialog.Builder(this).setTitle("标题").setMessage("显示语句么?").setPositiveButton("关闭", null).show();

}

  1. 内部存储

Internal Storage

  内部存储,在Android中,开发者可以直接使用设备的内部存储器中保存文件,默认情况下,以这种方式保存的和数据是只能被当前程序访问,在其他程序中是无法访问到的,而当用户卸载该程序的时候,这些文件也会随之被删除。

  使用内部存储保存数据的方式,基本上也是先获得一个文件的输出流,然后以write()的方式把待写入的信息写入到这个输出流中,最后关闭流即可,这些都是JavaIO流的操作。具体步骤如下:

  • 使用Context.openFileOutput()方法获取到一个FileOutputStream对象。

  • 把待写入的内容通过write()方法写入到FileOutputStream对象中。

  • 最后使用close()关闭流。

      上面介绍的Context.openFileOutput()方法有两个重载函数,它们的签名分别是:

  • FileOutputStream openFileOutput(Stringname):以MODE_PRIVATE的模式打开name文件。

  • FileOutputStream openFileOutput(Stringname,int mode):以mode的模式打开name文件。

      上面第二个重载函数中,mode为一个int类型的数据,这个一般使用Context对象中设置好的常量参数,有如下几个:

  • MODE_APPEND:以追加的方式打开一个文件,使用此模式写入的内容均追加在原本内容的后面。

  • MODE_PRIVATE:私有模式(默认),如果文件已经存在会重新创建并替换原文件,如果不存在直接创建。

  • MODE_WORLD_READABLE:以只读的方式打开文件。

  • MODE_WORLD_WRITEABLE:以只写的方式打开文件。

      还有几个方法需要特别注意一下,这几个方法对于文件关系提供了更好的支持,配合上面介绍的方式,就可以对文件的数据进行常规的CRUD操作(增删改查),方法如下:

  • File getFIlesDir():获取文件系统的绝对路径。

  • boolean deleteFile(String name):删除一个指定文件名为name的文件。

  • String[] fileList():当前应用内部存储路径下的所有文件名。

Internal Storage案例分析:

1)加进编辑和命令按钮

<EditText

android:gravity="top"

android:id="@+id/et"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:layout_weight="1"/>

<Button

android:id="@+id/btnSave"

android:layout_width="fill_parent"

android:layout_height="wrap_content"

android:text="保存" />

2)读取数据

privatevoid readSavedText(){

try {

InputStream is = openFileInput("data");

byte[] bytes = newbyte[is.available()];

is.read(bytes);

is.close();

String str = new String(bytes,"utf-8");

et.setText(str);

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

}

3保存数据

privatevoid saveCurrentText(){

try {

OutputStream os = openFileOutput("data", Context.MODE_PRIVATE);

os.write(et.getText().toString().getBytes("utf-8"));

os.flush();

os.close();

Toast.makeText(this, "保存成功", Toast.LENGTH_SHORT).show();

return;

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (UnsupportedEncodingException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

Toast.makeText(this, "保存失败", Toast.LENGTH_SHORT).show();

}

4)开始读取数据和定义保存

et = (EditText) findViewById(R.id.et);

btnSave = (Button) findViewById(R.id.btnSave);

readSavedText();

btnSave.setOnClickListener(new View.OnClickListener() {

@Override

publicvoid onClick(View v) {

saveCurrentText();

}

});

参考:

http://www.cnblogs.com/weixing/p/3243115.html


更多相关文章

  1. mybatisplus的坑 insert标签insert into select无参数问题的解决
  2. python起点网月票榜字体反爬案例
  3. NPM 和webpack 的基础使用
  4. 【阿里云镜像】使用阿里巴巴DNS镜像源——DNS配置教程
  5. Android之——代码混淆
  6. Android(安卓)studio获取sha1(调试版和发布版)
  7. 关于android使用已有id,自己的id和系统id
  8. Android系统进程Zygote启动过程的源代码分析
  9. android 退出activity 的方式总结

随机推荐

  1. Android(安卓)Studio JNI开发
  2. android 逆向 去广告
  3. android mp3播放器学习之预备知识1:activi
  4. Android设置TextView的行间距、行高。
  5. Android再学习-20141018-布局-进度条
  6. Android起步--简单的乘法
  7. Android学习指南之三十七:Android传感器编
  8. Android应用开发相关下载资源(2014/12/14
  9. Android如何设置TextView的行间距、行高
  10. ndk完整编译cocos2dx项目总结