Android 数据的存储

来源:互联网 发布:探测网络拓扑 编辑:程序博客网 时间:2024/05/17 08:15
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;
     }
0 0