數(shù)據(jù)存儲
數(shù)據(jù)存儲簡介和文件存儲
Android常見的三類四種數(shù)據(jù)存儲方式︰
Internal Storage (內(nèi)部存儲)
External Storage (外部存儲)
使用SharedPreferences存儲數(shù)據(jù)
文件存儲數(shù)據(jù)
SQLite數(shù)據(jù)庫存儲數(shù)據(jù)
Android提供的幾種存儲方式簡單介紹如下∶
SharedPreference:提供了一套完整的框架用來存儲基本類型數(shù)據(jù)的鍵值對,例如︰Long . int、float、String等。
Internal Storage :手機(jī)的內(nèi)部存儲設(shè)備是以文件的形式保存數(shù)據(jù)的,因此只能在本程序使用,外部的應(yīng)用程序無法訪問該文件,同時(shí)文件數(shù)據(jù)也是臨時(shí)性的,當(dāng)卸載本程序時(shí),該文件也會自動被刪除。
External Storage :手機(jī)的外接存儲設(shè)備也是以文件的形式存儲數(shù)據(jù),可以存儲數(shù)據(jù)量較大的公共數(shù)據(jù)。外接的存儲設(shè)備可以是移動式的(比如SD卡),應(yīng)該注意的是,對于保存在外接設(shè)備的數(shù)據(jù)是不安全的,因?yàn)樵撛O(shè)備中的數(shù)據(jù)對外部公開,用戶可以進(jìn)行讀寫操作,甚至刪除數(shù)據(jù)。
SQLite Database : SQLite是標(biāo)準(zhǔn)的關(guān)系型數(shù)據(jù)庫,用戶可以使用標(biāo)準(zhǔn)的SQL語句進(jìn)行數(shù)據(jù)的增刪改查,該數(shù)據(jù)庫具有小巧、獨(dú)立性高、隔離性好、安全性高、跨平臺和多語言接口等優(yōu)點(diǎn),它被內(nèi)置在Android系統(tǒng)中,用于存儲一些較復(fù)雜類型的數(shù)據(jù),且系統(tǒng)中比較大的數(shù)據(jù)一般也都是用SQLite數(shù)據(jù)庫存儲(這也是Google工程師為什么在Android中內(nèi)置該數(shù)據(jù)庫的原因)。
內(nèi)部存儲
內(nèi)部存儲路徑中的文件是分類存儲的,無法干涉,除了cache目錄,其它目錄系統(tǒng)不會自動創(chuàng)建
除了files目錄,別的目錄幾乎都是無法手動操作的
其它app幾乎無法訪問內(nèi)部存儲中的數(shù)據(jù),除了用非法手段或者主動暴露
內(nèi)部存儲目錄下的文件夾及文件會隨著app的卸載而被系統(tǒng)自動刪除
Build.VERSION_CODES.LOLLIPOP及以上版本新增的API
Build.VERSION_CODES.N及以上版本新增的API
getDir( “test", MODE_PRIVATE) /data/data/0/包名/app_test
getNoBackupFilesDir() /data/data/0/包名/no_backup
getCodeCacheDir() /data/data/0/包名/code_cache
getDataDir() /data/data
通過Environment
通過上下文Context
Environment.getDataDirectory() /data
Environment.getRootDirectory() /system
Environment.getDownloadCacheDirectory() /cache
getCacheDir() /data/data/0/包名/cache
getFilesDir() /data/data/0/包名/files
獲取內(nèi)部存儲路徑和API對應(yīng)關(guān)系
獲取內(nèi)部存儲路徑和API對應(yīng)關(guān)系
特點(diǎn)
外部存儲
私有目錄不需要訪問權(quán)限
Android在外部存儲空間中也提供了特殊目錄供app存放私有文件,該路徑為︰/storage/emulated/0/Android/data/包名/((注意:應(yīng)用安裝之后此路徑是沒有對應(yīng)的應(yīng)用文件夾的,需要手動調(diào)用對應(yīng)的API創(chuàng)建)
獲取私有目錄路徑
getObbDir() /storage/emulated/0/Android/obb/com.xxx.autorepair
getExternalCacheDir() /storage/emulated/0/Android/data/com.xxx.autorepair/cache
getExternalFilesDir(null) /storage/emulated/0/Android/data/com.xxx.autorepair/files
私有目錄
在API級別29中不贊成使用此方法。為了提高用戶隱私,不建議直接訪問共享/外部存儲設(shè)備。當(dāng)應(yīng)用定位到時(shí)Build.VERSION_CODES.Q,此方法返回的路徑不再可供應(yīng)用直接訪問。應(yīng)用程序可以繼續(xù)訪問內(nèi)容通過遷移到替代品,如存儲在共享/外部存儲Context#getExternalFilesDir(String),MediaStore或Intent#ACTION_OPEN_DOCUMENT。
為什么需要分區(qū)存儲
亂占空間
隨意讀取用戶的數(shù)據(jù)
隨意讀取應(yīng)用的數(shù)據(jù)
私有存儲(Private Storage):每個(gè)應(yīng)用在內(nèi)部存儲中都擁有自己的私有目錄 "/data/data/packageName”,其它應(yīng)用看不到,彼此也無法訪問到該目錄
共享存儲(Shared Storage):除了私有存儲以外,其它的一切都被認(rèn)定是共享 存儲,如︰媒體集(Media Collection)和SD卡外部應(yīng)用存儲目錄
Android中存儲可以分為兩大類∶私有存儲和共享存儲
如此寬泛的存儲權(quán)限,這就使得Android中某些應(yīng)用程序大量的存在如下問題∶
Android 10中的分區(qū)存儲的出現(xiàn),就是為了解決上述的問題,即主要就是為了限制應(yīng)用程序過于寬泛的存儲權(quán)限!
Android10中分區(qū)存儲設(shè)計(jì)遵循的三個(gè)原則
更好的文件屬性:系統(tǒng)應(yīng)用知道什么文件屬于哪一個(gè)app,讓用戶更加容易管理他們自己的文件。當(dāng)app 被卸載了,被應(yīng)用創(chuàng)建的內(nèi)容,除非用戶希望保留,否則不應(yīng)該保留下來。
用戶的數(shù)據(jù)安全:當(dāng)用戶下載文件,比如敏感的電子郵件附件,這些文件對大多數(shù)應(yīng)用程序都不應(yīng)該可見。
應(yīng)用的數(shù)據(jù)安全∶當(dāng)app將特定于應(yīng)用程序的文件寫入外部存儲時(shí),其他應(yīng)用程序不應(yīng)該可見這些文件。
Android10中分區(qū)存儲設(shè)計(jì)的七個(gè)注意事項(xiàng)
應(yīng)用訪問自己的應(yīng)用目錄不受限制(包括內(nèi)部和外部)無需任何權(quán)限
應(yīng)用向媒體集和下載目錄提供文件,如果您要想保存圖片、視頻、音頻、文檔,無需任何權(quán)限
不再提供寬泛的共享存儲(Share Storage ),讀寫存儲權(quán)限只能訪問提供的媒體集(圖片集、視頻集、音頻集)
位置元數(shù)據(jù)限制,獲取圖片上的位置等信息需要請求權(quán)限,如果不請求權(quán)限,讀取圖片的信息的時(shí)候,位置元數(shù)據(jù)將會被刪除
讀取PDF或其他類型的文件,需要調(diào)用系統(tǒng)的文件選擇器(Storage Access Framerwork API )
在媒體集或應(yīng)用目錄之外,寫任何文件都需要系統(tǒng)的文件選擇器,這樣用戶能選擇并確認(rèn)將文件存在哪里
requestLegacyExternalStorage開關(guān)值,在清單文件配置,如果開啟了,存儲權(quán)限就會像之前版本中的Android一樣運(yùn)作
具體分區(qū)存儲權(quán)限的介紹
應(yīng)用外部特定目錄中的文件(使用getExternalFilesDir()訪問)。
應(yīng)用自己創(chuàng)建的照片、視頻和音頻(通過MediaStore訪問)。
默認(rèn)情況下,對于targetSdkVersion大于等于29的應(yīng)用,其訪問權(quán)限范圍限定為分區(qū)存儲。此應(yīng)用無需請求與存儲相關(guān)的用戶權(quán)限,即可以查看外部存儲中以下類型的文件:
分區(qū)存儲將影響在Android10系統(tǒng)首次安裝啟動、且targetSdkVersion>=29的應(yīng)用。需要訪問和共享外部存儲文件的應(yīng)用會受到影響,需要進(jìn)行兼容性適配。
影響范圍
如果應(yīng)用最先安裝在Android 10以下的系統(tǒng),
然后系統(tǒng)通過Fota升級到Android 10
應(yīng)用通過更新升級到targetSdkVersion >= 29
targetSdkVersion <= 28,不受影響。
如果targetSdkVersion >= 29,默認(rèn)情況應(yīng)用外部存儲可見性將被過濾,應(yīng)用需要對分區(qū)存儲進(jìn)行適配。
在Android 10上運(yùn)行的應(yīng)用∶
還有值得注意的是以下兩種情況比較特殊,不會受到分區(qū)存儲的影響︰
分區(qū)存儲權(quán)限體現(xiàn)在以下五個(gè)方面:
媒體文件需要媒體目錄進(jìn)行創(chuàng)建,不能在圖片目錄創(chuàng)建音頻文件,如果您想訪問由其他應(yīng)用創(chuàng)建的媒體文件,您就要請求外部存儲讀取權(quán)限。如果您沒有獲得媒體位置權(quán)限,就仍然會在讀取由其他應(yīng)用創(chuàng)建的媒體文件時(shí),被系統(tǒng)拿掉位置信息。
非媒體文件必須在 Downloads下創(chuàng)建,所有Dowonloads目錄下也只能創(chuàng)建像PDF 或其它的非媒體文件
讀取由其他應(yīng)用創(chuàng)建的非媒體文件,也將需要Storage Access Framerwork API
所有的應(yīng)用都盡量繼續(xù)使用MediaStore,因?yàn)楹笈_文件路徑 ”/sdcard/DCIM/xxx.JPG”請求或使用文件路徑"/sdcard/DCIM/xxx.JPG"進(jìn)行I/O流請求都是代理給MediaStore類。
不建議直接使用媒體文件訪問路徑“/sdcard/DCIM/xxx.JPG]”,應(yīng)用的性能會略有下降。
可以在應(yīng)用獲取那些其他應(yīng)用創(chuàng)建添加的媒體文件的時(shí)候,直接刪除這些元數(shù)據(jù)
如果想要獲取圖片的位置信息,需要聲明請求權(quán)限 ACCESS_MEDIA_LOCATION,用戶在Settings UI里看不到這個(gè)權(quán)限,但是它屬于運(yùn)行時(shí)權(quán)限,所以必須要在Manifest里聲明該權(quán)限,并在運(yùn)行時(shí)同時(shí)請求該權(quán)限和讀取外部存儲權(quán)限
MediaStore.setRequireOriginal ()∶獲取當(dāng)前磁盤的體積容量
下載文件集,和媒體文件集一樣,無需請求任何權(quán)限就能在這個(gè)集中添加、編輯、刪除非媒體文件。
與媒體文件不同的是,即使有讀取外部存儲權(quán)限,也是不允許訪問由其他應(yīng)用創(chuàng)建添加的非媒體文件。想要取得權(quán)限,需要通過調(diào)用Storage Access FramerworkAPI,啟動系統(tǒng)文件選擇器,讓用戶可以進(jìn)行選擇可以訪問哪些文件和目錄。
如果用戶允許應(yīng)用訪問一個(gè)文件,那么這個(gè)權(quán)限將是完整的權(quán)限,應(yīng)用無需其他額外的任何權(quán)限,就可以任意的讀取、編輯刪除媒體文件和非媒體文件。
如上做法,使得用戶就能獲得完整的控制權(quán),更好的管理應(yīng)用在何時(shí)訪問敏感的非媒體文件
Android 10中,自己的app無需任何權(quán)限就能向媒體集添加文件,同時(shí)也可以編輯和刪除自己添加的媒體文件。
如果要讀取并操作并非自已的應(yīng)用所創(chuàng)建的媒體文件,就需要讀取外部存儲權(quán)限,如果用戶沒有同意,則應(yīng)用將無法編輯和刪除并非自己的應(yīng)用所創(chuàng)建的媒體文件。
以上做法使得應(yīng)用想編輯和刪除媒體文件時(shí),用戶就能獲得完整的控制權(quán)
媒體文件集∶用于和其它應(yīng)用分享媒體文件(圖片、音頻、視頻文件)
下載文件集︰用于和其它應(yīng)用分享非媒體文件(非圖片、非音頻、非視頻文件)
限制位置元數(shù)據(jù)∶對媒體文件中敏感的元數(shù)據(jù)進(jìn)行了訪問權(quán)限的限制,主要限制位置元數(shù)據(jù)
媒體文件訪問路徑:Android 10鎖定了公共目錄文件路徑的權(quán)限。
MediaStore的強(qiáng)制性:文件需要在適當(dāng)?shù)哪夸涍M(jìn)行創(chuàng)建
Andriod10中的分區(qū)存儲小結(jié)
特定于應(yīng)用的目錄->無需權(quán)限->訪問方法getExternalFilesDir () ->卸載應(yīng)用時(shí)移除文件
媒體集合(照片、視頻、音頻)->需要權(quán)限READ_EXTERNAL_STORAGE(僅當(dāng)訪問其他應(yīng)用的文件時(shí))->訪問方法MediaStore ->卸載應(yīng)用時(shí)不移除文件
下載內(nèi)容(文檔和電子書籍)->無需權(quán)限->存儲訪問框架(加載系統(tǒng)的文件選擇器)->卸載應(yīng)用時(shí)不移除文件
I/O流操作文件
FileInputStream openFileInput(String name)
FileOutputStream openFileOuput(String name,int mode)
其中參數(shù)mode用于指定輸出流的模式
Android支持通過I/O流方式來訪問移動設(shè)備中的存儲文件
Context對象提供了openFileInput()和openFileOuput()方法分別來得文件的輸入流和輸出流︰
讀寫SD卡文件
SD卡 ( Secure Digital Memory Card )是一種基于半導(dǎo)體快閃記憶器的多功能存儲卡,具有大容量、高性能、安全高等多種特點(diǎn),被廣泛地用于便攜式移動設(shè)備,例如手機(jī)、數(shù)碼相機(jī)、PDA等。SD卡極大地?cái)U(kuò)充了手機(jī)的存儲能力。
使用Environment.getExternalStorageState()方法判斷是否插入SD卡,且應(yīng)用程序具有讀寫SD卡的權(quán)限
使用Environment.getExternalStorageDirectory()方法獲取SD卡的目錄
使用文件輸入流(FileInputStream、FileReader )或輸出流(FileOutputStream、FileWriter )來讀寫SD卡中的文件
讀寫SD卡文件時(shí),需要以下步驟︰
Android權(quán)限動態(tài)申請
Google在Android 6.0開始引入了權(quán)限申請機(jī)制,將所有權(quán)限分成了正常權(quán)限和危險(xiǎn)權(quán)限。應(yīng)用的相關(guān)功能每次在使用危險(xiǎn)權(quán)限時(shí)需要?jiǎng)討B(tài)的申請并得到用戶的授權(quán)才能使用。
正常權(quán)限︰不會直接給用戶隱私權(quán)帶來風(fēng)險(xiǎn)。如果你的應(yīng)用在其清單中列出了正常權(quán)限,系統(tǒng)將自動授予該權(quán)限。
危險(xiǎn)權(quán)限︰會授予應(yīng)用訪問用戶機(jī)密數(shù)據(jù)的權(quán)限。如果你的應(yīng)用在其清單中列出了正常權(quán)限,系統(tǒng)將自動授予該權(quán)限。如果你列出了危險(xiǎn)權(quán)限,則用戶必須明確批準(zhǔn)您的應(yīng)用使用這些權(quán)限。
Android系統(tǒng)權(quán)限分為兩類∶
重要方法:
ContextCompat.checkSelfPermission:檢查應(yīng)用是否具有某個(gè)危險(xiǎn)權(quán)限。如果應(yīng)用具有此權(quán)限,方法將返回PackageManager.PERMISSION_GRANTED,并且應(yīng)用可以繼續(xù)操作。如果應(yīng)用不具有此權(quán)限,方法將返回PackageManager.PERMISSION_DENIED,且應(yīng)用必須明確向用戶要求權(quán)限。
ActivityCompat.requestPermissions :應(yīng)用可以通過這個(gè)方法動態(tài)申請權(quán)限,調(diào)用后會彈出一個(gè)對話框提示用戶授權(quán)所申請的權(quán)限。
ActivityCompat.shouldShowRequestPermissionRationale :如果應(yīng)用之前請求過此權(quán)限但用戶拒絕了請求,此方法將返回true。如果用戶在過去拒絕了權(quán)限請求,并在權(quán)限請求系統(tǒng)對話框中選擇了Don't ask again選項(xiàng),此方法將返回false。如果設(shè)備規(guī)范禁止應(yīng)用具有該權(quán)限,此方法也會返回false。
onRequestPermissionsResult :當(dāng)應(yīng)用請求權(quán)限時(shí),系統(tǒng)將向用戶顯示一個(gè)對話框。當(dāng)用戶響應(yīng)時(shí),系統(tǒng)將調(diào)用應(yīng)用的onRequestPermissionsResult()方法,向其傳遞用戶響應(yīng),處理對應(yīng)的場景。
Android XML數(shù)據(jù)解析
Android中常見的三種XML解析方法︰
DOM DOM是基于樹形結(jié)構(gòu)的的節(jié)點(diǎn)或信息片段的集合,允許開發(fā)人員使用DOM API遍歷XML樹、檢索所需數(shù)據(jù)。分析該結(jié)構(gòu)通常需要加載整個(gè)文檔和構(gòu)造樹形結(jié)構(gòu),然后才可以檢索和更新節(jié)點(diǎn)信息。
SAX SAX(Simple API for XML)解析器是一種基于事件的解析器,它的核心是事件處理模式,主要是圍繞著事件源以及事件處理器來工作的。當(dāng)事件源產(chǎn)生事件后,調(diào)用事件處理器相應(yīng)的處理方法,一個(gè)事件就可以得到處理。
PULL PULL解析器的運(yùn)行方式和SAX類似,都是基于事件的模式。不同的是,在PULL解析過程中,我們需要自己獲取產(chǎn)生的事件然后做相應(yīng)的操作,而不像SAX那樣由處理器觸發(fā)一種事件的方法,執(zhí)行我們的代碼。
三種XML解析方法的優(yōu)缺點(diǎn)及適用場景∶
DOM 由于DOM在內(nèi)存中以樹形結(jié)構(gòu)存放,因此檢索和更新效率會更高。但是對于特別大的文檔,解析和加載整個(gè)文檔將會很耗資源。
SAX SAX解析器的優(yōu)點(diǎn)是解析速度快,占用內(nèi)存少。非常適合在Android移動設(shè)備中使用。
PULL PULL解析器小巧輕便,解析速度快,簡單易用,非常適合在Android移動設(shè)備中使用,Android系統(tǒng)內(nèi)部在解析各種XML時(shí)也是用PULL解析器。
Pull解析器提供的事件類型總共有5種,分別如下:
START_DOCUMENT 文檔開始
START_TAG 開始元素
TEXT 文本
END_TAG 結(jié)束元素
END_DOCUMENT 文檔結(jié)束
使用PulI解析器XmIPullParser解析XML文檔時(shí),常用方法∶
int getAttributeCount(); 獲取當(dāng)前元素的屬性個(gè)數(shù)
String getAttributeValue(int index); 獲取屬性值
int getEventType); 獲取事件類型
string getName(); 用于START_TAG和END_TAG事件中,獲取當(dāng)前元素的名字
int next(); 處理下一個(gè)元素
int nextText(); 用于START_TAG事件中,獲得下一個(gè)TEXT類型的元素
可以通過以下兩個(gè)步驟創(chuàng)建一個(gè)Pull解析器∶
通過調(diào)用XmIPullParserFactory工廠類的newInstance()方法,創(chuàng)建一個(gè)Pull解析器工廠對象。
通過調(diào)用Pull解析器工廠對象的newPullParser()方法,創(chuàng)建一個(gè)Pull解析器對象。
Pull解析器對象創(chuàng)建之后,可以通過其setInput()方法傳入要解析的XML文檔。setInput()方法提供了兩種重載的形式:
void setInput(Reader in);
void setInput(InputStream inputStream, String inputEncoding);
SharePreferences接口
SharedPreferences能夠保存簡單格式的數(shù)據(jù),主要用于類似配置信息格式的數(shù)據(jù),這些數(shù)據(jù)以key-value形式存儲在XML文件中。
使用SharedPreferences方式存儲數(shù)據(jù)時(shí)需要用到SharedPreferences和SharedPreferences.Editor接口
SharedPreferences常用方法
Context對象的getSharedPreferences(String name,int mode)方法獲取SharedPreference對象參數(shù)mode用于設(shè)定文件的操作模式,取值可以是三種︰
Context.MODE_WORLD_READABLE(可讀)
Context.MODE_WORLD_WRITEABLE(可寫)
Context.MODE_PRIVATE(私有)
使用SharedPreferences進(jìn)行數(shù)據(jù)操作時(shí),操作步驟︰
使用getSharedPreferences()方法獲取一個(gè)SharedPreferences實(shí)例對象
使用SharedPreferences實(shí)例對象的edit()方法,獲取SharedPreferences.Editor編輯對象
使用SharedPreferences.Editorr編輯對象的putXxx()方法來保存數(shù)據(jù)
使用SharedPreferences.Editor編輯對象的commit()方法將數(shù)據(jù)提交到XML文件中
使用SharedPreferences對象的getXxx()方法來讀取數(shù)據(jù)
SQLite數(shù)據(jù)庫
sQLite是一種免費(fèi)、開源的輕量級數(shù)據(jù)庫,Android系統(tǒng)集成了sQLite
sQLite數(shù)據(jù)庫具有以下幾個(gè)特征:
輕量級
獨(dú)立
操作簡單
便于管理和維護(hù)
可移植性
語言無關(guān)
事務(wù)性
sQLiteDatabase對象打開數(shù)據(jù)庫的方法∶
openDatabase(String path, SQLiteDatabase.CursorFactory factory, intflags)∶打開path所指定的SQLite數(shù)據(jù)庫
openOrCreateDatabase(String path,SQLiteDatabase.CursorFactoryfactory)∶打開或創(chuàng)建(如果文件不存在) path所指定的SQLite數(shù)據(jù)庫
openOrCreateDatabase(File file,SQLiteDatabase.CursorFactoryfactory)∶打開或創(chuàng)建(如果文件不存在) file所指定的SQLite數(shù)據(jù)庫
創(chuàng)建或打開數(shù)據(jù)庫
path用于指定數(shù)據(jù)庫的路徑,若指定的數(shù)據(jù)庫不存在,則拋出FileNotFoundException異常
factory用于構(gòu)造查詢時(shí)的游標(biāo),若factory為null,則表示使用默認(rèn)的factory構(gòu)造游標(biāo)
flags指定了數(shù)據(jù)庫打開的模式,SQLite定義了4種數(shù)據(jù)庫打開模式:
OPEN_READONLY(只讀)
OPEN_READWRITE(可讀可寫)
CREATE_IF_NECESSARY(若數(shù)據(jù)庫不存在先創(chuàng)建數(shù)據(jù)庫)
NO_LOCALIZED_COLLATORS(不按照本地化語言對數(shù)據(jù)進(jìn)行排序)
使用openDatabase()方法打開指定的數(shù)據(jù)庫時(shí),需要三個(gè)參數(shù)∶
使用openDatabase()方法打開指定的數(shù)據(jù)庫
?sQLiteDatabase sqliteDatabase = sQLiteDatabase.openDatabase ( "qst_student. db", null,NO_LOCALIZED_COLLATORS);
?使用openOrCreateDatabase()方法打開或創(chuàng)建指定的數(shù)據(jù)庫
?sQLiteDatabase sqliteDatabase = sQLiteDatabase.openorCreateDatabase ("qst_student.db", null);
?使用deleteDatabase()方法刪除數(shù)據(jù)庫
?deleteDatabase ("qst_student.db" );//刪除數(shù)據(jù)庫qst_student. db
?使用close()方法關(guān)閉數(shù)據(jù)庫
?sqliteDatabase.close();//關(guān)閉數(shù)據(jù)庫,sqliteDatabase是一個(gè)實(shí)例對象
?使用execSQL()方法創(chuàng)建表
?//創(chuàng)建表的sQL語句
?string sql="CREATE TABLE student(ID INTEGER PRIMARY KEY,age INTEGER,name TEXT) ";
?//執(zhí)行該sQL語句創(chuàng)建表
?sqliteDatabase.execSQL ( sql) ;
?使用execSQL()方法刪除表
?l//創(chuàng)建表的sQL語句
?string sql= "CREATETABLE student(ID INTEGER PRIMARY KEY,age INTEGER,name TEXT)";
?//執(zhí)行該sQL語句創(chuàng)建表
?sqliteDatabase.execsQL (sql) ;
?使用insert()方法插入記錄
?contentValues contentValues = new Contentvalues ( ) ;contentValues.put ("ID",1);
?contentValues.put ( "age",26);
?contentValues.put ( "name" , "studentA" ) ;
?//調(diào)用insert()方法將contentvalues對象封裝的數(shù)據(jù)插入到student表中sqliteDatabase.insert ("student" , null,contentvalues) ;
?使用execSQL()方法插入記錄
?//定義插入sQL語句
?string sql= "INSERT INTo student (ID,age, name) values (1,26,'studentA ' ) ";//調(diào)用execsQL ()方法執(zhí)行sQL語句,將數(shù)據(jù)插入到student表中
?sqliteDatabase.execSQL(sql);
?使用execSQL()方法刪除記錄
?//定義更新sQL語句
?string sql= "DELETE FORM student where name='StudentA' ";//調(diào)用execsQL()方法執(zhí)行sQL語句更新student表中的記錄
?sqliteDatabase.execsQL(sql);
?
事務(wù)處理
beginTransaction()方法用于開始事務(wù)
endTransaction()方法用于結(jié)束事務(wù)
inTransaction()方法用于判斷當(dāng)前上下文是否處于事務(wù)環(huán)境中
setTransactionSuccessful()方法來設(shè)置事務(wù)成功標(biāo)志
sQLiteDatabase提供以下幾個(gè)方法來控制事務(wù)∶
SQLite0penHelper類
sQLiteOpenHelper是SQLiteDatabase的幫助類,用來管理數(shù)據(jù)庫的創(chuàng)建和版本更新
通過繼承SQLiteOpenHelper類可以隱藏開發(fā)過程中不需要直接調(diào)用的方法