• Android开发-之数据的存储方式一


    在Android中,数据的存储分为两种方式:

      1、直接以文件的形式存储在目录中

      2、以json格式存储在数据库中

      将数据以文件的存储又分为两种方式:

      1、生成.txt文件

      2、生成xml文件

      那么今天就来详细的说一下以文件的形式存储,由于没有讲到数据库,在之后的课程中会讲到json格式存储在数据库中。

    一、生成.txt文件

    文件的生成无非就是我们Java中学习的输入输出流中的一部分,有Java基础相信都是很容易理解的,因为它真的很简单啦~~

      1、生成目录可以分为两种:

        1)本机

        2)SD卡

      2、生成.txt文件的方式又可以分为4种

        1)使用MODE_PRIVATE模式,生成一个私有的文件

        2)使用MODE_PRIVATE模式,生成一个appent文件

        3)使用MODE_WORLD_READABLE模式,生成一个readable文件

        4)使用MODE_WORLD_WRITEABLE模式,生成一个writeable文件

      在生.txt文件之前,我们有必要先了解一下文件的权限,如下图:

      1、第一格:表示文件的类型

      2、第2-4格:表示当前用户拥有的权限

      3、第5-7格:表示当前用户所在组拥有的权限

      4、第8-10格:表示其他用户拥有的权限

      5、"r":表示可读;"w":表示可写;"x":表示可执行;"-":表示什么权限也没有,如果看到"rwx"就表示可读可写可执行,其他组合亦是如此

     

      注意:不同的模式生成的文件的权限是不一样的,以及生成文件的类型的权限也是不一样的。

      那么下面就详细的来说一下这几种方式

      1、如图所示,当我们点击button按钮时触发文件的监听,这里的按钮就是简单的按钮,但是要记得设置onclick点击事件的属性哦~大家都不傻是吧…………

      

      

      

      1)使用MODE_PRIVATE模式,生成一个私有的文件

    //点击按钮1,使用MODE_PRIVATE模式,生成一个私有的文件
        public void click1(View v){
            try {
                FileOutputStream fos = openFileOutput("private.txt", MODE_PRIVATE);
                fos.write("private".getBytes());
                fos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
      2)使用MODE_PRIVATE模式,生成一个appent文件

     //点击按钮2,使用MODE_PRIVATE模式,生成一个appent文件
        public void click2(View v){
            try {
                FileOutputStream fos = openFileOutput("appent.txt", MODE_PRIVATE);
                fos.write("appent".getBytes());
                fos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

      3)使用MODE_WORLD_READABLE模式,生成一个readable文件

    //点击按钮3,使用MODE_WORLD_READABLE模式,生成一个readable文件
        public void click3(View v){
            try {
                FileOutputStream fos = openFileOutput("readable.txt", MODE_WORLD_READABLE);
                fos.write("readable".getBytes());
                fos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

      4)使用MODE_WORLD_WRITEABLE模式,生成一个writeable文件

     //点击按钮4,使用MODE_WORLD_WRITEABLE模式,生成一个write文件
        public void click4(View v){
            try {
                FileOutputStream fos = openFileOutput("writeable.txt", MODE_WORLD_WRITEABLE);
                fos.write("writeable".getBytes());
                fos.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

      部分代码说明

      FileOutputStream: 文件输出流

      openFileOutput("private.txt", MODE_PRIVATE):openFileOutput是Android中封装好的文件输出流,private.txt就是生成的文件名,MODE_PRIVATE这个就是上面说到的模式啦!
     
      fos.write("private".getBytes()):write就是写入什么内容,这里的参数就是你要写入的文本内容,getBytes()………………^_^不知道自己去看Java基础吧哈哈哈~~~

      
    close():关闭流对象
      

    try-catch:有异常,try一下……
      
     MODE_WORLD_WRITEABLE,MODE_WORLD_READABLE:这两个模式已经被废弃了……没有那么多为什么!哈哈哈……
      

      感觉自己萌萌哒……实在不会的就复习Java基础吧!



      那么这里就生成了如下图所示的4个文件

      

     2、将文件存储在SD卡

        1、获取SD卡的路径:
        String sdPath = Environment.getExternalStorageDirectory().getPath() ;
        2、添加路径
        File file = new File(sdPath + "writeable.txt");

        然后将路径写成这个就好了!就是这么简单

     3、读取刚才写入的文件
      在读取文件内容的时候,你写入的路径是什么,那么读的时候路径就是什么
     try {
                //File file = new File("/data/data/com.test.filereadwrite/files/readable.txt");
                File file = new File("/data/data/com.test.filereadwrite/files/writeable.txt");
                FileInputStream fis = new FileInputStream(file);
                BufferedReader bffr = new BufferedReader(new InputStreamReader(fis));
                String content = bffr.readLine();
                Toast.makeText(MainActivity.this, content, 2000).show();
            } catch (Exception e) {
                e.printStackTrace();
            }
      4、路径优化

      大家偶发现了我这里是直接写的路径,那么这样写并不是最优化的,那么要怎么才是更优化的呢,那么久只要改两行代码就好啦,例如:

      1、获取路径:
      String path = Context.getFilesDir().getPath();
      2、添加路径:
      File file = new File(path + "writeable.txt");

      注意:我们写的路径都应该是用优化的这种方式,而不应该写死,在这里我为了杀鸡儆猴哈哈哈~所以就写死了……但是效果都是一样的哇~~

    二、生成xml文件


      生成xml文件又可以分为两种方式:

      1、使用原生StringBuffer拼接xml文件

      2、使用Android封装好的XmlPullParser类
      
      两种方式生成的xml文件是一样的,但是个人比较喜欢第二种方式,因为简单,就是简单,简单到Google工程师在开发文档中都不用写实例代码……

      在生成xml之前,大家先不要忘记了写一个实体类,不然你怎么封装数据?告诉我怎么封装…………


      那么我们这里就直接上代码了(实体类自己写……)

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            //初始化我们要备份的数据
            smsLists = new ArrayList<Sms>();
            
            //插入测试数据
            for (int i = 0; i < 10; i++) {
                Sms sms = new Sms();
                sms.setAddress("10086"+i);
                sms.setBody("你好"+i);
                sms.setDate("201"+i);
                //把sms对象加入到集合中
                smsLists.add(sms);
            }
        }


      1、使用原生StringBuffer拼接xml文件



    //点击按钮button1,通过StringBuffer的方式生成一个xml文件
        public void click1(View v){
            //1创建一个StringBuffer对象
            StringBuffer sb = new StringBuffer();
            
            //开始组拼xml文件头
            sb.append("<?xml version="1.0" encoding="utf-8"?>");
            //开始组拼xml根节点
            sb.append("<smss>");
            //开始组拼sms节点以及子节点
            for (Sms sms : smsLists) {
                sb.append("<sms>");
                
                //组拼addressa节点
                sb.append("<address>");
                sb.append(sms.getAddress());
                sb.append("</address>");
                
                //组拼body节点
                sb.append("<body>");
                sb.append(sms.getBody());
                sb.append("</body>");
                
                //组拼date节点
                sb.append("<date>");
                sb.append(sms.getDate());
                sb.append("</date>");
                
                sb.append("</sms>");
            }
            
            //smss节点结束
            sb.append("</smss>");
            
            //把数据保存到SD卡中
            try {
                File file = new File(Environment.getExternalStorageDirectory().getPath(),"smsbackup.xml");
                FileOutputStream fos = new FileOutputStream(file);
                fos.write(sb.toString().getBytes());
                fos.close();
            } catch (Exception e) {
                e.printStackTrace();
            } 
            
        }

      2、使用Android封装好的XmlPullParser类

     //点击按钮button2,通过XmlSerializer的方式生成xml文件
        public void click2(View v){
            try {
                //获取XmlSerializer类的实例  通过xml这个工具类去获取
                XmlSerializer serializer = Xml.newSerializer();
                //设置XmlSerializer序列化参数
                File file = new File(Environment.getExternalStorageDirectory().getPath(),"smsbackup.xml");
                FileOutputStream fos = new FileOutputStream(file);
                serializer.setOutput(fos,"utf-8");
                //开始写xml文档开头
                serializer.startDocument("utf-8", true);
                //写xml的根节点     namespace 命名空间
                serializer.startTag(null, "smss");
                //遍历sms节点以及子节点
                for (Sms sms : smsLists) {
                    serializer.startTag(null, "sms");
                    
                    //组拼addressa节点
                    serializer.startTag(null, "address");
                    serializer.text(sms.getAddress());
                    serializer.endTag(null, "address");
                    
                    //组拼body节点
                    serializer.startTag(null, "body");
                    serializer.text(sms.getBody());
                    serializer.endTag(null, "body");
                    
                    //组拼date节点
                    serializer.startTag(null, "date");
                    serializer.text(sms.getDate());
                    serializer.endTag(null, "date");
                    
                    serializer.endTag(null, "sms");
                }
                serializer.endTag(null, "smss");
                
                //結束xml結尾
                serializer.endDocument();
                //关闭流
                fos.close();
                
            } catch (Exception e) {
                e.printStackTrace();
            }
        }

      那么这里就生成如下图的xml文件:





      3、读取xml文件中的数据

    @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            try {
                //显示数据信息
                TextView tv_sms = (TextView) findViewById(R.id.tv_weather);
                //通过上下文 获取资产的管理者
                InputStream in = getAssets().open("smss.xml");
                //调用我们定义  解析xml的业务方法
                List<Sms> smsLists = SmsParser.xmlParser(in);
                
                StringBuffer sb = new StringBuffer();
                for (Sms sms : smsLists) {
                    sb.append(sms.toString());
                }
                
                //把数据显示到TextView上
                tv_sms.setText(sb.toString());
                
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
     
      部分代码说明:

        这里我想教大家自己怎么去看开发文档……所以大家自己去看开发文档吧……哈哈哈~~
        ps:这里我想说明一下,不是我不会,也不是偷懒,而是大家在以后企业开发的时候都是可以查看开发文档的,而且说实话Android中的东西真的很多很多,要全部记住那简直太难啦……
        所以希望大家都能够自己学会查看开发文档……这也算是自己必修的一门课吧~~因为对于小白的我,学会了看文档就免得很多很多的麻烦,比如突然有一个东东不会……怎么办?哈哈哈……



    三、总结 
     
       
       1、生成.txt文件的4种方法和步骤

      2、生成xml文件的2种方法和步骤

      3、读取.txt文件

      4、读取xml文件

      5、将数据存放在本机和SD卡中

      6、学会看开发文档

      7、文件权限
     



  • 相关阅读:
    CentOS单用户模式下修改ROOT密码和grub加密
    CentOS配置SSH单向无密码访问
    物流追踪
    SpringBoot整合Redis及Redis
    小程序毫秒级倒计时(适用于拼团秒杀功能)
    foreach中的collection
    ArrayList和LinkedList的区别
    JavaScript 基础
    自用 goodsdetail
    JAVA常用处理数据
  • 原文地址:https://www.cnblogs.com/xiao-chuan/p/6115195.html
Copyright © 2020-2023  润新知