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. 用python第三方库(surface_stats_collector.py) 获取 Android(安
  6. Android(安卓)content provider基础与使用
  7. Eclipse ADT 创建Android项目----工程目录详解
  8. Android利用Fiddler进行网络数据抓包
  9. Android创建SDCard镜像

随机推荐

  1. enable ftrace in android kernel
  2. android之转化inputstream为list
  3. 带标题的RecyclerViewAdapter
  4. android 动态实现点击ImageButton更换图
  5. ADT20安装报错
  6. Android很nice的Spinner(NiceSpinner)
  7. Android:ListView
  8. Android重写ViewPager修改滑动灵敏度
  9. http://www.open-open.com/lib/view/open
  10. 获取手机基本信息的工具类