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文档解析结束。
相关文章
- 05-17android菜鸟学习笔记19----Android数据存储(三)XML文件的解析及序列化
- 05-17Android笔记(四十六) Android中的数据存储——XML(二)PULL解析
- 05-17android学习笔记45——android的数据存储和IO
- 05-17笔记 - Android - 5.数据存储和访问、XML等
- 05-17无废话Android之android下junit测试框架配置、保存文件到手机内存、android下文件访问的权限、保存文件到SD卡、获取SD卡大小、使用SharedPreferences进行数据存储、使用Pull解析器操作XML文件、android下操作sqlite数据库和事务(2)
- 05-17android(9)_数据存储和访问3_scard基本介绍
- 05-17Android自学笔记-8-Android数据存储1:文件、SharedPreferences和获取sd卡信息