Android教程網
  1. 首頁
  2. Android 技術
  3. Android 手機
  4. Android 系統教程
  5. Android 游戲
 Android教程網 >> Android技術 >> Android開發 >> 中級開發 >> Android 開發教程之本地數據存儲 API(一)

Android 開發教程之本地數據存儲 API(一)

編輯:中級開發

簡介: 對於需要跨應用程序執行期間或生命期而維護重要信息的應用程序來說,能夠在移動設備上本地存儲數據是一種非常關鍵的功能。作為一名開發人員,您經常需要存儲諸如用戶首選項或應用程序配置之類的信息。您還必須根據一些特征(比如訪問可見性)決定是否需要涉及內部或外部存儲器,或者是否需要處理更復雜的、結構化的數據類型。跟隨本文學習 android 數據存儲 API,具體來講就是首選項、SQLite 和內部及外部內存 API。

   

要跟隨本文,需要具備以下技能和工具:

  • 基本了解 Java™ 技術和如何使用 Eclipse(或者您喜歡的 IDE)
  • Java Development Kit(需要版本 5 或 6)
  • Eclipse(版本 3.4 或 3.5)
  • android SDK 和 ADT 插件

關於下載和設置信息,請參見本文末尾的 參考資料


樣例應用程序

為了突出 android 應用程序開發的本地存儲方面,我這裡介紹一個樣例應用程序,它允許您測試各種類型 API 的執行。有 源代碼 可供下載。該應用程序支持 圖 1 中的操作。


圖 1. 用例
樣例中的用例圖 
 

圖 1 列出了以下用例:

  • 管理和存儲首選項
  • 從應用程序資產加載信息
  • 將信息導出到內部內存、外部內存和本地數據庫
  • 從內部內存和本地數據庫讀取數據
  • 清除已存儲的信息
  • 在屏幕上查看信息

通篇文章中,詳細介紹了在應用程序中使用本地存儲,如下:

  • 從用戶捕獲首選項,本地存儲起來,並在整個應用程序中加以使用。
  • 從內部應用程序資產檢索一個用戶圖片,存儲在本地內部內存和外部內存中,並呈現在屏幕上。
  • 從應用程序的資產檢索一個 JSON 格式的好友列表。解析並存儲在本地內部內存、外部內存和關系數據庫中,再呈現在屏幕上。

樣例應用程序定義了 表 1 中的類。


表 1. 樣例應用程序中的類

類 說明 MainActivity Main Activity;大多數樣例代碼都駐留在這裡 FrIEnd 描繪一個 FrIEnd AppPreferenceActivity Preferences Activity 和屏幕 DBHelper 一個用於 SQLite 數據庫管理的幫助器類

示例應用程序使用了兩種類型的數據。第一種是應用程序首選項,存儲為名-值對。對於首選項,定義了以下信息:

  • 一個 filename,用於加載和存儲好友姓名列表
  • 一個 filename,用於加載和存儲用戶的一幅圖片
  • 一個 flag,如果設置了,那麼表示在應用程序啟動時自動刪除所有已存儲的數據

第二種類型的數據是好友列表。好友列表最初表示為 Facebook Graph API JSON 格式,包含一組姓名和好友對象(參見 清單 1)。


清單 1. 好友列表(Facebook Graph API JSON 格式)

				
{
   "data": [
      {
         "name": "Edmund Troche",
         "id": "500067699"
      }
   ]
}

 

上面的簡單格式使得 FrIEnd 對象和數據庫模式也簡單。清單 2 展示了 FrIEnd 類。


清單 2. FrIEnd 類

				
package com.cenriqueortiz.tutorials.datastore;

import android.graphics.Bitmap;

/**
 * Represents a Friend
 */
public class FrIEnd {
    public String id;
    public String name;
    public byte[] picture;
    public Bitmap pictureBitmap;;
}

 

除了 ID 和姓名之外,樣例應用程序也保留了對好友圖片的引用。盡管樣例應用程序沒有使用這些引用,但是您很容易擴展樣例應用程序,以從 Facebook 檢索圖片並顯示在主屏幕中。

數據庫模式包含單個表,用於存儲 FrIEnd 的信息。表有三列:

  • 惟一的 ID 或鍵
  • Facebook ID
  • FrIEnd 的姓名

