編輯:中級開發
簡介: 對於需要跨應用程序執行期間或生命期而維護重要信息的應用程序來說,能夠在移動設備上本地存儲數據是一種非常關鍵的功能。作為一名開發人員,您經常需要存儲諸如用戶首選項或應用程序配置之類的信息。您還必須根據一些特征(比如訪問可見性)決定是否需要涉及內部或外部存儲器,或者是否需要處理更復雜的、結構化的數據類型。跟隨本文學習 android 數據存儲 API,具體來講就是首選項、SQLite 和內部及外部內存 API。
要跟隨本文,需要具備以下技能和工具:
關於下載和設置信息,請參見本文末尾的 參考資料。
回頁首
樣例應用程序
為了突出 android 應用程序開發的本地存儲方面,我這裡介紹一個樣例應用程序,它允許您測試各種類型 API 的執行。有 源代碼 可供下載。該應用程序支持 圖 1 中的操作。
圖 1. 用例
圖 1 列出了以下用例:
通篇文章中,詳細介紹了在應用程序中使用本地存儲,如下:
樣例應用程序定義了 表 1 中的類。
表 1. 樣例應用程序中的類
MainActivity
Main Activity;大多數樣例代碼都駐留在這裡
FrIEnd
描繪一個 FrIEnd
AppPreferenceActivity
Preferences Activity 和屏幕
DBHelper
一個用於 SQLite 數據庫管理的幫助器類
示例應用程序使用了兩種類型的數據。第一種是應用程序首選項,存儲為名-值對。對於首選項,定義了以下信息:
第二種類型的數據是好友列表。好友列表最初表示為 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 的信息。表有三列:
清單 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,並使用您自己的屏幕設計和首選項管理。第二種方法是使用PreferenceActivity。PreferenceActivity 自動負責首選項如何呈現在屏幕上(默認情況下,看起來跟系統首選項一樣),並通過使用SharedPreferences 在用戶與每個首選項交互時自動存儲或保存首選項。
為了簡化樣例應用程序,使用一個 PreferenceActivity 來管理首選項和首選項屏幕(參見 圖 2)。首選項屏幕顯示兩個部分:Assets 和 Auto Settings。在 Assets 下,您可以為 FrIEnds List 和 Picture 選項輸入文件名。在 Auto Settings 下,您可以選中一個復選框,以便在啟動時刪除信息。
圖 2. 實現的 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)。
ListView的右邊滾動滑塊啟用方法
很多開發者不知道ListVIEw列表控件的快速滾動滑塊是如何啟用的,這裡android開發網告訴大家,輔助滾動滑塊只需要一行代碼就可以搞定,如果你使用XML布局只需要在
使用android中的AIDL讓Service與Activity通信(service回調activity)
這幾天搞了搞AIDL,終於弄明白了在AIDL中讓Service調用Activity的方法代碼:首先建立一個ICallback.aidl文件,作為Activity中的回調
使用 Android 和 XML 構建動態用戶界面(一)
簡介: 有幾個網站從事一些非盈利服務,提供一些可輕松設置和使用的表單來進行民意測驗和數據收集。本教程介紹一個簡單的架構來為 android 設計類似的應用程
使用混合應用程序編程模型為 WebSphere Commerce 構建移動應用程序(2)
可翻頁的產品細節屏幕為增強產品細節屏幕的可用性,我們定義了一個自定義視圖控制器(ProductScrollVIEwController 類)來支持用戶通過翻頁