码迷,mamicode.com
首页 > 其他好文 > 详细

3.数据存储

时间:2015-10-26 15:16:14      阅读:169      评论:0      收藏:0      [点我收藏+]

标签:

在内部文件的读取

   **内部存储(internal storeage)
     ram:运行时期的内存      (相当于电脑的内存)
     rom;存储的内存     (相当于电脑的硬盘)

   **外部存储(external storeage)
 SD卡:相当于电脑的移动硬盘
* 2.2之前,sd卡路径:sdcard
* 4.3之前,sd卡路径:mnt/sdcard
* 4.3开始,sd卡路径:storage/sdcard

* 所有存储设备,都会被划分成若干个区块,每个区块有固定的大小
* 存储设备的总大小 = 区块大小 * 区块数量

   一般的术语:手机自带的32G,指的是手机的外部存储空间
  •    实例:进行保存用户名和密码:
    
  1. public void readAccount(){
  2. // File file = new File(getFilesDir(), "info.txt");
  3. File file = new File(getCacheDir(), "info.txt");
  4. if(file.exists()){
  5. try {
  6. FileInputStream fis = new FileInputStream(file);
  7. //把字节流转换成字符流
  8. BufferedReader br = new BufferedReader(new InputStreamReader(fis));
  9. //读取txt文件里的用户名和密码
  10. String text = br.readLine();
  11. String[] s = text.split("##");
  12. et_name.setText(s[0]);
  13. et_pass.setText(s[1]);
  14. } catch (Exception e) {
  15. // TODO Auto-generated catch block
  16. e.printStackTrace();
  17. }
  18. }
  19. }
  20. public void login(View v){
  21. String name = et_name.getText().toString();
  22. String pass = et_pass.getText().toString();
  23. CheckBox cb = (CheckBox) findViewById(R.id.cb);
  24. //判断选框是否被勾选
  25. if(cb.isChecked()){
  26. //返回一个File对象,其路径是data/data/com.itheima.apirwinrom/files
  27. // File file = new File(getFilesDir(), "info.txt");
  28. //返回值也是一个File对象,其路径是data/data/com.itheima.apirwinrom/cache
  29. File file = new File(getCacheDir(), "info.txt");
  30. FileOutputStream fos;
  31. try {
  32. fos = new FileOutputStream(file);
  33. fos.write((name + "##" + pass).getBytes());
  34. fos.close();
  35. } catch (Exception e) {
  36. // TODO Auto-generated catch block
  37. e.printStackTrace();
  38. }
  39. }
  40. //创建并显示吐司对话框
  41. Toast.makeText(this, "登录成功", 0).show();
  42. }

      
      注意:
            当内存不足时,系统可能帮我们删除cache中的文件,
    所以一般重要的文件不要放在此文件夹中。
    还有缓存中一般是存放一些内存中一些直接读取的数据。
             手机上有个clear Data:删除的是"该file文件夹"中
             clear cache:删除的是cache缓存中的文件。
      

在外部存储数据:sd卡

