为了突出 Android 应用程序开发的本地存储方面,我这里介绍一个样例应用程序,它允许您测试各种类型 API 的执行。有 源代码 可供下载。该应用程序支持 图 1 中的操作。
图 1 列出了以下用例:
- 管理和存储首选项
- 从应用程序资产加载信息
- 将信息导出到内部内存、外部内存和本地数据库
- 从内部内存和本地数据库读取数据
- 清除已存储的信息
- 在屏幕上查看信息
通篇文章中,详细介绍了在应用程序中使用本地存储,如下:
- 从用户捕获首选项,本地存储起来,并在整个应用程序中加以使用。
- 从内部应用程序资产检索一个用户图片,存储在本地内部内存和外部内存中,并呈现在屏幕上。
- 从应用程序的资产检索一个 JSON 格式的好友列表。解析并存储在本地内部内存、外部内存和关系数据库中,再呈现在屏幕上。
样例应用程序定义了 表 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
类。
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 语句。
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 中,布局是用 XML 以声明式方法定义的(不是以编程方式);声明式 XML 是首选方法,因为它保持了源代码的清晰可读。清单 4 展示了 Preferences UI 的 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 的更多信息,请参见 参考资料。
/* * 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
更改已存储的首选项。
/ // 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(); } |
接下来,将介绍如何使用数据库来存储数据。
未完待续
感谢:http://hi.baidu.com/304580500/blog/item/04a246534690f51a0df3e37a.html