Android中數(shù)據(jù)存儲(chǔ)的5種方法

數(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()外部

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容