笔记 - Android - 5.数据存储和访问、XML等

Android -- 数据存储和访问:

Android下的文件访问权限:
    r:readable可读
    w:writeable可写
    x:可执行
    Permissions(权限):
        - --- --- ---
    第一(位置0)表示文件或目录
        > - 表示文件
        > d 表示目录
    第2~4(位置1~3)表示当前用户对文件所具有的权限
    第5~7(位置4~6)表示当前用户所在组对文件所具有的权限
    第8~10(位置7~9)表示其他用户对该文件所具有的权限
    
    当前用户:每一个不同的应用程序都对应一个不同的用户,该用户就是该应用程序的当前用户
    当前用户组:当前用户所在的组
        通常情况下,Android下的每一个应用程序都对应一个独立的用户,都对应一个独立的用户组
        
    其他用户:除了应用程序自身对应的用户之外,其他的应用程序所对应的用户都称之为其他用户
    
    Linux chmod命令:chmod -> change mode 改变模式的意思,该Linux命令可以用来改变一个文件的权限
        用法:chmod 参数 文件名
            参数:该参数是一个二进制数的十进制表现形式,该二进制表示的是文件的权限,10个位置,不算第一位,
                有权限用1表示,无权限则用0表示,每三位一组,每组二进制数的十进制连起来则是该参数。
                如: - rwx rw- --- 该权限的二进制表示为
                      111 110 000 对应的十进制则为
                       7   6   0  连起来就是 760,760就是该参数

一、保存文件到手机内存
    SharedPreferences的使用:该对象可以用来保存数据信息,最终会在程序数据目录下生成一个shared_prefs文件夹,
        shared_prefs文件夹下会生成一个xml配置文件,数据就保存在这个xml文件中。
        
        使用SharedPreferences存数据:
            1.创建对象,通过上下文的getSharedPreferences(String name, int mode) 方法获得一个ShardPreferences对象,
            2.创建一个编辑器对象Editor,通过SharedPreferences对象的edit()方法,
            3.使用编辑器对象存入数据,通过调用Editor.putXxx(key, value)方法,
                putXxx()方法有
                putString(String key, String value),
                putBoolean(String key, boolean value),
                putFloat(String key, float value),
                putLong(String key, long value),
                putStringSet(String key, Set<String> value),该方法value是一个Set<String>集合
            4.最后一步必不可少,提交数据,调用Editor.commit()方法,只有调用了该方法后,数据才能正确的保存到shared_prefs文件夹
                下的xml文件。
            
        使用SharedPreferences读取数据:
            1.创建对象,与上述方法相同,
            2.调用SharedPreferences对象的getXxx(key, defaultValue)方法
                > String key:存入数据时所使用的key
                > defaultValue:默认值,当getXxx()方法没有取到数据时,返回该默认值。
                > getXxx()方法有:
                    getString(String key, String defValue)
                    getBoolean(String key, boolean delValue)
                    getLong(String key, long delValue)
                    getFloat(String key, float defValue)
                    getStringSet(String key, Set<String> defValue)
                与Editor对象的putXxx()方法对应。
        
二、保存文件到手机sd卡
    Environment的使用:环境,一个静态工具类,可以操作外部存储设备SD卡,无序创建对象。
    将数据存储到SD卡:
    1.判断外部存储设备是否可用
        外部存储设备状态常量:
            String Environment.MEDIA_MOUNTED :外部存储设备状态可用
            String Environment.MEDIA_UNMOUNTED:外部存储设备状态不可用
        方法:
            static String Environment.getExternalStorageState():返回当前外部存储设备的状态(可用或不可用);
    2.获取外部存储设备的路径
        方法:
            File Environment.getExternalStorageDirectory():返回外部存储设备的跟目录的File对象;
    3.使用外部存储设备时,需要添加android.permission.WRITE_EXTERNAL_STORAGE 权限
    
