2015年底安卓app開(kāi)發(fā)工程師培訓(xùn)教程1.基礎(chǔ)12天相關(guān)sqlite_第1頁(yè)
2015年底安卓app開(kāi)發(fā)工程師培訓(xùn)教程1.基礎(chǔ)12天相關(guān)sqlite_第2頁(yè)
免費(fèi)預(yù)覽已結(jié)束,剩余1頁(yè)可下載查看

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

OpenHelper是安卓打開(kāi)數(shù)據(jù)庫(kù)的幫助類,我們通常需要繼承這個(gè)類并重寫里面onCreateonUpgrade方法,因?yàn)樗且粋€(gè)抽象類.onCreate方法只會(huì)被調(diào)用一次,在數(shù)據(jù)庫(kù)創(chuàng)建時(shí)被調(diào)用,通常需要在里面做數(shù)據(jù)庫(kù)的初始操作,比如說(shuō)執(zhí)行建表語(yǔ)句等,畢竟一個(gè)空的數(shù)據(jù)庫(kù)是什么都做不了的.當(dāng)我們需要更新數(shù)據(jù)庫(kù)版本時(shí),onUpgrade方法中進(jìn)行更新的操作我們可以通過(guò)OpenHelper的getReadableDatabase()和getWritableDatabase()方法來(lái)獲取數(shù)據(jù)庫(kù)Database對(duì)象,通過(guò)這個(gè)對(duì)象對(duì)數(shù)據(jù)庫(kù)進(jìn)行增刪查改操作.通過(guò)方法的名字,我們很容易去認(rèn)為getReadableDatabase()是獲取一個(gè)只讀的數(shù)據(jù)庫(kù),但實(shí)Createand/oropena Thiswillbethesameobjectreturnedby{@linkunlesssomeproblem,suchasafulldisk,requiresthedatabasetobeopenedread-only.Inthatcase,aread-onlydatabaseobjectwillbeIftheproblemisfixed,afuturecallto{@link#getWritableDatabase}maysucceed,inwhichcasetheread-onlydatabaseobjectwillbeclosedandtheread/writeobjectwillbereturnedinthefuture.Like{@link#getWritableDatabase},thismethodmaytakealongtimetoreturn,soyoushouldnotcallitfromtheapplicationmainthread,includingfrom{@linkandroid.content.ContentProvider#onCreate Exceptionifthedatabasecannotbe@returnadatabaseobjectvaliduntil{@link#getWritableDatabase}or{@link#close}iscalled.用(getReadableDatabase()getWritableDatabase(),先調(diào)用的數(shù)據(jù)庫(kù) DatabasegetReadableDatabase()synchronized(this)return}}Createand/oropenadatabasethatwillbeusedforreadingandThefirsttimethisiscalled,thedatabasewillbeopened{@link#onCreate},{@link#onUpgrade}and/or{@link#onOpen}willbeonCreateonUpgrade和/(如果打開(kāi)成功,onOpen Onceopenedsuccessfully,thedatabaseiscached,soyoucancallthismethodeverytimeyouneedtowritetothedatabase.(Makesuretocall{@link#close}whenyounolongerneedtheErrorssuchasbadpermissionsorafulldiskmaycausethismethodtofail,butfutureattemptsmaysucceediftheproblemisfixed.Databaseupgrademaytakealongtime,youshouldnotcallthismethodfromtheapplicationmainthread,includingfrom{@linkandroid.content.ContentProvider#onCreateContentProvider.onCreate()}. Exceptionifthedatabasecannotbeopenedforwriting@returnaread/writedatabaseobjectvaliduntil{@link#close}is DatabasegetWritableDatabase()synchronized(this)return}}通過(guò)上面的注釋和代碼,我們可以知道getReadableDatabase()的數(shù)據(jù)庫(kù)時(shí)才會(huì)打開(kāi)一個(gè)只讀的數(shù)據(jù)庫(kù),這兩個(gè)方法內(nèi)部實(shí)現(xiàn)基本相同,都調(diào)用了這樣的一個(gè)方法:getDatabaseLocked(booleanwritable),他們是通過(guò)這個(gè)方法的參數(shù)來(lái)進(jìn)行區(qū)分的,getReadableDatabase()方法傳入的參數(shù)是false,而getWritableDatabase()方法傳入的參數(shù)是DatabasegetDatabaseLocked(booleanwritable)DatabasegetDatabaseLocked(booleanwritable)if(mDatabase!=null)//mDatabase如果不等于null,說(shuō)明之前已經(jīng)創(chuàng)建過(guò)數(shù)據(jù)庫(kù),也就是說(shuō) ,獲取的數(shù)據(jù)庫(kù)對(duì)象會(huì)被緩存if(!mDatabase.isOpen())//Darn!Theuserclosedthedatabasebycalling//open狀態(tài)的也就是說(shuō)調(diào)用過(guò)close()方法mDatabase=null;}elseif(!writable||!mDatabase.isReadOnly())//Thedatabaseisalreadyopenfor//elseif說(shuō)明數(shù)據(jù)庫(kù)可用,writablefalse,getReadableDatabase()方法那么直接返回該數(shù)據(jù)庫(kù)對(duì)象因?yàn)樵摂?shù)據(jù)庫(kù)對(duì)象既然可用,那么無(wú)論它是只讀還是可讀可寫,都可以讀,就可以在這里直接返回getWritableDatabase()方法那么只有該數(shù)據(jù)庫(kù)對(duì)象不是只讀的才可以返回,否則就要新創(chuàng)建一個(gè).return}}if(mIsInitializing)thrownewIllegalStateException("getDatabasecalled}Databasedb= 1.db=trymIsInitializing=if(db!=null)if(writable&&db.isReadOnly()){}}elseif(mName==null)Databasecreate()方法創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)CursorFactorynull,該db }elsetryif(DEBUG_STRICT_READONLY&&!writable)//如果是OpenHelperDEBUG_STRICT_READONLY并且調(diào)getReadableDatabase().,寫數(shù)據(jù)庫(kù)失敗true也就是如果之前創(chuàng)建的是一個(gè)只讀的數(shù)finalStringpath=db= Database.openDatabase(path,mFactory,}elsedb=mContext.openOrCreateDatabase(mName,mEnableWriteAheadLogging?Context.MODE_ENABLE_WRITE_AHEAD_LOGGING:0,mFactory,}}catch Exceptionex)if(writable)(getReadableDatabase()數(shù)據(jù)庫(kù)創(chuàng)建失敗那么應(yīng)該嘗試創(chuàng)建只讀的數(shù)據(jù)throw}//走到這里說(shuō)明創(chuàng)建數(shù)據(jù)庫(kù)失敗而且調(diào)用的是getReadableBase(),Log.e(TAG,"Couldn'topen"+mName+"forwriting(willtryread-only):",finalStringpath=db Database.openDatabase(path,Database.OPEN_READONLY,}}//db的配置如果走到這里db創(chuàng)建成功那么就可以調(diào)用這個(gè)方法finalintversion=if(version!=mNewVersion)if(db.isReadOnly())thrownew Exception("Can'tupgraderead-onlydatabasefromversion"+db.getVersion()+"to"+mNewVersion+":+}//開(kāi)啟事務(wù),這里表明了 OpenHelper的onCreate(),onUpgrade()方法是在事務(wù)中進(jìn)行的,也就是不必?fù)?dān)心這兩個(gè)方法中的代碼只有部分被執(zhí)行.tryif(version==0)}elseif(version>mNewVersion)onDowngrade(db,version,}else}}

onUpgrade(db,version,

}finally}}//onOpen方法因?yàn)閿?shù)據(jù)庫(kù)剛創(chuàng)建open的所以可以在這里調(diào)用這個(gè)方if(db.

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論