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

来源:http://www.cnblogs.com/McCa/archive/2016/01/11/5122090.html
-Advertisement-
Play Games

我們在實際開發中,有的時候需要儲存或者備份比較複雜的數據。這些數據的特點是,內容多、結構大,比如簡訊備份等。我們知道SharedPreferences和Files(文本文件)儲存這種數據會非常的沒有效率。如果學過JavaWeb的朋友,首先可能想到的是資料庫。當然了資料庫是一個方案,那麼是否還有...


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

1.3  例子

  3.  xml:

    3.1生成xml小案例:  

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

  我們看到一條簡訊包括:簡訊內容簡訊發送或接受的時間對方號碼類型type(1為接受,2為發送)四種屬性(欄位)。試著用之前講過SharedPreferences和Files(文本文件)分析怎麼備份?由於SharedPreferences保存的數據只是簡單的鍵值對形式,相對於簡訊這種結構複雜一些的,他顯然是沒法去儲存的。Files倒是可以做到,定義一個結構格式去保存,但在讀寫的時候就變得會非常麻煩沒有效率。

  •   XML備份原理:目前手機助手簡訊備份方式雖然多種,但XML格式仍然是比較經典的一種。把簡訊的全部按照一定的標簽格式,寫到XML文件中去,再把其保存到本地。從其原理可以看到我首先的就是要生成XML文件。
  •   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應用開發基礎之數據存儲和界面展現(三)

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 瞭解redis的朋友應該知道它有兩種數據持久化的方式,這裡我作一個簡單的介紹,AOF(append only file)和RDB.1.RDB這是一種比較常見的方式,採用 寫時複製 的方式,效率高,速度快,介紹一下寫時複製的機制:當 Redis 需要保存 dump.rdb 文件時, 伺服器執行以下操作...
  • oracle 資料庫應用 雖然代碼少但是很實用!--01.表空間create tablespace tp_hrdatafile 'E:\tp_hr01.dbf' size 10M, 'E:\tp_tak.dbf' size 10M autoextend on;alter tablespace tp_...
  • 買完688個人開發者賬號之後,如何進行真機測試呢??看下麵1.打開https://developer.apple.com然後,輸入我們買過688點那個App ID帳號和密碼哦!!一定是要支付過的!登陸後,如果你的頁面不像下麵的話,證明你的帳號不是支付過688元的帳號 (或者沒有激活。如果沒有激活請聯...
  • 應用銳化工具可以快速聚焦模糊邊緣,提高圖像中某一部位的清晰度或者焦距程度,使圖像特定區域的色彩更加鮮明。 在應用銳化工具時,若勾選器選項欄中的“對所有圖層取樣”覆選框,則可對所有可見圖層中的圖像進行銳化。但一定要適度。銳化不是萬能的,很容易使東西不真實。 在GPUImage中使用GPUImag...
  • 以前封裝過多個關於實現此功能的方法,雖然都實現了效果,但代碼和實現思路都相對複雜很多,而且並不比我下麵要說的這個方法好,這個也是我今天突發奇想來的,測量一下字體的寬度,然後根據這個點來計算 UILabel高度。這裡我使用的FontSize是13,我測出它的高度、寬度都是15像素,如果你使用其他號.....
  • 自然飽和度”是圖像整體的明亮程度,“飽和度”是圖像顏色的鮮艷程度。 “飽和度”與“色相/飽和度”命令中的“飽和度”選項效果相同,可以增加整個畫面的“飽和度”,但如調節到較高數值,圖像會產生色彩過飽和從而引起圖像失真。 在GPUImage中使用GPUImageVibranceFilter來實...
  • Date&Time這裡一共講解下麵6個:TextClock(文本時鐘),AnalogClock(模擬時鐘),Chronometer(計時器),DatePicker(日期選擇器),TimePicker(時間選擇器),CalendarView(日期視圖)這六個前面三個很少用到,後面三個如果在實際的應用中...
  • ScrollView(滾動條)的講解:一、對於ScrollView滾動條還是很好理解的,共有兩種水平和垂直,ScrollView和HorizontalScrollview,這個裡面不知道該總結寫什麼,說說幾個方法吧scrollView.fullScroll(ScrollView.FOCUS.DOWN...
一周排行
    -Advertisement-
    Play Games
  • 概述:本文代碼示例演示瞭如何在WPF中使用LiveCharts庫創建動態條形圖。通過創建數據模型、ViewModel和在XAML中使用`CartesianChart`控制項,你可以輕鬆實現圖表的數據綁定和動態更新。我將通過清晰的步驟指南包括詳細的中文註釋,幫助你快速理解並應用這一功能。 先上效果: 在 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • openGauss(GaussDB ) openGauss是一款全面友好開放,攜手伙伴共同打造的企業級開源關係型資料庫。openGauss採用木蘭寬鬆許可證v2發行,提供面向多核架構的極致性能、全鏈路的業務、數據安全、基於AI的調優和高效運維的能力。openGauss深度融合華為在資料庫領域多年的研 ...
  • 概述:本示例演示了在WPF應用程式中實現多語言支持的詳細步驟。通過資源字典和數據綁定,以及使用語言管理器類,應用程式能夠在運行時動態切換語言。這種方法使得多語言支持更加靈活,便於維護,同時提供清晰的代碼結構。 在WPF中實現多語言的一種常見方法是使用資源字典和數據綁定。以下是一個詳細的步驟和示例源代 ...
  • 描述(做一個簡單的記錄): 事件(event)的本質是一個委托;(聲明一個事件: public event TestDelegate eventTest;) 委托(delegate)可以理解為一個符合某種簽名的方法類型;比如:TestDelegate委托的返回數據類型為string,參數為 int和 ...
  • 1、AOT適合場景 Aot適合工具類型的項目使用,優點禁止反編 ,第一次啟動快,業務型項目或者反射多的項目不適合用AOT AOT更新記錄: 實實在在經過實踐的AOT ORM 5.1.4.117 +支持AOT 5.1.4.123 +支持CodeFirst和非同步方法 5.1.4.129-preview1 ...
  • 總說周知,UWP 是運行在沙盒裡面的,所有許可權都有嚴格限制,和沙盒外交互也需要特殊的通道,所以從根本杜絕了 UWP 毒瘤的存在。但是實際上 UWP 只是一個應用模型,本身是沒有什麼許可權管理的,許可權管理全靠 App Container 沙盒控制,如果我們脫離了這個沙盒,UWP 就會放飛自我了。那麼有沒... ...
  • 目錄條款17:讓介面容易被正確使用,不易被誤用(Make interfaces easy to use correctly and hard to use incorrectly)限制類型和值規定能做和不能做的事提供行為一致的介面條款19:設計class猶如設計type(Treat class de ...
  • title: 從零開始:Django項目的創建與配置指南 date: 2024/5/2 18:29:33 updated: 2024/5/2 18:29:33 categories: 後端開發 tags: Django WebDev Python ORM Security Deployment Op ...
  • 1、BOM對象 BOM:Broswer object model,即瀏覽器提供我們開發者在javascript用於操作瀏覽器的對象。 1.1、window對象 視窗方法 // BOM Browser object model 瀏覽器對象模型 // js中最大的一個對象.整個瀏覽器視窗出現的所有東西都 ...