对sdcard进行读取;
  基本的状态:
    MEDIA_UNKNOW:不能够进行识别该sd卡
    MEDIA_REMOVE:没有该sd卡
    MEDIA_UNMOUNTED:sd卡有但是并没有进行挂载
    MEDIA_CHECKING:sd卡正在准备
    MEDIA_MOUNTED:sd卡正在挂载
  
  • 最简单的打开sd卡的方式

    File file = new File("sdcard/info.txt");
  • 写sd卡需要权限

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
  • 读sd卡,在4.0之前不需要权限,4.0之后可以设置为需要

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
  • 使用api获得sd卡的真实路径,部分手机品牌会更改sd卡的路径

  • 判断sd卡是否准备就绪

    1. if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)){
    2. //返回一个File对象,其路径是sd卡的真实路径
    3. File file = new File(Environment.getExternalStorageDirectory(), "info.txt");

查看源代码查找获取sd卡剩余容量的代码

  • 导入Settings项目
  • 查找“可用空间”得到

    <string name="memory_available" msgid="418542433817289474">"可用空间"</string>
  • 查找"memory_available",得到

    <Preference android:key="memory_sd_avail"
    style="?android:attr/preferenceInformationStyle"
    android:title="@string/memory_available"
    android:summary="00"/>
  • 查找"memory_sd_avail",得到

    //这个字符串就是sd卡剩余容量
    formatSize(availableBlocks * blockSize) + readOnly
    //这两个参数相乘,得到sd卡以字节为单位的剩余容量
    availableBlocks * blockSize
  • 存储设备会被分为若干个区块,每个区块有固定的大小

  • 区块大小 * 区块数量 等于 存储设备的总大小
 

Linux文件的访问权限

  • 在Android中,每一个应用是一个独立的用户
  • drwxrwxrwx
  • 第1位:d表示文件夹,-表示文件
  • 第2-4位:rwx,表示这个文件的拥有者用户(owner)对该文件的权限
    • r:读
    • w:写
    • x:执行
  • 第5-7位:rwx,表示跟文件拥有者用户同组的用户(grouper)对该文件的权限
  • 第8-10位:rwx,表示其他用户组的用户(other)对该文件的权限

openFileOutput的四种模式

  • MODE_PRIVATE:-rw-rw----
  • MODE_APPEND:-rw-rw----
  • MODE_WORLD_WRITEABLE:-rw-rw--w-
  • MODE_WORLD_READABLE:-rw-rw-r--

SharedPreference
  • 非常适合用来保存零散的简单的数据
  • Android中主要提供了三种方法用于得到 SharedPreferences对象。
    1. Context类中的 getSharedPreferences()方法
            因为 getSharedPreferences()方法是Context类中的,所以可以直接这样写。此方法接收两个参数,第一个参数用于指定 SharedPreferences文件的名称,如果指定的文件不存在则会创建一个,第二个参数用于指定操作模式,主要有两种模式可以选择,MODE_PRIVATE和 MODE_MULTI_PROCESS。MODE_PRIVATE仍然是默认的操作模式,和直接传入 0 效果是相同的,表示只有当前的应用程序才可以对这个SharedPreferences文件进行读写。 MODE_MULTI_PROCESS则一般是用于会有多个进程中对同一个SharedPreferences文件进行读写的情况。类似地,MODE_WORLD_READABLE和 MODE_WORLD_WRITEABLE这两种模式已在 Android 4.2版本中被废弃。

    2. Activity类中的 getPreferences()方法
    这个方法和 Context中的 getSharedPreferences()方法很相似,不过它只接收一个操作模式参数,因为使用这个方法时会自动将当前活动的类名作为 SharedPreferences的文
    件名。

    3. PreferenceManager类中的 getDefaultSharedPreferences()方法
    这是一个静态方法,它接收一个 Context参数,并自动使用当前应用程序的包名作为前缀来命名 SharedPreferences文件。

    储存步骤
    得到了SharedPreferences对象之后, 就可以开始向SharedPreferences文件中存储数据了,主要可以分为三步实现。
    1. 调用 SharedPreferences对象的 edit()方法来获取一个 SharedPreferences.Editor对象。
    2. 向 SharedPreferences.Editor 对象中添加数据,比如添加一个布尔型数据就使用
    putBoolean方法,添加一个字符串则使用 putString()方法,以此类推。
    3. 调用 commit()方法将添加的数据提交,从而完成数据存储操作。
    1. SharedPreferences.Editor editor = getSharedPreferences("data",MODE_PRIVATE).edit();
    2. editor.putString("name", "Tom");
    3. editor.putInt("age", 28);
    4. editor.putBoolean("married", false);
    5. editor.commit();

    用SharedPreference存储账号密码

    • 往SharedPreference里写数据,另一种写法

      /路径在data/data/包/share_pre

      //拿到一个SharedPreference对象
      SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE);
      //拿到编辑器
      Editor ed = sp.edit();
      //写数据
      ed.putBoolean("name", name);
      ed.commit();

  • 从SharedPreference里取数据

    1. SharedPreferences sp = getSharedPreferences("config", MODE_PRIVATE);
    2. //从SharedPreference里取数据
    3. String name = sp.getBoolean("name", "");

    生成XML文件备份短信

    • 创建几个虚拟的短信对象,存在list中
    • 备份数据通常都是备份至sd卡

      使用StringBuffer拼接字符串

    • 把整个xml文件所有节点append到sb对象里

      1. StringBuffer sb = new StringBuffer();
      2. sb.append("<?xml version=‘1.0‘ encoding=‘utf-8‘ standalone=‘yes‘ ?>");
      3. sb.append("<messages>");
      4. for (Message sms : smsList) {
      5. sb.append("<sms>");
      6. sb.append("<body>");
      7. sb.append(sms.getBody());
      8. sb.append("</body>");
      9. sb.append("<date>");
      10. sb.append(sms.getDate());
      11. sb.append("</date>");
      12. sb.append("<type>");
      13. sb.append(sms.getType());
      14. sb.append("</type>");
      15. sb.append("<address>");
      16. sb.append(sms.getAddress());
      17. sb.append("</address>");
      18. sb.append("</sms>");
      19. }
      20. sb.append("</messages>");
      21. File file = new File("sdcard/sms.xml");
      22. try {
      23. FileOutputStream fos = new FileOutputStream(file);
      24. fos.write(sb.toString().getBytes());
      25. fos.close();
      26. } catch (Exception e) {
      27. // TODO Auto-generated catch block
      28. e.printStackTrace();
      29. }











3.数据存储

标签:

原文地址:http://www.cnblogs.com/liuyu0529/p/4911076.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!