欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android开发之数据的存储方式详解

程序员文章站 2024-03-31 14:37:58
在android中,数据的存储分为两种方式: 1、直接以文件的形式存储在目录中 2、以json格式存储在数据库中 将数据以文件的存储又分为两种方式: 1、生成.tx...

在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文件之前,我们有必要先了解一下文件的权限,如下图:Android开发之数据的存储方式详解Android开发之数据的存储方式详解

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

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

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

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

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

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

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

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

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个文件
Android开发之数据的存储方式详解

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文件:
Android开发之数据的存储方式详解

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、文件权限

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。