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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...