Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> 關於Android編程 >> Android SharedPreferences復雜存儲

Android SharedPreferences復雜存儲

編輯:關於Android編程

我們知道SharedPreferences只能保存簡單類型的數據,例如,String、int等。如果想用SharedPreferences存取更復雜的數據類型(類、圖像等),就需要對這些數據進行編碼。我們通常會將復雜類型的數據轉換成Base64編碼,然後將轉換後的數據以字符串的形式保存在 XML文件中。

Android SDK中並未提供Base64編碼和解碼庫。因此,需要使用第三方的jar包。在本例中使用了Apache Commons組件集中的Codec組件進行Base64編碼和解碼。讀者可以從如下的地址下載Codec組件的安裝包。

在Android工程目錄的lib子目錄中已經包含了Codec組件的jar包(commons-codec-1.4.jar),因此,讀者可以在該工程中直接使用Codec組件。

在本例中將一個Product類的對象實例和一個圖像保存在XML文件中,並在程序重新運行後從XML文件裝載Product對象和圖像。下面是Product類的代碼:

java代碼:
package eoe.mobile;


import java.io.Serializable;
// 需要序列化的類必須實現Serializable接口
public class Product implements Serializable{
private String id;
private String name;
private float price;


在存取數據之前,需要使用下面的代碼創建一個SharedPreferences對象。

mySharedPreferences = getSharedPreferences("base64",Activity.MODE_PRIVATE);其中mySharedPreferences是在類中定義的SharedPreferences類型變量。在保存Product對象之前,需要創建Product對象,並將相應組件中的值賦給Product類的相應屬性。將Product對象保存在XML文件中的代碼如下:

java代碼:

Product product = new Product();
product.setId(etProductID.getText().toString());
product.setName(etProductName.getText().toString());
product.setPrice(Float.parseFloat(etProductPrice.getText().toString()));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
// 將Product對象放到OutputStream中
oos.writeObject(product);
mySharedPreferences = getSharedPreferences("base64", Activity.MODE_PRIVATE);
// 將Product對象轉換成byte數組,並將其進行base64編碼
String productBase64 = new String(Base64.encodeBase64(baos.toByteArray()));
SharedPreferences.Editor editor = mySharedPreferences.edit();
// 將編碼後的字符串寫到base64.xml文件中
editor.putString("product", productBase64);
editor.commit();


保存圖像的方法與保存Product對象的方法類似。由於在保存之前,需要選擇一個圖像,並將該圖像顯示在ImageView組件中,因此,從ImageView組件中可以直接獲得要保存的圖像。將圖象保存在XML文件中的代碼如下:

java代碼:

ByteArrayOutputStream baos = new ByteArrayOutputStream();
// 將ImageView組件中的圖像壓縮成JPEG格式,並將壓縮結果保存在ByteArrayOutputStream對象中
((BitmapDrawable) imageView.getDrawable()).getBitmap().compress(CompressFormat.JPEG, 50, baos);
String imageBase64 = new String(Base64.encodeBase64(baos.toByteArray()));
// 保存由圖像字節流轉換成的Base64格式字符串
editor.putString("productImage", imageBase64);
editor.commit();


其中compress方法的第2個參數表示壓縮質量,取值范圍是0至100,0表示最高壓縮比,但圖像效果最差,100則恰恰相反。在本例中取了一個中間值50。

從XML文件中裝載Product對象和圖像是保存的逆過程。也就是從XML文件中讀取Base64格式的字符串,然後將其解碼成字節數組,最後將字節數組轉換成Product和Drawable對象。裝載Product對象的代碼如下:

java代碼:

String productBase64 = mySharedPreferences.getString("product", "");
// 對Base64格式的字符串進行解碼
byte[] base64Bytes = Base64.decodeBase64(productBase64.getBytes());
ByteArrayInputStream bais = new ByteArrayInputStream(base64Bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
// 從ObjectInputStream中讀取Product對象
Product product = (Product) ois.readObject();



裝載圖像的代碼如下:

java代碼:

String imageBase64 = mySharedPreferences.getString("productImage","");
base64Bytes = Base64.decodeBase64(imageBase64.getBytes());
bais = new ByteArrayInputStream(base64Bytes);
// 在ImageView組件上顯示圖像
imageView.setImageDrawable(Drawable.createFromStream(bais,"product_image"));



在上面的代碼中使用了Drawable類的createFromStream方法直接從流創建了Drawable對象,並使用setImageDrawable方法將圖像顯示在ImageView組件上。
  1. 上一頁:
  2. 下一頁:
熱門文章
閱讀排行版
Copyright © Android教程網 All Rights Reserved