清單 3 展示了相應關系表聲明的 SQL 語句。


清單 3. FrIEnd 數據庫表

				
db.execSQL("create table " + TABLE_NAME + " (_id integer primary key autoincrement, " 
+ " fid text not null, name text not null) ");

 

根據此信息,您可以在主屏幕上顯示姓名;使用 ID,您可以檢索所選用戶的額外詳細信息。在樣例應用程序中,只顯示了姓名。檢索額外信息留給您去試驗。注意,您很容易更改代碼,以直接轉向 Facebook。


存儲應用程序首選項

本節介紹 Preferences API 和屏幕。android API 提供很多方式處理首選項。其中一種方式是直接使用 SharedPreferences,並使用您自己的屏幕設計和首選項管理。第二種方法是使用PreferenceActivityPreferenceActivity 自動負責首選項如何呈現在屏幕上(默認情況下,看起來跟系統首選項一樣),並通過使用SharedPreferences 在用戶與每個首選項交互時自動存儲或保存首選項。

為了簡化樣例應用程序,使用一個 PreferenceActivity 來管理首選項和首選項屏幕(參見 圖 2)。首選項屏幕顯示兩個部分:Assets 和 Auto Settings。在 Assets 下,您可以為 FrIEnds List 和 Picture 選項輸入文件名。在 Auto Settings 下,您可以選中一個復選框,以便在啟動時刪除信息。


圖 2. 實現的 Preferences 屏幕
實現的 Preferences 屏幕的屏幕截圖 
 

在 圖 2 中,布局是用 XML 以聲明式方法定義的(不是以編程方式);聲明式 XML 是首選方法,因為它保持了源代碼的清晰可讀。清單 4 展示了 Preferences UI 的 XML 聲明。


清單 4. Preferences 屏幕的 XML 聲明

				
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
        XMLns:android="http://schemas.android.com/apk/res/android"
        android:id="@+id/prefs_screen"
        android:key="preferencescreen"
    >
    <PreferenceCategory android:title="Assets">
        <EditTextPreference 
            android:key="@string/prefs_assetname_friendslist_key"
            android:title="Friends List" 
            android:summary="Please enter filename"
            android:defaultValue="frIEnds.txt"
        />
        <EditTextPreference 
            android:key="@string/prefs_assetname_picture_key"
            android:title="Picture" 
            android:summary="Please enter filename"
            android:defaultValue="pict2.jpg"
        />
    </PreferenceCategory>

    <PreferenceCategory android:title="Auto Settings">
        <CheckBoxPreference
            android:key="@string/prefs_autodelete_key"
            android:title="Delete at Startup" 
            android:summary="Check to clear at startup"
            android:defaultValue="false"
        />
    </PreferenceCategory>
</PreferenceScreen>

 

PreferenceScreen 包含 EditTextPreference 的兩個實例、一個CheckBoxPreference 和兩個由 PreferenceCategory 定義的類別組(一個用於 Asset,另一個用於 Auto Settings)。

在樣例應用程序中,設計要求 Preference 屏幕使用菜單項進行調用。為此,使用一條 Intent 消息來調用叫做AppPreferenceActivity 的 Preference Screen Activity(參見 清單 5)。注意,我沒有詳細介紹 Intent 如何工作。關於 Intent 的更多信息,請參見 參考資料


清單 5. AppPreferenceActivity

				
/*
 * AppPreferenceActivity is a basic PreferenceActivity
 * C. Enrique Ortiz | http://CEnriqueOrtiz.com
 */
package com.cenriqueortiz.tutorials.datastore;

import android.os.Bundle;
import android.preference.PreferenceActivity;

public class AppPreferenceActivity extends PreferenceActivity {

    /**
     * Default Constructor
     */
    public AppPreferenceActivity() {}

   /** 
    * Called when the activity is first created. 
    *   Inflate the Preferences Screen XML declaration.
    */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        addPreferencesFromResource(R.xml.prefs); // Inflate the XML declaration
    }   

}

 

在樣例應用程序中,像 清單 6 中一樣,從菜單項處理程序中調用 Intent。


清單 6. 使用 Intent 調用 Preference Activity

				
/**
 * Invoked when a menu item has been selected
 */
@Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {

        // Case: Bring up the Preferences Screen
        case R.id.menu_prefs: // Preferences
            // Launch the Preference Activity
            Intent i = new Intent(this, AppPreferenceActivity.class);
            startActivity(i);
            break;

        case R.id.menu...:
            :
            break;

    }
    return true;
}

 

此外,您必須在 androidManifest XML 文件中定義所有的 Intent,如 清單 7 所示。


清單 7. 在 androidManifest.XML 中定義 Intent

				
:

<application android:icon="@drawable/icon" android:label="@string/app_name">

    :
    :
    
    <activity 
        android:name="AppPreferenceActivity" 
        android:label="Preferences">
    </activity>  

     :

</application>

 

回想一下,PreferenceActivity 使用 SharedPreferences 在用戶與首選項屏幕交互時自動存儲首選項。然後應用程序在執行各種任務時使用這些首選項。清單 8 展示了如何直接使用 SharedPreferences來加載存儲的首選項;關於加載的首選項在整個樣例代碼中是如何被使用的,您可以參考相應的樣例代碼。此外,清單 8 也展示了如何利用 SharedPreferences 直接存儲首選項,以防您喜歡自己管理首選項(不是通過 PrefenceActivity),使用了一個 Editor

清單 8 展示了如何使用 SharedPreferences 加載已存儲的首選項,以及如何使用 Editor 更改已存儲的首選項。


清單 8. 使用 SharedPreferences

				
/////////////////////////////////////////////////////////////
// The following methods show how to use the SharedPreferences
/////////////////////////////////////////////////////////////

/**
 * RetrIEves the Auto delete preference
 * @return the value of auto delete
 */
public boolean prefsGetAutoDelete() {
    boolean v = false;
    SharedPreferences sprefs = 
       PreferenceManager.getDefaultSharedPreferences(appContext); 
    String key = appContext.getString(R.string.prefs_autodelete_key);
    try {
        v = sprefs.getBoolean(key, false);
    } catch (ClassCastException e) {
    }
    return v;
}   

/**
 * Sets the auto delete preference
 * @param v the value to set
 */
public void  prefsSetAutoDelete(boolean v) {
    SharedPreferences sprefs = 
    PreferenceManager.getDefaultSharedPreferences(appContext); 
    Editor e = sprefs.edit();
    String key = appContext.getString(R.string.prefs_autodelete_key);               
    e.putBoolean(key, v);
    e.commit();
}

 

接下來,將介紹如何使用數據庫來存儲數據。


使用 SQLite 數據庫

android 通過 SQLite 提供對本地關系數據庫的支持。表中(定義在以下代碼清單中)匯總了樣例應用程序中使用的重要數據庫類。

樣例應用程序使用了一個 DBHelper 類來封裝一些數據庫操作(參見清單 9)。


清單 9. DBHelper

				
package com.cenriqueortiz.tutorials.datastore;

import Java.util.ArrayList;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

public class DBHelper extends SQLiteOpenHelper {

 

為數據庫版本、數據庫名稱和表名稱定義了很多常量(參見 清單 10)。


清單 10. 初始化 DBHelper

				
    private SQLiteDatabase db;
    private static final int DATABASE_VERSION = 1;
    private static final String DB_NAME = "sample.db";
    private static final String TABLE_NAME = "frIEnds";

    /**
     * Constructor
     * @param context the application context
     */
    public DBHelper(Context context) {
        super(context, DB_NAME, null, DATABASE_VERSION);
        db = getWritableDatabase();
    }

 

在准備好創建數據庫時,會調用 onCreate() 方法。在該方法中,創建表(參見 清單 11)。


清單 11. 創建數據庫表

				
    /**
     * Called at the time to create the DB.
     * The create DB statement
     * @param the SQLite DB
     */
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL(
                "create table " + TABLE_NAME + " (_id integer primary key autoincrement, 
" + " fid text not null, name text not null) ");
    }

 

insert() 方法在信息導出到數據庫時由 MainActivity 調用(參見清單 12)。


清單 12. 插入一行

				
    /**
     * The Insert DB statement
     * @param id the friends id to insert
     * @param name the friend's name to insert
     */
    public void insert(String id, String name) {
        db.execSQL("INSERT INTO frIEnds('fid', 'name') values ('"
                + id + "', '"
                + name + "')");
    }

 

deleteAll() 方法在清理數據庫時由 MainActivity 調用。它刪除表(參見 清單 13)。

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