數(shù)據(jù)存儲(chǔ)在開發(fā)中是使用最頻繁的,在這里主要介紹Android中實(shí)現(xiàn)數(shù)據(jù)存儲(chǔ)的5種方式,分別是
- 1 使用SharedPreferences存儲(chǔ)數(shù)據(jù)
- 2 文件存儲(chǔ)數(shù)據(jù)
- 3 SQLite數(shù)據(jù)庫存儲(chǔ)數(shù)據(jù)
- 4.使用ContentProvider存儲(chǔ)數(shù)據(jù)
- 5 網(wǎng)絡(luò)存儲(chǔ)數(shù)據(jù)
先說下,Preference,F(xiàn)ile,DataBase這三種方式分別對(duì)應(yīng)的目錄是
- Preference=====/data/data/PackageName/Shared_Pref,
- File===========/data/data/PackageName/files,
- DataBase======/data/data/PackageName/database
在Android中通常使用File存儲(chǔ)方式是用
Context.openFileOutput(String fileName,int mode)和Context.openFileInput(String fileName)
Context.openFileOutput(String fileName,int mode)生成的文件自動(dòng)存儲(chǔ)在data/data/PackageName/files目錄下,其全路徑是data/data/PackageName/files/filename。注意這里的filename不可以包含路徑分隔符(如“/”)。
通常來說,這種方式生成的文件只能在這個(gè)apk內(nèi)訪問。但這個(gè)結(jié)論是指Context.openFileInput(String fileName)的方式,使用這種方式,每個(gè)apk只可以訪問自己的/data/data/PackageName/files路徑下的文件,原因很簡(jiǎn)單,參數(shù)fileName中不可以包含路徑分隔符,Android會(huì)自動(dòng)在/data/data/PackageName/files目錄下尋找文件名為fileName的文件
一,使用SharedPreferences存儲(chǔ)方式
它是Android提供的用來存儲(chǔ)一些簡(jiǎn)單配置信息的一種機(jī)制,例如登陸用戶名的用戶名與密碼,其采用了Map數(shù)據(jù)結(jié)構(gòu)來存儲(chǔ)數(shù)據(jù),以鍵值的方式存儲(chǔ),可以簡(jiǎn)單的讀取與寫入,具體實(shí)例如下:
void readSharedPreference(){
String strName;
String strPassword;
SharedPreferences user = getSharedPreferences("user_info",0);
strName = user.getString("NAME","");
strPassword = user.getString("PASSWOED","");
}
void writeSharedPreference(){
SharedPreferences user = getSharedPreferences("user_info",0);
user.edit();
user.putString("NAME",strName);
user.putString("PASSWORD",strPassword);
user.commit();
}
數(shù)據(jù)讀取與寫入的方法都非常簡(jiǎn)單,只是在寫入的時(shí)候有些區(qū)別:先調(diào)用edit()使其處于編輯狀態(tài),然后才能修改數(shù)據(jù),最后使用commit()提交修改的數(shù)據(jù)。實(shí)際上SharedPreferences是采用了XML格式將數(shù)據(jù)存儲(chǔ)到設(shè)備中,在DDMS中的FileExplorer中的/data/data/PackageName/Shared_prefs目錄下,以上面的數(shù)據(jù)存儲(chǔ)結(jié)果為例,打開后可以看到一個(gè)user_info.xml的文件,打開后可以看到
<?xml version="1.0" encodintg="utf-8">
<map>
<string name = "NAME">moandroid</string>
<string password = "PASSWORD">SharedPreferences</string>
</map>
使用SharedPreferences是有些限制的:只能在同一個(gè)包內(nèi)使用,不能在不同的包之間使用。
二,文件存儲(chǔ)數(shù)據(jù)
文件存儲(chǔ)是一種比較常用的存儲(chǔ)方法,在Android中讀取/寫入文件的方法,與Java中I/O的程序完全是一樣的,提供了openFileInput()和openFileOutput()方法來讀取設(shè)備上的文件,F(xiàn)ilterInputStream和FilterOutPutStream等可以到Java io package說明中去詳細(xì)學(xué)習(xí),具體實(shí)例如下
String fn = “yzh.log”
FileInputStream fis = openFileInput();
FileOutputStream fos = openFileOutputStream(fn,Context.MODE_PRIVATE);
三:網(wǎng)絡(luò)存儲(chǔ)數(shù)據(jù)
網(wǎng)絡(luò)存儲(chǔ)方式,需要Android網(wǎng)絡(luò)數(shù)據(jù)包vao打交道,關(guān)于Android網(wǎng)絡(luò)數(shù)據(jù)包的詳細(xì)說明,可以閱讀AndroidSDK引用了JavaSDK的哪些package
四,ContentProvider
1.ContentProvider簡(jiǎn)介
當(dāng)應(yīng)用繼承ContentProvider類,并重寫該類用于提供數(shù)據(jù)和存儲(chǔ)的方法,就可以項(xiàng)其他應(yīng)用共享其數(shù)據(jù),雖然使用其他方法也可以對(duì)外共享數(shù)據(jù),但數(shù)據(jù)訪問的方式會(huì)因?yàn)榇鎯?chǔ)的方式不同而不同,如:采用文件方式對(duì)外共享數(shù)據(jù),需要進(jìn)行文件操作讀寫數(shù)據(jù),采用sharedpreference共享數(shù)據(jù),需要使用sharedpreference的API來讀寫數(shù)據(jù),而使用ContentProvider共享數(shù)據(jù)的好處是統(tǒng)一了數(shù)據(jù)訪問方式,
2.Uri簡(jiǎn)介
Uri由以下幾個(gè)部分組成
- scheme:ContentProvider(內(nèi)容提供者)的scheme已經(jīng)由Android所規(guī)定為:
content:// - 主機(jī)名(或Authority):用于唯一標(biāo)識(shí)這個(gè)ContentProvider,外部調(diào)用者可以根據(jù)這個(gè)標(biāo)識(shí)來找到它。
- 路徑:可以用來標(biāo)示我們要操作的數(shù)據(jù),路徑的構(gòu)建應(yīng)根據(jù)業(yè)務(wù)而定,如下:
- 遙操作content表中id為10的記錄,可以構(gòu)建這樣的路徑/contact/10
- 要操作表中id為10的記錄的name字段,可以構(gòu)建這樣的路徑/contact/10/name
- 要操作contact表中的所有記錄,可以構(gòu)建這樣的路徑:/contact?
- 要操作的數(shù)據(jù)不一定來自數(shù)據(jù)庫,也可以是文件等其他方式,如下
- 要操作xml文件中的contact節(jié)點(diǎn)下的name節(jié)點(diǎn),可以構(gòu)建這樣的路徑,/contact/name
- 如果要把一個(gè)字符串轉(zhuǎn)化為Uri,可以使用Uri的Parse()方法:
3UriMatcher、ContentUrist和ContentResolver簡(jiǎn)介
因?yàn)閁ri代表了要操作的數(shù)據(jù),所以我們經(jīng)常要解析Uri,并從Uri中獲取數(shù)據(jù),Android系統(tǒng)也提供了兩個(gè)用于操作Uri的工具類,分別為,UriMatcher和ContentUris。掌握它們的使用,會(huì)便于我們的開發(fā)工作。
UriMatcher
UriMatCher用于匹配Uri,用法如下
- 首先把你西藥匹配的Uri路徑全部給注冊(cè)上,如下
//常量UriMatcher.NO_MATCH標(biāo)示不匹配任何路徑的返回碼
UriMatcher uriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
//如果match()方法匹配content://com.yzh.sqlite/contact路徑,返回匹配碼為1
uriMatcher.addUri("com.yzh.sqlite","contact",1)
- 注冊(cè)完之后,就可以使用uri.match(uri)方法對(duì)輸入的Uri進(jìn)行匹配,如果匹配就返回匹配碼,匹配碼是調(diào)用addURI()方法傳入的第三個(gè)參數(shù),
ContentUri
ContentUri是用于獲取Uri路徑后面的ID部分,它有兩個(gè)比較實(shí)用的方法 - withAppendedId(uri,id)用于為路徑加上ID部分。
parseId(uri)方法用于從路徑中獲取ID,
ContentResolver:
當(dāng)外部應(yīng)用需要對(duì)ContentProvider中的數(shù)據(jù)進(jìn)行添加修改刪除查詢等操作的時(shí)候,可以使用ContentProvider類來完成,要獲取ContentResolver對(duì)象,可以使用,Activity提供的getContentResolver()方法,ContentResolver提供insert query delete等方法來操作數(shù)據(jù),
五、存儲(chǔ)空間
getFilesDir()獲取你app的內(nèi)部存儲(chǔ)空間,
Environment.getExternalStorageDirectory()外部