對于現(xiàn)代的操作系統(tǒng)而言,如何訪問數(shù)據(jù)、訪問文件系統(tǒng)都是不可或缺的一部分,在Android中,上層應(yīng)用訪問數(shù)據(jù)和文件系統(tǒng)通常是基于內(nèi)容提供器(Content Providers)的方式實現(xiàn)的。
Android在內(nèi)容提供器之外還提供了4種機制,如參數(shù)選擇(Preferences)、文件(Files)、數(shù)據(jù)庫(Databases)、網(wǎng)絡(luò)(Network)等來針對不同的數(shù)據(jù)類型執(zhí)行操作。
其中參數(shù)選擇機制主要用于配置< key,value>值,應(yīng)用于應(yīng)用程序內(nèi)部配置運行參數(shù)信息等場景,如開機啟動時的問候語、個性化設(shè)置等。在低端的操作系統(tǒng)中,此類數(shù)據(jù)一般存儲在NVRAM中,在高端的操作系統(tǒng)中,則通常保存在文件系統(tǒng)中。
利用Context.getSharedPreferences()方法可以依據(jù)參數(shù)名以不同的模式提取出配置信息,提取模式包括MODE_PRIVATE 、MODE_WORLD_READABLE、MODE_WORLD_ WRITEABLE等。對于Activity私有的參數(shù),則可以通過Activity.getPreferences()方法來提取參數(shù)。當需要在不同的應(yīng)用間分享信息時,則需要借助內(nèi)容提供器來進行。下面是一個實例:
代碼1-1 SharedPreferences
import android.app.Activity;
import android.content.SharedPreferences;
public class Calc extends Activity
{
public static final String PREFS_NAME="MyPrefsFile";
...
@Override
protected void onCreate(Bundle state)
{
super.onCreate(state);
. . .
// 獲取 參數(shù)
SharedPreferences settings=getSharedPreferences(PREFS_NAME, 0);
boolean silent=settings.getBoolean("silentMode", false);
setSilent(silent);
}
@Override
protected void onStop()
{
super.onStop();//保存參數(shù)
SharedPreferences settings=getSharedPreferences(PREFS_NAME, 0);
SharedPreferences.Editor editor=settings.edit();
editor.putBoolean("silentMode", mSilentMode);//提交變化
editor.commit();
}
}
由于復(fù)雜的數(shù)據(jù),如GPS數(shù)據(jù)、Theme等,需要利用文件的方式進行存儲。在Android中,對文件同樣提供了強大的支持,通過Context.openFileInput()方法可以讀文件,此方法在打開文件后會返回一個java.io.FileInputStream流對象供系統(tǒng)讀取信息,通過Context.openFileOutput()方法可以寫文件,此方法在打開文件后會返回一個java.io.FileOutputStream流對象供系統(tǒng)寫入信息。如果操作的文件是在編譯期生成并需要被放置在APK包中,則此類文件通常應(yīng)放置在res/raw/myDataFile處,當需要讀取時,可以通過Resources.openRawResource()方法進行讀取,Resources.openRawResource()方法會返回一個java.io.InputStream供用戶操作。
對于更復(fù)雜的數(shù)據(jù),如電話簿、短消息、號碼歸屬地等,通常會利用SQLite數(shù)據(jù)庫的方式來提供更便利的創(chuàng)建、檢索、存儲支持。另外,Android還為SQLite數(shù)據(jù)庫的一個封裝即內(nèi)容提供器,通過內(nèi)容提供器可以更簡潔的操作數(shù)據(jù)庫,當然在性能上會略有下降。
在Android中,SQLite應(yīng)放置在/data/data/package_name/databases_name目錄下。如果是在線游戲或者云計算等,可以通過Android API(如java.net.*、android.net.*)在服務(wù)器端存儲數(shù)據(jù)。
在Linux中,對于SQLite數(shù)據(jù)庫文件即*.db,可以通過sqliteman圖形界面工具來查看db文件。當然通過Sqlite3也可以在adb下通過命令行方式查看數(shù)據(jù)庫數(shù)據(jù)。
在Android的幫助文檔和示例中,對ContentProvider及其SQLiteDatabase都有比較豐富的描述,大家可以參閱。