10天学通Android开发(7)-数据存储

在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()的方式把待写入的信息写入到这个输出流中,最后关闭流即可,这些都是Java中IO流的操作。具体步骤如下:

  • 使用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

时间: 2024-10-31 05:34:48

10天学通Android开发(7)-数据存储的相关文章

10天学通Android开发(1)-环境搭建和Hello测试

首先要搭建环境,然后创建一个简单的HelloWorld.本文的主题如下: 1.环境搭建 1.1.JDK安装 1.2 Eclipse安装 1.3 Android SDK安装 1.4.ADT安装 1.5.创建AVD  2.HelloWorld 1环境搭建 1.1.JDK安装 安装java并配置环境变量   http://www.oracle.com/---->downloads--àJava ForDevelopers--àJDK,选择Windows X86(32位)或Windows X64(64位

10天学通Android开发(4)-用户布局与常用控件

常用布局 FrameLayout:子元素没有相对位置概念,都相对于左上角 LinearLayout:线性布局,一个接一个,水平或垂直 RelativeLayout:相对布局,可相对其它子元素 TableLayout:水平和垂直LinearLayout的混和 如: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.andr

10天学通Android开发(3-3)-Intent使用

Intent:可以理解为:与基本组件关联的数据对象,用来指定用来启动或激活的目标组件 Android引入了Intent的概念来唤起components,component包括:1.Activity(UI元件) 2.Service(后台代码) 3.Broadcast receiver(处理广播消息的代码) 4.Content provider(抽象数据的代码) Intent(意图)主要是解决Android应用的各项组件之间的通讯. Intent负责对应用中一次操作的动作.动作涉及数据.附加数据进行

10天学通Android开发(3-1)-组件广播接收器Broadcast Receive

广播接收器,它和事件处理机制类似,只不过事件的处理机制是程序组件级别的,而广播处理机制是系统级别的. BroadcastReceiver如操作系统启动完毕,发出广播信号:低电量提示广播,应用中耗电量大的部分功能关闭:侦听短信: 用于接收并处理广播通知(broadcastannouncements).多数的广播是系统发起的,如地域变换.电量不足.来电来信等.程序也可以播放一个广播.程序可以有任意数量的 broadcast receivers来响应它觉得重要的通知.broadcast receive

10天学通Android开发(3-2)-组件ContentProvider

1)ContentProvider简介      该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据.虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如:采用文件方式对外共享数据,需要进行文件操作读写数据:采用sharedpreferences共享数据,需要使用sharedpreferences API读写数据.而使用ContentProvider共享数据的好处是统一了数据访问方式. 2)每个ContentProvider都有一个公共的URI,这个URI用于

10天学通Android开发(2-3)-核心组件Service绑定

通过startService开启的服务,当访问者关闭时,服务仍然存在:访问者需要与服务进行通信,则我们需要将访问者与服务进行绑定: 如果使用Context.bindService()方法启动服务,则在服务未创建时,系统会调用服务的onCreate()方法,接着调用onBind()方法,这时就访问者与服务已经绑定了,主程序销毁时服务也会终止. 1)绑定服务时,会自动创建服务. 2)如果创建后并启动后再绑定,不会重新创建,一个Service只有一个实例 3)同时启动和绑定服务时,解除绑定服务,但不会

10天学通Android开发(8)-多媒体

一.播放声音SoundPool SoundPool播放短的音效,不能播放歌曲 可以用soundpool,用soundpool可以播一些短的反应速度要求高的声音, 比如游戏中的爆破声,而mediaplayer适合播放长点的. SoundPool载入音乐文件使用了独立的线程,不会阻塞UI主线程的操作, SoundPool类支持同时播放多个音效,这对于游戏来说是十分必要的,而MediaPlayer类是同步执行的只能一个文件一个文件的播放. 实例: sp=new SoundPool(1,AudioMan

10天学通Android开发(2-2)-核心组件Service创建

有些程序不需要交互,在后台运行,并可长时间运行,不被操作系统杀死,这就是组件Service 声明Service,新建class,MyService,扩展自Service AndroidManifest中配置, 在Application中添加Serivice,选择MySerivice 实际添加了一行: <serviceandroid:name="MyService"></service> 添加二个按钮,启动Service和停止Service <Button

10天学通Android开发(2-1)-核心组件Activity

Activity.Service.Broadcast Receiver.Content Provide为Android四大核心组件,Activity是与用户交互的窗口,有三种状态:运行.暂停.停止 七个方法:    protected void onCreate(Bundle savedInstanceState);      protected void onStart();      protected void onRestart();      protected void onResu