? ? ? ?Android設(shè)備上的應(yīng)用都有一個沙盒目錄。將文件保存在沙盒中,可阻止其他應(yīng)用甚至是設(shè)備用戶的訪問。
? ? ? ?應(yīng)用沙盒目錄是/data/data/[your package name]的子目錄。例如,Criminalintent應(yīng)用的沙盒目錄是/data/data/com.bignerdranch.android.criminalintent。
? ? ? ?需要保存大量數(shù)據(jù)時,大多數(shù)應(yīng)用都不會使用類似txt這樣的普通文件。原因很簡單:假設(shè)將crime記錄寫入了這樣的文件,在僅需要修改crime標(biāo)題時,就得首先讀取整個文件的內(nèi)容,完成修改后再全部保存。數(shù)據(jù)量大的話,這將非常耗時。
? ? ? ?那么這該怎么辦呢?這時候就需要用到SQLite了。SQLite是類似于MySQL和Postgresql的開源關(guān)系型數(shù)據(jù)庫。不同于其他數(shù)據(jù)庫的是,SQLite使用單個文件存儲數(shù)據(jù),使用SQLite庫讀取數(shù)據(jù)。Android標(biāo)準(zhǔn)庫包含SQLite庫以及配套的一些Java輔助類。
? ? ? ?創(chuàng)建數(shù)據(jù)庫前,首先要清楚存儲什么樣的數(shù)據(jù)。CriminalIntent應(yīng)用要保存的是一條條crime記錄,這需要定義如下圖所示的crimes數(shù)據(jù)表。
crimes數(shù)據(jù)表
? ? ? ?定義Schema的方式眾多,如何選擇往往因人而異。處理類似的任務(wù),開發(fā)人員都有個共同的目標(biāo):“不要重復(fù)造輪子?!睂嶋H上,這也是人人都應(yīng)遵守的編程準(zhǔn)則:多花時間思考復(fù)用代碼的編寫和調(diào)用,避免在應(yīng)用中到處使用重復(fù)代碼。
? ? ? ?基于上述準(zhǔn)則,我們可以使用能統(tǒng)一定義模型層對象(如Crime)的ORM(對象關(guān)系映射)工具。不過,對于CriminalIntent應(yīng)用,南昌APP開發(fā)公司建議直接在Java代碼中定義描述表名和數(shù)據(jù)字段的數(shù)據(jù)庫schema。
? ? ? ?首先,我們來創(chuàng)建定義schema的Java類。創(chuàng)建時,命名類為CrimeDbSchema,同時在新建類對話框中輸入包名database.CrimeDbSchema。這樣,就可以將CrimeDbSchema.java文件放入專門的database包中,實現(xiàn)數(shù)據(jù)庫操作相關(guān)代碼的組織和歸類。
? ? ? 在CrimeDbSchema類中,再定義一個描述數(shù)據(jù)表的CrimeTable內(nèi)部類,如下代碼所示。
? ? ? ?定義CrimeTable內(nèi)部類(CrimeDbSchema.java)
? ? ? ?public class CrimeDbSchema {
? ? ? ?public static final class CrimeTable {
? ? ? ?public static final String NAME = "crimes";
? ? ? ?}
? ? ? ?}?
? ? ? ?CrimeTable內(nèi)部類唯一的用途就是定義描述數(shù)據(jù)表元素的String常量。首先要定義的是數(shù)據(jù)庫表名(CrimeTable.NAME)。
? ? ? ?接下來定義數(shù)據(jù)表字段
? ? ? ?定義數(shù)據(jù)表字段(CrimeDbSchema.java)
? ? ? ?public class CrimeDbSchema {
? ? ? ?public static final class CrimeTable {
? ? ? ?public static final String NAME = "crimes";
? ? ? ?public static final class Cols {
? ? ? ?public static final String UUID = "uuid";
? ? ? ?public static final String TITLE = "title";
? ? ? ?public static final String DATE = "date";
? ? ? ?public static final String SOLVED = "solved";
? ? ? ?}
? ? ? ?}
? ? ? ?}?
? ? ? ?有了這些數(shù)據(jù)表元素,就可以在Java代碼中安全地引用了。例如,CrimeTable.Cols.TITLE就是指crime記錄的title字段。此外,這種定義方式還給修改字段名稱或新增表元素帶來了方便。