Android_数据存储
2016-06-07 11:18
471 查看
Android_数据存储(文件存储)
Android中为开发者提供了三种数据持久化的方法:文件存储、SharedPreference存储、以及数据库存储。这篇Blog主要介绍的是文件存储和SharedPreference存储。在开始之前,先来了解点东西,如果没有太大的兴趣可以直接跳到正文看。
瞬时数据? 瞬时数据就是那些存储在内容当中,有可能会因为程序关闭或其他原因导致内存被回收而丢弃的数据。Android中真是为了防止这种情况的出现才有了数据存储。
文件存储
文件存储比价适合用于存储一些简单的文本数据或二进制数据。1、Context类提供了一个openFileOutput()方法,可以用于将数据存储到指定的文件中。使用该方法需要两个参数:第一个: 文件名,在文件创建的时候使用的就是这个名称,这个文件名不包括路径。这个文件默认是存放在/data/data/packagename/files/目录下的(这个路径只是相对于虚拟机来说,如果你用的是真机,那就不一定。)第二个:
文件的操作模式,主要有两种模式可选:MODE_PRIVATE 是默认的操作模式,当指定同样文件名的时候,所写入的内容将会覆盖原文件中的内容MODE_APPEND 表示如果该文件已存在就往文件中追加内容,不存在就创建新文件。 其实还有两种模式:MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE 不过这两种已在Android4.2版本中被废弃了。
2、Context类中还提供了一个openFileInput()方法,用于从文件中读取数据。该方法只接收一个参数,就是要读取的文件名,然后在系统自动到data/data/packagename/files/目录下去加载这个文件,并放回一个FileInputStream对象。
说了这么多,我们也该来真正的实战一下了:
我常见了一个项目,它的界面中有一个EditText控件,当我们输入完内容后,按Back键将退出这个程序,并将输入的内容保存到文件中,当我们再一次进入到这个程序的时候,我们要从文件中读取内容,并显示在界面上。
1、下面就来看一下activity_main.xml文件中的代码,其实就一个EditText控件。
<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" tools:context=".MainActivity" > <EditText android:id="@+id/main_et_Input" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="Input Something word" /> </LinearLayout>
2、我的MainActivity中的代码其实也比较简单,大家一看就明白了;
public class MainActivity extends Activity { private EditText etInput; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_main); etInput=(EditText) findViewById(R.id.main_et_Input); String returnString =load(); if (!TextUtils.isEmpty(returnString)) { etInput.setText(returnString); Toast.makeText(this,"Restoring succeeded",Toast.LENGTH_SHORT).show(); } } /** * 从文件中读取数据 */ public String load(){ FileInputStream inputStream=null; BufferedReader reader =null; StringBuffer content =new StringBuffer(); try { inputStream=openFileInput("data"); reader =new BufferedReader(new InputStreamReader(inputStream)); String line =""; while ((line=reader.readLine())!=null) { content.append(line); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { if (reader!=null) { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } } return content.toString(); } @Override protected void onDestroy() { super.onDestroy(); String inputString =etInput.getText().toString(); save(inputString); } /** * 保存内容到文件中 * @param input 需要保存到文件中的数据 */ public void save(String input){ FileOutputStream outputStream=null; BufferedWriter bufferedWriter=null; try { outputStream = openFileOutput("data",Context.MODE_PRIVATE); bufferedWriter =new BufferedWriter(new OutputStreamWriter(outputStream)); bufferedWriter.write(input); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { if (bufferedWriter!=null) { try { bufferedWriter.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
在这里我有一个问题,希望看到我这篇Blog的大神们,能够帮我解答一下,小白感激不尽。问题就是,我用真机运行上面的代码的时候,如何才能看见data这个文件?换句话说就是,我如何才能在真机中访问到data/data/packagename/files/这个目录??
SharedPreferences存储
SharedPreference是使用键值对的方式来存储数据的。我们也可以通过通过键来获取到所对应的数值。SharedPreference还支持多种不同的数据存储。要想用SharedPreference存储数据,肯定要先获得SharedPreference的实例。Android中提供了三种获取该对象的实例:1、Context类中的getSharedPreferences()方法
该方法接受两个参数,第一个参数: 指定SharedPreference文件的名称,如果指定的文件不存在则会创建一个,SharedPreference文件都是存放在/data/data/packagename/shared_prefs/目录下的。第二个参数: 指定操作模式,MODE_PRIVATE 是默认的操作模式,表示只有当前的应用程序才可以对这个SharedPreference文件进行读写。MODE_MULIT_PROCESS 一般用于对多个进程中对同一个SharedPreferences文件进行读写的情况。
2、Activity类中的getPreferences()方法
这个方法只接收一个操作模式的参数,使用这个方法会自动将当前活动的类名作为SharedPreference的文件名。
3、PreferenceManager类中的getDefaultSharedPreferences()方法
这个方法接收一个Context参数,并自动使用当前应用程序的包名作为前缀来命名SharedPreferences文件。
下面就让我们来小小的实践一下吧。
1、布局文件的代码:
<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" tools:context=".SharedPreferenceTest" > <Button android:id="@+id/btn_savaData" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="点击保存数据" /> <Button android:id="@+id/btn_restoreData" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="恢复数据" /> </LinearLayout>
2、我的MainActivity中的代码如下:
public class SharedPreferenceTest extends Activity { private Button btnSavaData,btnRestoreData; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_shared_preference_test); btnSavaData=(Button) findViewById(R.id.btn_savaData); btnRestoreData=(Button) findViewById(R.id.btn_restoreData); btnSavaData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Editor editor= (getSharedPreferences("data", Context.MODE_PRIVATE)) .edit(); editor.putString("name", "Tome"); editor.putInt("age", 23); editor.putBoolean("marry", false); editor.commit(); } }); btnRestoreData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { SharedPreferences spf =getSharedPreferences ("data", Context.MODE_PRIVATE); String name =spf.getString("name", "LiLi"); int age =spf.getInt("age", 0); boolean marry =spf.getBoolean("marry", false); Log.i("SharedPreference", "name:"+name); Log.i("SharedPreference", "age:"+age); Log.i("SharedPreference", "marry:"+marry); } }); } }
3、当我点击保存数据的时候,大家可以看一下,我拿到的data.xml这个文件中的数据:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?> <map> <boolean name="marry" value="false" /> <string name="name">Tome</string> <int name="age" value="23" /> </map>
4、当我点击恢复数据的按钮以后,看一下我打印的Log日志:
06-07 08:14:12.788: I/SharedPreference(1839): name:Tome 06-07 08:14:12.788: I/SharedPreference(1839): age:23 06-07 08:14:12.788: I/SharedPreference(1839): marry:false
这两种存储方法都比价简单,相信大家都已经掌握原理了,只是需要多加练习,你就是以后的大神。
相关文章推荐
- android studio 自定义注释模板
- android基础之onActivityResult不执行问题
- Android实现自定义带文字和图片的Button
- [置顶] Android开发之Sensors与摇一摇
- android BroadcastReceiver 使用小结
- Android按钮单击事件的四种常用写法总结
- Android Studio官方版DrawerLayout侧滑菜单解析
- Android自定义View实现左右滑动选择出生年份
- 工具类
- Android之带遮罩层的弹出框—popUpWindow
- Android网页中启动Acitivity
- 学习过程中很好的博客地址收藏
- 剪刀手:Android平台上的图片裁剪库
- 实现Android6.0的直接分享(Direct Share )功能
- 浅谈Android中的Binder机制
- 解决ScrollView下嵌套ListView、GridView中内容显示不全的问题
- Android的Scroller介绍
- Android_Intent_note
- Android MediaCodec h264硬件编码
- android 显示清除缓存