三、生成Xml的两种方式
    1.使用StringBuffer类拼接字符串,以流的形式将xml文件写出;
    2.使用XmlSerializer类生成xml文件,该方法内部也是以流的方式生成xml文件:
        * 创建XmlSerializer对象:
            通过Xml.newSerializer()方法即可创建一个XmlSerializer对象,Xml是一个xml相关的工具类。
            XmlSerializer serializer = Xml.newSerializer();
        * 设置XmlSerializer的输出流参数,可以是字节流和字符流
            serializer.setOutput(OutputStream os, String encoding);
            或serializer.setOutput(Writer wirter);
        * 开始文档
            serializer.startDocument(String encoding, boolean standalone);
                > encoding:xml文件声明所用的编码
                > standalone:该xml文件是否是单独的xml文件,不受其它xml文件约束
        * 开始节点
            serializer.startTag(String namespace, String name)
                > namespace:命名空间,通常为null
                > name:节点名称,不需要尖括号
        * 给节点添加属性
            serializer.attribute(String namespace, String name, String value)
                > namespace:命名空间,通常为null
                > name:属性名称
                > value:属性值
        * 给节点添加内容
            serializer.text(String text)
                > text:需要添加在节点中的文本字符串
        * 结束节点
            serializer.endTag(String name)
                > name:标签名称,同startTag()
        * 结束文档
            serializer.endDocument();
            
        * 开始节点到结束节点这个步骤可循环!!!
            养成好的习惯,在写完开始后,立马把结束写上,然后在中间写内容,这样不容易出错!!!

四、解析xml文档
    使用XmlPullParser对象解析Xml文档
    * 创建XmlPullParser对象
        通过Xml类的newPullParser()方法即可创建一个XmlPullParser对象
            XmlPullParser parser = Xml.newPullParser();
        或者通过一个工厂类也可创建一个XmlPullParser对象:
            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
            factory.setNamespaceAware(true);
            XmlPullParser xpp = factory.newPullParser();
            
    * 设置输入流参数
        流可以是字符流或者字节流都可
        字节流:parser.setInput(InputStream in, String encoding)
            > in:对应文件的字节输入流对象
            > encoding:输入流编码
        字符流:parser.setInput(Reader reader)
            > reader:对应文件的字符输入流对象
    
    * 获得当前的事件类型
        事件类型:
            该解析Xml的过程是自上而下一行一行的解析,
            当指针指在文档开头时,对应的事件类型是 START_DOCUMENT,
            当指针指在开始节点处时,对应的事件类型是 START_TAG,
            当指针指在结束节点时,对应的事件类型是 END_TAG,
            当指针指在文档结尾时,对应的事件类型是 END_DOCUMENT。
            当指针指在开始标签和结束标签之间的文本时,事件类型是 TEXT
        需要用到事件类型常量有:
            ** XmlPullParser.START_DOCUMENT --> 表示文档的开始
            ** XmlPullParser.END_DOCUMENT --> 表示文档的结尾
            ** XmlPullParser.START_TAG --> 表示一个节点的开始
            ** XmlPullParser.END_TAG --> 表示一个节点的结束
            ** XmlPullParser.TEXT --> 表示开始节点和结束节点之间的文本
        int parser.getEventType():返回当前的事件类型
    
    * 循环判断当前的事件类型,只要事件类型不等于END_DOCUMENT,就表示没有解析到文档的结尾,循环处理操作
        循环中先判断事件类型是开始节点事件类型还是结束节点事件类型,根据不同对的事件类型做不同的操作。
        操作中常用到的方法:
            parser.getName():返回当前指针所处的节点名称,也就是标签名;
            parser.nextText():取出当前指针所处节点中的文本内容(开始标签和结束标签之间的内容)
            parser.getText():该方法配合常量TEXT一起使用,只有当事件类型为TEXT时,才可使用getText()方法取出
                当前指针所指的文本,取出的值与nextText()取出的相同。
            parser.getAttributeValue(int index):返回当前指针所指的节点的给定索引的属性值
                > index:节点中属性的索引,索引从0开始
            ......
    
    * 每循环一次,重新获取当前的事件类型,再次判断是否循环:
        eventType = parser.next();
    * 当eventType == END_DOCUMENT,xml文档解析结束。

上一篇:Android等宽字体


下一篇:笔记 - Java 进制和位运算