Android 数据的存储
Android 数据的存储
Android提供了5种方式存储数据
(1)使用SharedPreferences存储数据,它是Android提供的用来存储一些简单配置信息的一种机制,采用了XML格式将数据存储到设备中。只能在同一个包内使用,不能在不同的包之间使用.
(2)文件存储数据;文件存储方式是一种较常用的方法,在Android中读取/写入文件的方法,与Java中实现I/O的程序是完全一样的,提供了openFileInput()和openFileOutput()方法来读取设备上的文件。
(3)SQLite数据库存储数据;SQLite是Android所带的一个标准的数据库,它支持SQL语句,它是一个轻量级的
使用文件如何对数据进行存储
传统方式:
获取路径:嵌入式数据库。
(4)使用ContentProvider存储数据;主要用于应用程序之间进行数据交换,从而能够让其他的应用保存或读取此Content Provider的各种数据类型。
(5)网络存储数据;通过网络上提供给我们的存储空间来上传(存储)和下载(获取)我们存储在网络空间中的数据信息。(XML,JSON)
以下讲述:文件,SharedPreferences,XML和JSON:
context.getFileDir() /data/data/包名/files/
context.getCacheDir() /data/data/包名/cache
eg:
File file = new File(context.getFilesDir(), "info.dat" );
openFileOutput()方法:
Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的。
context.openFileOutput("文件名",mode);
context.openFileInput("文件名");
eg:
FileOutputStream fos = context.openFileOutput("private.dat" ,Context. MODE_PRIVATE);
fos.write(text.getBytes());
fos.close();
第一参数:用于指定文件名称,不能包含路径分隔符“/” ,如果文件不存在,Android 会自动创建它。创建的文件保存在/data/data/<package name>/files目录,如: /data/data/cn.itcast.action/files/itcast.txt
第二参数:用于指定操作模式,有四种模式,分别为:
Context.MODE_PRIVATE = 0
Context.MODE_APPEND = 32768
Context.MODE_WORLD_READABLE = 1
Context.MODE_WORLD_WRITEABLE = 2
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;
MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
如果希望文件被其他应用读和写,可以传入:
openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);
把文件存放在SDCard:
1,权限
在程序中访问SDCard,你需要申请访问SDCard的权限。
在AndroidManifest.xml中加入访问SDCard的权限如下:
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2.判断sd是否可用.
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
Environment.getExternalStorageState()方法用于获取SDCard的状态,如果手机装有SDCard,并且可以进行读写,那么方法返回的状态等于Environment.MEDIA_MOUNTED。
获取SDCard目录
通用: File sdCardDir = Environment.getExternalStorageDirectory(); //得到 mnt/sdcard/
自定义: File saveFile = new File("/mnt/sdcard/itcast.txt");
eg:
String state = Environment.getExternalStorageState();
if (!Environment.MEDIA_MOUNTED .equals(state)) {
Toast. makeText(MainActivity.this, "SD卡未挂载" , 0);
return;
}
File file = new File(Environment.getExternalStorageDirectory(), "/info.dat");
FileOutputStream fos = new FileOutputStream(file);
fos.write(text.getBytes());
fos.close();
-----------------------
*搜索系统代码的技巧
搜索字符串 获取界面- > 查找关联的源代码
获取sd卡的大小 获取手机内存的大小 可用空间.
-------------------------
文件访问的权限
每一个应用程序系统都分配一个单独的用户.
所以一般情况下一个应用程序私有的文件别的应用是不可以访问的.
linux系统的文件访问权限.
XML
sharedpreference 配置文件 内部存储 xml文件.
Android平台给我们提供了一个SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数。
使用SharedPreferences保存数据,其背后是用xml文件存放数据,文件存放在/data/data/<package name>/shared_prefs目录下
保存:
private SharedPreferences sp;
sp = getSharedPreferences("itcast", Context.MODE_PRIVATE);
Editor editor = sharedPreferences.edit();//获取编辑器
editor.putString("name", "传智播客");
editor.putInt("age", 4);
editor.commit();//提交修改
getSharedPreferences(name,mode)方法:
第一个参数:用于指定该文件的名称,名称不用带后缀,后缀会由Android自动加上。
第二个参数:指定文件的操作模式,共有四种操作模式,这四种模式前面介绍使用文件方式保存数据时已经讲解过。如果希望SharedPreferences背后使用的xml文件能被其他应用读和写,可以指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE权限。
访问:
SharedPreferences sharedPreferences = getSharedPreferences("itcast", Context.MODE_PRIVATE);
String name = sharedPreferences.getString("name", "");
int age = sharedPreferences.getInt("age", 1);
getString()方法:
第二个参数为缺省值,如果preference中不存在该key,将返回缺省值
*如果访问其他应用中的Preference,前提条件是:该preference创建时指定了
----------------------------
使用Pull解析器解析XML文件
pull解析器的使用.
Xml.newPullParser(); 基于事件
XmlPullParser parser = Xml. newPullParser();
parser.setInput(is, "utf-8" );
int type = parser.getEventType();
while (type != XmlPullParser.END_DOCUMENT) {
switch (type) {
case XmlPullParser.START_TAG:
if ("weather" .equals(parser.getName())) {// 总的开始节点
channels = new ArrayList<Channel>(); // 初始化集合
} else if ("channel" .equals(parser.getName())) {// 某个城市的信息开始了.
channel = new Channel();
String id = parser.getAttributeValue(0);
channel.setId(Integer. parseInt(id));
}
break ;
case XmlPullParser.END_TAG:
if ("channel" .equals(parser .getName())) {
channels.add(channel);
channel = null;
}
break ;
}
type = parser.next();
}
----------------------------
使用XmlSerializer写出XML(Xml文件的序列化)
1.StringBuilder 拼装字符串
2.Xml.newSeralizer();
// 1,初始化一个 xml文件的序列化器
XmlSerializer serializer = Xml. newSerializer();
// 2.初始化序列器参数
File file = new File(Environment.getExternalStorageDirectory(),"users.xml");
FileOutputStream fos = new FileOutputStream(file);
serializer.setOutput(fos, "UTF-8");
// 3.开始写xml文件.
serializer.startDocument( "utf-8", true );
// <users>
serializer.startTag( null, "users" );
// <user>
serializer.startTag( null, "user" );
// <username></username>
serializer.startTag( null, "username" );
serializer.text( "这是用户名" );
serializer.endTag( null, "username" );
// <password></password>
serializer.startTag( null, "password" );
serializer.text( "这是用户名" );
serializer.endTag( null, "password" );
// </user>
serializer.endTag( null, "user" );
// </users>
serializer.endTag( null, "users" );
serializer.endDocument();
fos.close();
JSON
JSON可以将Java对象转成json格式的字符串,可以将json字符串转换成Java。比XML更轻量级,Json使用起来比较轻便和简单。JSON数据格式,在Android中被广泛运用于客户端和服务器通信,在网络数据传输与解析时非常方便。
两个主要的类:
JSONObject
这是系统中有关JSON定义的基本单元,其包含一对儿(Key/Value)数值。
JSONArray
它代表一组有序的数值。将其转换为String输出(toString)所表现的形式是用方括号包裹,数值以逗号”,”分隔(例如:[value1,value2,value3]
解析JSON
public List<Person> getPersonsByJSON() throws Exception {
URL url = new URL("http://192.168.1.100:8080/05.Web/persons.js");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(3000);
int code = conn.getResponseCode();
if (code == 200) {
InputStream in = conn.getInputStream();
return parseJSON(in);
}
throw new RuntimeException("网络异常: " + code);
}
private List<Person> parseJSON(InputStream in) throws Exception {
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[8192];
int length;
while ((length = in.read(buffer)) != -1)
out.write(buffer, 0, length);
in.close();
out.close();
String json = new String(out.toByteArray());
List<Person> list = new ArrayList<Person>();
JSONArray arr = new JSONArray(json); // 把String封装成JSON数组
for (int i = 0; i < arr.length(); i++) { // 遍历JSON数组
JSONObject obj = arr.getJSONObject(i); // 获取每个JSON对象
Person p = new Person();
p.setId(obj.getInt("id")); // 从JSON对象中获取"id"字段的值
p.setName(obj.getString("name"));
p.setAge(obj.getInt("age"));
list.add(p);
}
return list;
}
Android 数据的存储
Android提供了5种方式存储数据
(1)使用SharedPreferences存储数据,它是Android提供的用来存储一些简单配置信息的一种机制,采用了XML格式将数据存储到设备中。只能在同一个包内使用,不能在不同的包之间使用.
(2)文件存储数据;文件存储方式是一种较常用的方法,在Android中读取/写入文件的方法,与Java中实现I/O的程序是完全一样的,提供了openFileInput()和openFileOutput()方法来读取设备上的文件。
(3)SQLite数据库存储数据;SQLite是Android所带的一个标准的数据库,它支持SQL语句,它是一个轻量级的
使用文件如何对数据进行存储
传统方式:
获取路径:嵌入式数据库。
(4)使用ContentProvider存储数据;主要用于应用程序之间进行数据交换,从而能够让其他的应用保存或读取此Content Provider的各种数据类型。
(5)网络存储数据;通过网络上提供给我们的存储空间来上传(存储)和下载(获取)我们存储在网络空间中的数据信息。(XML,JSON)
以下讲述:文件,SharedPreferences,XML和JSON:
context.getFileDir() /data/data/包名/files/
context.getCacheDir() /data/data/包名/cache
eg:
File file = new File(context.getFilesDir(), "info.dat" );
openFileOutput()方法:
Activity提供了openFileOutput()方法可以用于把数据输出到文件中,具体的实现过程与在J2SE环境中保存数据到文件中是一样的。
context.openFileOutput("文件名",mode);
context.openFileInput("文件名");
eg:
FileOutputStream fos = context.openFileOutput("private.dat" ,Context. MODE_PRIVATE);
fos.write(text.getBytes());
fos.close();
第一参数:用于指定文件名称,不能包含路径分隔符“/” ,如果文件不存在,Android 会自动创建它。创建的文件保存在/data/data/<package name>/files目录,如: /data/data/cn.itcast.action/files/itcast.txt
第二参数:用于指定操作模式,有四种模式,分别为:
Context.MODE_PRIVATE = 0
Context.MODE_APPEND = 32768
Context.MODE_WORLD_READABLE = 1
Context.MODE_WORLD_WRITEABLE = 2
Context.MODE_PRIVATE:为默认操作模式,代表该文件是私有数据,只能被应用本身访问,在该模式下,写入的内容会覆盖原文件的内容,如果想把新写入的内容追加到原文件中。可以使用Context.MODE_APPEND
Context.MODE_APPEND:模式会检查文件是否存在,存在就往文件追加内容,否则就创建新文件。
Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE用来控制其他应用是否有权限读写该文件。
MODE_WORLD_READABLE:表示当前文件可以被其他应用读取;
MODE_WORLD_WRITEABLE:表示当前文件可以被其他应用写入。
如果希望文件被其他应用读和写,可以传入:
openFileOutput("itcast.txt", Context.MODE_WORLD_READABLE + Context.MODE_WORLD_WRITEABLE);
把文件存放在SDCard:
1,权限
在程序中访问SDCard,你需要申请访问SDCard的权限。
在AndroidManifest.xml中加入访问SDCard的权限如下:
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2.判断sd是否可用.
if(Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
Environment.getExternalStorageState()方法用于获取SDCard的状态,如果手机装有SDCard,并且可以进行读写,那么方法返回的状态等于Environment.MEDIA_MOUNTED。
获取SDCard目录
通用: File sdCardDir = Environment.getExternalStorageDirectory(); //得到 mnt/sdcard/
自定义: File saveFile = new File("/mnt/sdcard/itcast.txt");
eg:
String state = Environment.getExternalStorageState();
if (!Environment.MEDIA_MOUNTED .equals(state)) {
Toast. makeText(MainActivity.this, "SD卡未挂载" , 0);
return;
}
File file = new File(Environment.getExternalStorageDirectory(), "/info.dat");
FileOutputStream fos = new FileOutputStream(file);
fos.write(text.getBytes());
fos.close();
-----------------------
*搜索系统代码的技巧
搜索字符串 获取界面- > 查找关联的源代码
获取sd卡的大小 获取手机内存的大小 可用空间.
-------------------------
文件访问的权限
每一个应用程序系统都分配一个单独的用户.
所以一般情况下一个应用程序私有的文件别的应用是不可以访问的.
linux系统的文件访问权限.
XML
sharedpreference 配置文件 内部存储 xml文件.
Android平台给我们提供了一个SharedPreferences类,它是一个轻量级的存储类,特别适合用于保存软件配置参数。
使用SharedPreferences保存数据,其背后是用xml文件存放数据,文件存放在/data/data/<package name>/shared_prefs目录下
保存:
private SharedPreferences sp;
sp = getSharedPreferences("itcast", Context.MODE_PRIVATE);
Editor editor = sharedPreferences.edit();//获取编辑器
editor.putString("name", "传智播客");
editor.putInt("age", 4);
editor.commit();//提交修改
getSharedPreferences(name,mode)方法:
第一个参数:用于指定该文件的名称,名称不用带后缀,后缀会由Android自动加上。
第二个参数:指定文件的操作模式,共有四种操作模式,这四种模式前面介绍使用文件方式保存数据时已经讲解过。如果希望SharedPreferences背后使用的xml文件能被其他应用读和写,可以指定Context.MODE_WORLD_READABLE和Context.MODE_WORLD_WRITEABLE权限。
访问:
SharedPreferences sharedPreferences = getSharedPreferences("itcast", Context.MODE_PRIVATE);
String name = sharedPreferences.getString("name", "");
int age = sharedPreferences.getInt("age", 1);
getString()方法:
第二个参数为缺省值,如果preference中不存在该key,将返回缺省值
*如果访问其他应用中的Preference,前提条件是:该preference创建时指定了
----------------------------
使用Pull解析器解析XML文件
pull解析器的使用.
Xml.newPullParser(); 基于事件
XmlPullParser parser = Xml. newPullParser();
parser.setInput(is, "utf-8" );
int type = parser.getEventType();
while (type != XmlPullParser.END_DOCUMENT) {
switch (type) {
case XmlPullParser.START_TAG:
if ("weather" .equals(parser.getName())) {// 总的开始节点
channels = new ArrayList<Channel>(); // 初始化集合
} else if ("channel" .equals(parser.getName())) {// 某个城市的信息开始了.
channel = new Channel();
String id = parser.getAttributeValue(0);
channel.setId(Integer. parseInt(id));
}
break ;
case XmlPullParser.END_TAG:
if ("channel" .equals(parser .getName())) {
channels.add(channel);
channel = null;
}
break ;
}
type = parser.next();
}
----------------------------
使用XmlSerializer写出XML(Xml文件的序列化)
1.StringBuilder 拼装字符串
2.Xml.newSeralizer();
// 1,初始化一个 xml文件的序列化器
XmlSerializer serializer = Xml. newSerializer();
// 2.初始化序列器参数
File file = new File(Environment.getExternalStorageDirectory(),"users.xml");
FileOutputStream fos = new FileOutputStream(file);
serializer.setOutput(fos, "UTF-8");
// 3.开始写xml文件.
serializer.startDocument( "utf-8", true );
// <users>
serializer.startTag( null, "users" );
// <user>
serializer.startTag( null, "user" );
// <username></username>
serializer.startTag( null, "username" );
serializer.text( "这是用户名" );
serializer.endTag( null, "username" );
// <password></password>
serializer.startTag( null, "password" );
serializer.text( "这是用户名" );
serializer.endTag( null, "password" );
// </user>
serializer.endTag( null, "user" );
// </users>
serializer.endTag( null, "users" );
serializer.endDocument();
fos.close();
JSON
JSON可以将Java对象转成json格式的字符串,可以将json字符串转换成Java。比XML更轻量级,Json使用起来比较轻便和简单。JSON数据格式,在Android中被广泛运用于客户端和服务器通信,在网络数据传输与解析时非常方便。
两个主要的类:
JSONObject
这是系统中有关JSON定义的基本单元,其包含一对儿(Key/Value)数值。
JSONArray
它代表一组有序的数值。将其转换为String输出(toString)所表现的形式是用方括号包裹,数值以逗号”,”分隔(例如:[value1,value2,value3]
解析JSON
public List<Person> getPersonsByJSON() throws Exception {
URL url = new URL("http://192.168.1.100:8080/05.Web/persons.js");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(3000);
int code = conn.getResponseCode();
if (code == 200) {
InputStream in = conn.getInputStream();
return parseJSON(in);
}
throw new RuntimeException("网络异常: " + code);
}
private List<Person> parseJSON(InputStream in) throws Exception {
ByteArrayOutputStream out = new ByteArrayOutputStream();
byte[] buffer = new byte[8192];
int length;
while ((length = in.read(buffer)) != -1)
out.write(buffer, 0, length);
in.close();
out.close();
String json = new String(out.toByteArray());
List<Person> list = new ArrayList<Person>();
JSONArray arr = new JSONArray(json); // 把String封装成JSON数组
for (int i = 0; i < arr.length(); i++) { // 遍历JSON数组
JSONObject obj = arr.getJSONObject(i); // 获取每个JSON对象
Person p = new Person();
p.setId(obj.getInt("id")); // 从JSON对象中获取"id"字段的值
p.setName(obj.getString("name"));
p.setAge(obj.getInt("age"));
list.add(p);
}
return list;
}