Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 關於android開發 >> Android筆記——Android中數據的存儲方式(二),android筆記

Android筆記——Android中數據的存儲方式(二),android筆記

編輯:關於android開發

Android筆記——Android中數據的存儲方式(二),android筆記


  我們在實際開發中,有的時候需要儲存或者備份比較復雜的數據。這些數據的特點是,內容多、結構大,比如短信備份等。我們知道SharedPreferences和Files(文本文件)儲存這種數據會非常的沒有效率。如果學過JavaWeb的朋友,首先可能想到的是數據庫。當然了數據庫是一個方案,那麼是否還有其他的解決方案呢?今天我們在講下Android筆記——Android中數據的存儲方式(一) 提到的除了SharedPreferencesFiles(文本文件)以外的其他幾種數據儲存方式:xml文件SQLite數據Network

1.3  例子

  3.  xml:

    3.1生成xml小案例:  

    下面我們有這樣一個小案例:就是短信備份。我們先分析一條短信的結構(如下圖)。

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="${relativePackage}.${activityClass}" > <Button android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="生成XML"/> </RelativeLayout> View Code

 

  •   java代碼:
    •    如何獲取系統所保存的短信,為了簡介展示,這裡就不用內容提供者了,我這裡用for循環直接虛擬一個組短信。我們知道手機裡的短信少則幾條多則上千條,每條短信有四個獨立屬性,那麼我們可以給每條短信封裝成一個javabean對象,每個對象有四個常規屬性。
    • Sms.java(javabean對象)
      package com.bokeyuan.createxml.domain;
      
      /**
       * 短信內容屬性的JavaBean
       * @author 
       *
       */
      public class Sms {
      
          private String address;
          private String date;
          private String type;
          private String body;
          
          public String getAddress() {
              return address;
          }
          public void setAddress(String address) {
              this.address = address;
          }
          public String getDate() {
              return date;
          }
          public void setDate(String date) {
              this.date = date;
          }
          public String getType() {
              return type;
          }
          public void setType(String type) {
              this.type = type;
          }
          public String getBody() {
              return body;
          }
          public void setBody(String body) {
              this.body = body;
          }
          public Sms(String address, String date, String type, String body) {
              super();
              this.address = address;
              this.date = date;
              this.type = type;
              this.body = body;
          }
          
          @Override
          public String toString() {
              return "Sms [address=" + address + ", date=" + date + ", type=" + type
                      + ", body=" + body + "]";
          }
          
      }
    •  MainActivity.java
      package com.bokeyuan.createxml;
      
      import java.io.File;
      import java.io.FileOutputStream;
      import java.io.IOException;
      import java.util.ArrayList;
      import java.util.List;
      
      import com.bokeyuan.createxml.domain.Sms;
      
      import android.app.Activity;
      import android.os.Bundle;
      import android.view.View;
      
      public class MainActivity extends Activity {
      
          private List<Sms> smslist;
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
              
              smslist = new ArrayList<Sms>();
              //假設10條短信
              for (int i = 0; i < 10; i++) {
                  Sms sms = new Sms("110" +i+i, System.currentTimeMillis() + "", "1", "你好,同志" +i);
                  smslist.add(sms);
              }
          }
          
          public void onClick(View v){
              //
              StringBuffer sb = new StringBuffer();
              //添加屬性到sb中
              sb.append("<?xml version=\"1.0\" encoding=\"utf-8\"?>");
              sb.append("<messages>");
              for (Sms sms : smslist) {
             sb.append("<message>");
                  
                  sb.append("<address>");
                  sb.append(sms.getAddress());
                  sb.append("</address>");
                  
                  sb.append("<date>");
                  sb.append(sms.getDate());
                  sb.append("</date>");
                  
                  sb.append("<type>");
                  sb.append(sms.getType());
                  sb.append("</type>");
                  
                  sb.append("<body>");
                  sb.append(sms.getBody());
                  sb.append("</body>");
                  
                  sb.append("</message>");
              }
              sb.append("</messages>");
              
              //寫入外出儲存路徑
              File file = new File("strorage/sdcard/sms.xml");
              try {
                  FileOutputStream fos = new FileOutputStream(file);
                  fos.write(sb.toString().getBytes());
                  fos.close();
              } catch (Exception e) {
                  // TODO Auto-generated catch block
                  e.printStackTrace();
              }
          }
      }
    • 權限:AndroidManifest.xml中添加android.permission.WRITE_EXTERNAL_STORAGE
  • 問題:實際開放中,當然不會像上面那樣拼接字符串生成xml文件,它是很大有弊端的,如下圖:
      • 生成xml文件,用浏覽器打開,那麼就會出現問題了:OPening and ending tag mismatch.
      • 其實谷歌有自己一套自己的生成解析xml的API,使用序列化器XmlSerializer生成xml就是其中的API
  •    3.2使用序列化器XmlSerializer生成xml

    • 布局文件:同上
    •  java代碼:    
      • Sms.java(javabean對象):同上  
      • MainActivity.java  
    package com.bokeyuan.xmlserilizer;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.ArrayList;
    import java.util.List;
    
    import org.xmlpull.v1.XmlSerializer;
    
    import com.bokeyuan.createxml.domain.Sms;
    
    import android.os.Bundle;
    import android.util.Xml;
    import android.view.View;
    import android.app.Activity;
    
    public class MainActivity extends Activity {
    
        List<Sms> smsList;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            
            smsList = new ArrayList<Sms>();
            
            //虛構10條短信
            for (int i = 0; i < 10; i++) {
                Sms sms = new Sms("138"+i+i, System.currentTimeMillis() + "", "1", "哈哈"+i);
                smsList.add(sms);
            }
        }
        
        public void click(View v){
            //使用xml序列化器生成xml文件
            //1.拿到序列化器對象
            XmlSerializer xs = Xml.newSerializer();
            
            File file = new File("sdcard/sms2.xml");
            try {
                //2.對序列化器進行初始化
                FileOutputStream fos = new FileOutputStream(file);
                //OutputStream :指定文件的保存路徑
                //encoding:指定生成的xml文件的編碼
                xs.setOutput(fos, "utf-8");
                
                //3.開始生成文件
                //生成頭結點
                xs.startDocument("utf-8", true);
                //生成開始標簽
                xs.startTag(null, "messages");
                
                for (Sms sms : smsList) {
                    xs.startTag(null, "message");
                    
                    xs.startTag(null, "address");
                    //生成文本節點
                    xs.text(sms.getAddress());
                    xs.endTag(null, "address");
                    
                    xs.startTag(null, "date");
                    //生成文本節點
                    xs.text(sms.getDate());
                    xs.endTag(null, "date");
                    
                    xs.startTag(null, "type");
                    //生成文本節點
                    xs.text(sms.getType());
                    xs.endTag(null, "type");
                    
                    xs.startTag(null, "body");
                    //生成文本節點
                    xs.text(sms.getBody() + "<body>");
                    xs.endTag(null, "body");
                    
                    xs.endTag(null, "message");
                }
                
                //生成結束標簽
                xs.endTag(null, "messages");
                
                //告訴序列化器,生成完畢
                xs.endDocument();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }      
        }  
    }
    • 權限:AndroidManifest.xml中添加android.permission.WRITE_EXTERNAL_STORAGE
    •  解決問題:
      •   同樣,添加一個字符串"<body>",導出xml文件。
      •   

          用浏覽器打開,發現沒有報錯,隨意添加的字符串"<body>",做為普通文本,而不是標簽顯示出來了。如下圖:

          

         這是因為,XmlSerializer序列化把標簽做一個字符的轉義,我麼把生成的xml文件用文本文件打開,可以看到:

        

        

     

     

     

     

     

      

    參考資料:

    Android應用開發基礎之數據存儲和界面展現(三)

     

    1. 上一頁:
    2. 下一頁:
    熱門文章
    閱讀排行版
    Copyright © Android教程網 All Rights Reserved