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

duanqingju 8年前
   <p>在Android中,数据的存储分为两种方式:</p>    <p>1、直接以文件的形式存储在目录中</p>    <p>2、以json格式存储在数据库中</p>    <p>将数据以文件的存储又分为两种方式:</p>    <p>1、生成.txt文件</p>    <p>2、生成xml文件</p>    <p>那么今天就来详细的说一下以文件的形式存储,由于没有讲到数据库,在之后的课程中会讲到json格式存储在数据库中。</p>    <h2><strong>一、生成.txt文件</strong></h2>    <p>文件的生成无非就是我们Java中学习的输入输出流中的一部分,有Java基础相信都是很容易理解的,因为它真的很简单啦~~</p>    <p>1、生成目录可以分为两种:</p>    <p>1)本机</p>    <p>2)SD卡</p>    <p>2、生成.txt文件的方式又可以分为4种</p>    <p>1)使用MODE_PRIVATE模式,生成一个私有的文件</p>    <p>2)使用MODE_PRIVATE模式,生成一个appent文件</p>    <p>3)使用MODE_WORLD_READABLE模式,生成一个readable文件</p>    <p>4)使用MODE_WORLD_WRITEABLE模式,生成一个writeable文件</p>    <p>在生.txt文件之前,我们有必要先了解一下文件的权限,如下图:</p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/b9826f5a8ab058139e7b3bc15a578c49.png"></p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/c88e67681764c4c9abcfa57065154649.png"></p>    <p>1、第一格:表示文件的类型</p>    <p>2、第2-4格:表示当前用户拥有的权限</p>    <p>3、第5-7格:表示当前用户所在组拥有的权限</p>    <p>4、第8-10格:表示其他用户拥有的权限</p>    <p>5、"r":表示可读;"w":表示可写;"x":表示可执行;"-":表示什么权限也没有,如果看到"rwx"就表示可读可写可执行,其他组合亦是如此</p>    <p>注意:不同的模式生成的文件的权限是不一样的,以及生成文件的类型的权限也是不一样的。</p>    <p>那么下面就详细的来说一下这几种方式</p>    <p><strong>1、如图所示,当我们点击button按钮时触发文件的监听,这里的按钮就是简单的按钮,但是要记得设置onclick点击事件的属性哦~大家都不傻是吧…………</strong></p>    <p style="text-align:center"><img src="https://simg.open-open.com/show/9804d6b78e2187b1c7048f8134b61282.png"></p>    <p><strong>1)使用MODE_PRIVATE模式,生成一个私有的文件</strong></p>    <pre>  <code class="language-java">//点击按钮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();          }      }  </code></pre>    <p><strong>2)使用MODE_PRIVATE模式,生成一个appent文件</strong></p>    <pre>  <code class="language-java"> //点击按钮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();          }      }  </code></pre>    <p><strong>3)使用MODE_WORLD_READABLE模式,生成一个readable文件</strong></p>    <pre>  <code class="language-java">//点击按钮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();          }      }  </code></pre>    <p><strong>4)使用MODE_WORLD_WRITEABLE模式,生成一个writeable文件</strong></p>    <pre>  <code class="language-java"> //点击按钮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();          }      }  </code></pre>    <p>部分代码说明</p>    <pre>  <code class="language-java">        FileOutputStream: 文件输出流</code></pre>    <pre>  <code class="language-java">        openFileOutput("private.txt", MODE_PRIVATE):openFileOutput是Android中封装好的文件输出流,private.txt就是生成的文件名,MODE_PRIVATE这个就是上面说到的模式啦!</code></pre>    <pre>  <code class="language-java">        fos.write("private".getBytes()):write就是写入什么内容,这里的参数就是你要写入的文本内容,getBytes()………………^_^不知道自己去看Java基础吧哈哈哈~~~</code></pre>    <pre>  <code class="language-java">        close():关闭流对象            try-catch:有异常,try一下……</code></pre>    <pre>  <code class="language-java">        MODE_WORLD_WRITEABLE,MODE_WORLD_READABLE:这两个模式已经被废弃了……没有那么多为什么!哈哈哈……</code></pre>    <pre>  <code class="language-java">        感觉自己萌萌哒……实在不会的就复习Java基础吧!    那么这里就生成了如下图所示的4个文件</code></pre>    <p style="text-align:center"><img src="https://simg.open-open.com/show/47170d07304009439be7670919a0e7d3.png"></p>    <p><strong>    2、将文件存储在SD卡</strong></p>    <p>                1、获取SD卡的路径:<br>                 String sdPath = Environment.getExternalStorageDirectory().getPath() ;</p>    <p>                2、添加路径<br>                 File file = new File(sdPath + "writeable.txt");</p>    <p>然后将路径写成这个就好了!就是这么简单</p>    <p>    <strong>3、读取刚才写入的文件</strong><br> 在读取文件内容的时候,你写入的路径是什么,那么读的时候路径就是什么</p>    <pre>  <code class="language-java"> 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();          }  </code></pre>    <p><strong>     4、路径优化</strong></p>    <p>大家偶发现了我这里是直接写的路径,那么这样写并不是最优化的,那么要怎么才是更优化的呢,那么久只要改两行代码就好啦,例如:</p>    <p>        1、获取路径:<br>         String path = Context.getFilesDir().getPath();</p>    <p>        2、添加路径:<br>         File file = new File(path + "writeable.txt");</p>    <p>注意:我们写的路径都应该是用优化的这种方式,而不应该写死,在这里我为了杀鸡儆猴哈哈哈~所以就写死了……但是效果都是一样的哇~~</p>    <h2><strong>二、生成xml文件</strong></h2>    <p>生成xml文件又可以分为两种方式:<br> <strong>1、使用原生StringBuffer拼接xml文件 </strong><br> <strong>2、使用Android封装好的XmlPullParser类 </strong><br> 两种方式生成的xml文件是一样的,但是个人比较喜欢第二种方式,因为简单,就是简单,简单到Google工程师在开发文档中都不用写实例代码……<br> 在生成xml之前,大家先不要忘记了写一个实体类,不然你怎么封装数据?告诉我怎么封装…………<br> 那么我们这里就直接上代码了(实体类自己写……)</p>    <pre>  <code class="language-java">@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);          }      }  </code></pre>    <h3><strong>1、使用原生StringBuffer拼接xml文件</strong></h3>    <pre>  <code class="language-java">//点击按钮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();          }                 }  </code></pre>    <h3><strong>2、使用Android封装好的XmlPullParser类</strong></h3>    <pre>  <code class="language-java"> //点击按钮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();          }      }  </code></pre>    <h3 style="text-align:center">那么这里就生成如下图的xml文件:<br> <img alt="" src="https://simg.open-open.com/show/d5f0780267e8e594a5109e16ddc4c18c.png"></h3>    <h3><strong>3、读取xml文件中的数据</strong></h3>    <pre>  <code class="language-java">@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();          }      }  </code></pre>    <p>部分代码说明:</p>    <p>        这里我想教大家自己怎么去看开发文档……所以大家自己去看开发文档吧……哈哈哈~~<br>         ps:这里我想说明一下,不是我不会,也不是偷懒,而是大家在以后企业开发的时候都是可以查看开发文档的,而且说实话Android中的东西真的很多很多,要全部记住那简直太难啦……<br> 所以希望大家都能够自己学会查看开发文档……这也算是自己必修的一门课吧~~因为对于小白的我,学会了看文档就免得很多很多的麻烦,比如突然有一个东东不会……怎么办?哈哈哈……</p>    <h2><strong>三、总结    </strong>             </h2>    <p>         1、生成.txt文件的4钟方法和步骤</p>    <p>        2、生成xml文件的2钟方法和步骤</p>    <p>        3、读取.txt文件</p>    <p>        4、读取xml文件</p>    <p>        5、将数据存放在本机和SD卡中</p>    <p>        6、学会看开发文档</p>    <p>        7、文件权限</p>    <pre>  <code class="language-java">        </code></pre>    <p> </p>    <p>来自:http://www.cnblogs.com/xiao-chuan/p/6115195.html</p>    <p> </p>