《Android/OPhone開發完全講義》連載(7):使用SharedPreferences存取複雜資料

來源:互聯網
上載者:User
本文為《Android/OPhone開發完全講義》一書的內容連載。轉載請註明出處

    我們知道SharedPreferences只能儲存簡單類型的資料,例如,String、int等。如果想用SharedPreferences存取更 複雜的資料類型(類、映像等),就需要對這些資料進行編碼。我們通常會將複雜類型的資料轉換成Base64編碼,然後將轉換後的資料以字串的形式儲存在 XML檔案中。

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

http://commons.apache.org/codec/download_codec.cgi

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

    在本例中將一個Product類的對象執行個體和一個映像儲存在XML檔案中,並在程式重新運行後從XML檔案裝載Product對象和映像。下面是Product類的代碼:

package net.blogjava.mobile;
import java.io.Serializable;
// 需要序列化的類必須實現Serializable介面
public class Product implements Serializable
{
private String id;
private String name;
private float price;
// 此處省略了屬性的getter和setter方法
 

在存取資料之前,需要使用下面的代碼建立一個SharedPreferences對象。

mySharedPreferences = getSharedPreferences("base64",Activity.MODE_PRIVATE);

其中mySharedPreferences是在類中定義的SharedPreferences類型變數。

在儲存Product對象之前,需要建立Product對象,並將相應組件中的值賦給Product類的相應屬性。將Product對象儲存在XML檔案中的代碼如下:

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檔案中的代碼如下:

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對象的代碼如下:

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();

裝載映像的代碼如下: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組件上。

在 這裡需要提一下的是映像選擇。在本例中使用了res\drawable目錄中的除了icon.png外的其他映像。為了能列出這些映像,本例使用了 Java的反射技術來枚舉這些映像的資源ID。基本原理是枚舉R.drawable類中所有的Field,並獲得這些Field的值。如果採用這個方法, 再向drawable目錄中添加新的映像,或刪除以前的映像,並不需要修改代碼,程式就可以顯示最新的映像列表。枚舉映像資源ID的代碼如下:// 獲得R.drawable類中所有的Field
Field[] fields = R.drawable.class.getDeclaredFields();
for (Field field : fields)
{
if (!"icon".equals(field.getName()))
imageResIdList.add(field.getInt(R.drawable.class));
}

    運行本例後,單擊【選擇產品映像】按鈕,會顯示一個映像選擇對話方塊,1所示。選中一個映像後,關閉映像選擇對話方塊,並單擊【儲存】按鈕。如果儲存成功,將顯示2所示的提示對話方塊。當再次運行程式後,會顯示上次成功儲存的資料。


查看base64.xml檔案,會看到如下的內容:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="productImage">/9j/4AAQSkZJRgABAQAAAQABAAD/2wBDABDsyj7yK3</string>
<string name="product">rO0ABXNyABtuZXQuYmxvZ2phdmEubW9iaWxlLlByb2</string>
</map>

    注意:雖然可以採用編碼的方式通過SharedPreferences儲存任何類型的資料,但作者並不建議使用SharedPreferences儲存尺寸很大的資料。如果讀者要存取更

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.