




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、Android創(chuàng)建和使用數(shù)據(jù)庫(kù)詳細(xì)指南(1)摘要:每個(gè)應(yīng)用程序都要使用數(shù)據(jù),Android應(yīng)用程序也不例外,Android使用開(kāi)源的、與操作系統(tǒng)無(wú)關(guān)的SQL數(shù)據(jù)庫(kù)-SQLite,本文介紹的就是如何為你的Android應(yīng)用程序創(chuàng)建和操作SQLite數(shù)據(jù)庫(kù)。數(shù)據(jù)庫(kù)支持每個(gè)應(yīng)用程序無(wú)論大小的生命線,除非你的應(yīng)用程序只處理簡(jiǎn)單的數(shù)據(jù),那么就需要一個(gè)數(shù)據(jù)庫(kù)系統(tǒng)存儲(chǔ)你的結(jié)構(gòu)化數(shù)據(jù),Android使用SQLite數(shù)據(jù)庫(kù),它是一個(gè)開(kāi)源的、支持多操作系統(tǒng)的SQL數(shù)據(jù)庫(kù),在許多領(lǐng)域廣泛使用,如MozillaFireFox就是使用SQLite來(lái)存儲(chǔ)配置數(shù)據(jù)的,iPhone也是使用SQLite來(lái)存儲(chǔ)數(shù)據(jù)的。在Andr
2、oid中,你為某個(gè)應(yīng)用程序創(chuàng)建的數(shù)據(jù)庫(kù),只有它可以訪問(wèn),其它應(yīng)用程序是不能訪問(wèn)的,數(shù)據(jù)庫(kù)位于Android設(shè)備/data/data/databases文件夾中,在這篇文章中,你將會(huì)學(xué)習(xí)到如何在Android中創(chuàng)建和使用數(shù)據(jù)庫(kù)。1SQLite數(shù)據(jù)庫(kù)使用Eclipse創(chuàng)建一個(gè)Android項(xiàng)目,取名為Database,如圖1所示:圖1數(shù)據(jù)庫(kù)-使用Eclipse創(chuàng)建你的Android新項(xiàng)目2創(chuàng)建DBAdapter輔助類操作數(shù)據(jù)庫(kù)的最佳實(shí)踐是創(chuàng)建一個(gè)輔助類,由它封裝所有對(duì)數(shù)據(jù)庫(kù)的復(fù)雜訪問(wèn),對(duì)于調(diào)用代碼而言它是透明的,因此我創(chuàng)建了一個(gè)DBAdapter的輔助類,由它創(chuàng)建、打開(kāi)、關(guān)閉和使用SQLite數(shù)據(jù)
3、庫(kù)。首先,在src/文件夾(在這個(gè)例子中是src/net.learn2develop.Database)下添力口一個(gè)DBAdapter.java文件。在DBAdapter.java文件中,導(dǎo)入所有你要使用到的命名空間:packagenet.learn2develop.Databases;importandroid.content.ContentValues;.Cursor;.SQLException;.sqlite.SQLiteDatabase;.sqlite.SQLiteOpenHelper;importandroid.content.Context;importandroid.databa
4、seimportandroid.databaseimportandroid.databaseimportandroid.databaseimportandroid.util.Log;publicclassDBAdapter圖2數(shù)據(jù)庫(kù)字段在DBAdapter.java文件中,定義清單1中的常量。清單1定義DBAdapter.java文件中的常量packagenet.learn2develop.Database;importandroid.content.ContentValues;importandroid.content.Context;importandroid.database.Curso
5、r;importandroid.database.SQLException;importandroid.database.sqlite.SQLiteDatabase;importandroid.database.sqlite.SQLiteOpenHelper;importandroid.util.Log;publicclassDBAdapter(publicstaticfinalStringKEY_ROWID="_id"publicstaticfinalStringKEY_ISBN="isbn"publicstaticfinalStringKEY_TIT
6、LE="title"publicstaticfinalStringKEY_PUBLISHER="publisher"privatestaticfinalStringTAG="DBAdapter"privatestaticfinalStringDATABASE_NAME="books"privatestaticfinalStringDATABASE_TABLE="titles"privatestaticfinalintDATABASE_VERSION=1;privatestaticfinalStr
7、ingDATABASE._CREATE="createtabletitles(_idintegerprimarykeyautoincrement,"+"isbntextnotnull,titletextnotnull."+"publishertextnotnull);"privatefinalContextcontext;DATABASE_CREATE常量包括創(chuàng)建titles表的SQL語(yǔ)句。在DBAdapter類中,你可以擴(kuò)展SQLiteOpenHelper類,它是一個(gè)Android輔助類,主要用于數(shù)據(jù)庫(kù)創(chuàng)建和版本管理。實(shí)際上,你可以
8、覆蓋onCreate()和onUpgrade()方法,如清單2所示。清單2在DBAdapter類中,擴(kuò)展SQLiteOpenHelper類覆蓋onCreate()和onUpgrade()方法packagenet.learn2develop.Database;importandroid.content.ContentValues;importandroid.content.Context;importandroid.database.Cursor;importandroid.database.SQLException;importandroid.database.sqlite.SQLiteDat
9、abase;importandroid.database.sqlite.SQLiteOpenHelper;importandroid.util.Log;publicclassDBAdapter(="_id"publicstaticfinalStringKEY_ROWIDpublicstaticfinalStringKEY_ISBN="isbn"publicstaticfinalStringKEY_TITLE="title"publicstaticfinalStringKEY_PUBLISHER="publisher"
10、;privatestaticfinalStringTAG="DBAdapter"privatestaticfinalStringDATABASE_NAME="books"privatestaticfinalStringDATABASE_TABLE="titles"privatestaticfinalintDATABASE_VERSION=1;privatestaticfinalStringDATABASE_CREATE="createtabletitles(_idintegerprimarykeyautoincrement,
11、+"isbntextnotnull,titletextnotnull,"+"publishertextnotnull);"privatefinalContextcontext;privateDatabaseHelperDBHelper;privateSQLiteDatabasedb;publicDBAdapter(Contextctx)this.context=ctx;DBHelper=newDatabaseHelper(context);privatestaticclassDatabaseHelperextendsSQLiteOpenHelperDat
12、abaseHelper(Contextcontext)super(context,DATABASE_NAME,null,DATABASE_VERSION);OverridepublicvoidonCreate(SQLiteDatabasedb)db.execSQL(DATABASE_CREATE);OverrideintoldVersion,publicvoidonUpgrade(SQLiteDatabasedb,intnewVersion)Log.w(TAG,"Upgradingdatabasefromversion+oldVersion+"to"+newVer
13、sion+",whichwilldestroyallolddata");db.execSQL("DROPTABLEIFEXISTStitles");onCreate(db);onCreate()方法創(chuàng)建一個(gè)新的數(shù)據(jù)庫(kù),onUpgrade()方法用于升級(jí)數(shù)據(jù)庫(kù),這可以通過(guò)檢查DATABASE_VERSION常量定義的值來(lái)實(shí)現(xiàn),對(duì)于onUpgrade()方法而言,只不過(guò)是簡(jiǎn)單地刪除表,然后在創(chuàng)建表而已?,F(xiàn)在你可以定義不同的方法來(lái)打開(kāi)和關(guān)閉數(shù)據(jù)庫(kù),如清單3中的添加/編輯/刪除/行的函數(shù)。清單3定義打開(kāi)和關(guān)閉數(shù)據(jù)庫(kù)以及增加/編輯/刪除表中行的方法publiccl
14、assDBAdapter/././-打開(kāi)數(shù)據(jù)庫(kù)-publicDBAdapteropen()throwsSQLExceptiondb=DBHelper.getWritableDatabase();returnthis;/-關(guān)閉數(shù)據(jù)庫(kù)-publicvoidclose()DBHelper.close();/一向數(shù)據(jù)庫(kù)插入一個(gè)標(biāo)題一publiclonginsertTitle(Stringisbn,Stringtitle,Stringpublisher)Contentvaluesinitialvalues=newContentValues();initialValues.put(KEY_ISBN,isb
15、n);initialValues.put(KEY_TITLE,title);initialValues.put(KEY_PUBLISHER,publisher);returndb.insert(DATABASE_TABLE,null,initialValues);/-刪除一個(gè)指定的標(biāo)題-publicbooleandeleteTitle(longrowId)returndb.delete(DATABASE_TABLE,KEY_ROWID+"="+rowId,null)>0;/-檢索所有標(biāo)題-publicCursorgetAllTitles()returndb.query
16、(DATABASE_TABLE,newStringKEY_ROWID,KEY_ISBN,KEY_TITLE,KEY_PUBLISHER,null,null,null,null,null);/-檢索一個(gè)指定的標(biāo)題-publicCursorgetTitle(longrowId)throwsSQLExceptionCursormCursor=db.query(true,DATABASE_TABLE,newStringKEY_ROWID,KEY_ISBN,KEY_TITLE,KEY_PUBLISHER,KEY_ROWID+"="+rowId,null,null,null,null,
17、null);if(mCursor!=null)mCursor.moveToFirst();returnmCursor;/-更新一'個(gè)標(biāo)題-publicbooleanupdateTitle(longrowId,Stringisbn,Stringtitle,Stringpublisher)ContentValuesargs=newContentValues();args.put(KEY_ISBN,isbn);args.put(KEY_TITLE,title);args.put(KEY_PUBLISHER,publisher);returndb.update(DATABASE_TABLE,a
18、rgs,KEY_ROWID+"="+rowId,null)>0;注意Android使用Cursor類返回一個(gè)需要的值,Cursor作為一個(gè)指針從數(shù)據(jù)庫(kù)查詢返回結(jié)果集,使用Cursor允許Android更有效地管理它們需要的行和列,你使用ContentValues對(duì)象存儲(chǔ)鍵/值對(duì),它的put()方法允許你插入不同數(shù)據(jù)類型的鍵值。清單4顯示了完整的DBAdapter.java源代碼。清單4DBAdapter.java完整源代碼packagenet.learn2develop.Database;importandroid.content.ContentValues;impo
19、rtandroid.content.Context;importandroid.database.Cursor;importandroid.database.SQLException;importandroid.database.sqlite.SQLiteDatabase;importandroid.database.sqlite.SQLiteOpenHelper;importandroid.util.Log;publicclassDBAdapter(publicstaticfinalStringKEY_ROWID="_id"publicstaticfinalStringK
20、EY_ISBN="isbn"publicstaticfinalStringKEY_TITLE="title"publicstaticfinalStringKEY_PUBLISHER="publisher"privatestaticfinalStringTAG="DBAdapter"privatestaticfinalStringDATABASE_NAME="books"privatestaticfinalStringDATABASE_TABLE="titles"private
21、staticfinalintDATABASE_VERSION=1;privatestaticfinalStringDATABASE_CREATE"createtabletitles(_idintegerprimarykeyautoincrement,"+"isbntextnotnull,titletextnotnull."+"publishertextnotnull);"privatefinalContextcontext;privateDatabaseHelperDBHelper;privateSQLiteDatabasedb;pu
22、blicDBAdapter(Contextctx)(this.context=ctx;DBHelper=newDatabaseHelper(context);privatestaticclassDatabaseHelperextendsSQLiteOpenHelper(DatabaseHelper(Contextcontext)(super(context,DATABASE_NAME,null,DATABASE_VERSION);OverridepublicvoidonCreate(SQLiteDatabasedb)(db.execSQL(DATABASE_CREATE);Overridepu
23、blicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion)(Log.w(TAG,"Upgradingdatabasefromversion"+oldVersion+"to"+newVersion+",whichwilldestroyallolddata");db.execSQL("DROPTABLEIFEXISTStitles");onCreate(db);/-打開(kāi)數(shù)據(jù)庫(kù)-publicDBAdapteropen()throwsSQLExceptio
24、n(db=DBHelper.getWritableDatabase();returnthis;/-關(guān)閉數(shù)據(jù)庫(kù)-publicvoidclose()(DBHelper.close();/一向數(shù)據(jù)庫(kù)中插入一個(gè)標(biāo)題一publiclonginsertTitle(Stringisbn,Stringtitle,Stringpublisher)(ContentValuesinitialValues=newContentValues();initialValues.put(KEY_ISBN,isbn);initialValues.put(KEY_TITLE,title);initialValues.put(KE
25、Y_PUBLISHER,publisher);returndb.insert(DATABASE_TABLE,null,initialValues);/-刪除一個(gè)指定標(biāo)題-publicbooleandeleteTitle(longrowId)returndb.delete(DATABASE_TABLE,KEY_ROWID+"="+rowId,null)>0;/-檢索所有標(biāo)題-publicCursorgetAllTitles()returndb.query(DATABASE_TABLE,newStringKEY_ROWID,KEY_ISBN,KEY_TITLE,KEY_P
26、UBLISHER,null,null,null,null,null);/-檢索一個(gè)指定標(biāo)題-publicCursorgetTitle(longrowId)throwsSQLExceptionCursormCursor=db.query(true,DATABASE_TABLE,newString口KEY_ROWID,KEY_ISBN,KEY_TITLE,KEY_PUBLISHERKEY_ROWID+"="+rowId,null,null,null,null,null);if(mCursor!=null)mCursor.moveToFirst();returnmCursor;/
27、-更新一'個(gè)標(biāo)題-publicbooleanupdateTitle(longrowId,Stringisbn,Stringtitle,Stringpublisher)ContentValuesargs=newContentValues();args.put(KEY_ISBN,isbn);args.put(KEY_TITLE,title);args.put(KEY_PUBLISHER,publisher);returndb.update(DATABASE_TABLE,args,KEY_ROWID+"="+rowId,null)>0;3使用數(shù)據(jù)庫(kù)現(xiàn)在你已經(jīng)可以利用
28、創(chuàng)建的輔助類來(lái)使用數(shù)據(jù)庫(kù)了,在DatabaseActivity.java文件中,創(chuàng)建一個(gè)DBAdapter類的實(shí)例:packagenet.learn2develop.Database;importandroid.app.Activity;importandroid.os.Bundle;publicclassDatabaseActivityextendsActivity/*Calledwhentheactivityisfirstcreated.*/OverridepublicvoidonCreate(BundlesavedInstanceState)super.onCreate(savedlns
29、tanceState);setContentView(R.layout.main);DBAdapterdb=newDBAdapter(this);4增加一個(gè)標(biāo)題如果想在titles表中增加一個(gè)標(biāo)題,可以使用DBAdapter類的insertTitle()方法:OverridepublicvoidonCreate(BundlesavedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.main);DBAdapterdb=newDBAdapter(this);/add2titlesdb.open();l
30、ongid;id=db.insertTitle("0470285818","C#2008Programmer'sReference","Wrox");id=db.insertTitle("047017661X","ProfessionalWindowsVistaGadgetsProgramming","Wrox");db.close();insertTitle()方法返回插入行的ID,如果在添加過(guò)程中遇到錯(cuò)誤,它就返回-1。如果你分析Android設(shè)備/模擬器的文件系
31、統(tǒng),你可以看到book數(shù)據(jù)庫(kù)創(chuàng)建在database文件夾下,如圖3所示。-±netJearnZdeveCop."Database'm后由kbases一,、F?books5120圖3database文件夾5檢索所有標(biāo)題想要檢索titles表中的所有標(biāo)題,可以使用DBAdapter類的getAllTitles()方法,如清單5所示。清單5使用DBAdapter類的getAllTitles()方法檢索titles表中的所有標(biāo)題packagenet.learn2develop.Database;importandroid.app.Activity;importandroid
32、.database.Cursor;importandroid.os.Bundle;importandroid.widget.Toast;publicclassDatabaseActivityextendsActivity/*Calledwhentheactivityisfirstcreated.*/OverridepublicvoidonCreate(BundlesavedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.main);DBAdapterdb=newDBAdapter(this);/-
33、獲取所有標(biāo)題-db.open();Cursorc=db.getAllTitles();if(c.moveToFirst()doDisplayTitle(c);while(c.moveToNext();db.close();返回的結(jié)果是一個(gè)Cursor對(duì)象,如果要顯示所有標(biāo)題,你首先應(yīng)該調(diào)用Cursor對(duì)象的moveToFirst()方法,如果它成功(意味著至少有一行有效),使用DisplayTitle()方法顯示詳細(xì)的標(biāo)題,要移動(dòng)到下一個(gè)標(biāo)題,可以調(diào)用Cursor對(duì)象的moveToNext()方法,下面是DisplayTitle()方法的定義:publicvoidDisplayTitle(To
34、ast.makeText(this,"id:"+c.getString("ISBN:"+c.getString("TITLE:"+c.getString(Cursorc)0)+"n"+1) +"n"+2) +"n"+"PUBLISHER:"+c.getString(3),Toast.LENGTH_LONG).show();圖4顯示Toast類,它從數(shù)據(jù)庫(kù)中檢索并顯示一個(gè)標(biāo)題。圖4Toast類6檢索單個(gè)標(biāo)題想要通過(guò)ID檢索單個(gè)標(biāo)題,可以使用DBAdapter
35、類的getTitle()方法:OverridepublicvoidonCreate(BundlesavedInstanceState)super.onCreate(savedlnstanceState);setContentView(R.layout.main);DBAdapterdb=newDBAdapter(this);/getatitledb.open();Cursorc=db.getTitle(2);if(c.moveToFirst()DisplayTitle(c);elseToast.makeText(this,"Notitlefound",Toast.LENGT
36、H_LONG).show();db.close();返回的結(jié)果是一個(gè)Cursor對(duì)象,如果返回一行,可以使用DisplayTitle()方法顯示標(biāo)題的詳細(xì)信息,否則就使用Toast類顯示一個(gè)錯(cuò)誤消息。7更新一個(gè)標(biāo)題要更新一個(gè)特定的標(biāo)題,可以調(diào)用DBAdapter的updateTitle()方法,傳遞想要更新的標(biāo)題白IID給它就可以了,如清單6所示。清單6調(diào)用DBAdapter類的updateTitle()方法更新標(biāo)題OverridepublicvoidonCreate(BundlesavedInstanceState)super.onCreate(savedInstanceState);set
37、ContentView(R.layout.main);DBAdapterdb=newDBAdapter(this);/更新標(biāo)題db.open();if(db.updateTitle(1,"0470285818","C#2008Programmer'sReference","WroxPress")Toast.makeText(this,"Updatesuccessful.",Toast.LENGTH_LONG).show();elseToast.makeText(this,"Updatefailed
38、.",Toast.LENGTH_LONG).show();/一檢索相同的標(biāo)題一Cursorc=db.getTitle(1);if(c.moveToFirst()DisplayTitle(c);elseToast.makeText(this,"Notitlefound",Toast.LENGTH_LONG).show();/db.close();如果更新成功會(huì)顯示一條表示成功的消息,同時(shí),你可以檢索剛剛更新的標(biāo)題看更新結(jié)果是否正確。8刪除一個(gè)標(biāo)題想要?jiǎng)h除一個(gè)標(biāo)題,可以調(diào)用DBAdapter類的deleteTitle()方法,傳遞你想要?jiǎng)h除的標(biāo)題白ID即可:Overr
39、idepublicvoidonCreate(BundlesavedInstanceState)super.onCreate(savedInstanceState);setContentView(R.layout.main);DBAdapterdb=newDBAdapter(this);/-deleteatitle-db.open();if(db.deleteTitle(1)Toast.makeText(this,"Deletesuccessful.",Toast.LENGTH_LONG).show();elseToast.makeText(this,"Deletefailed.",Toast.LENGTH_LONG).show();db.close();如果刪
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 《課件制作基礎(chǔ)》教程
- 上進(jìn)聯(lián)考2025屆廣東省高三年級(jí)5月聯(lián)合測(cè)評(píng)政治課件
- 精析2025年一級(jí)建造師經(jīng)典試題及答案
- 無(wú)人機(jī)功能測(cè)試試題及答案詳解
- 《投身漢語(yǔ)生活營(yíng)》課件
- 胸科撐開(kāi)器器械清洗流程
- 如何加強(qiáng)安全生產(chǎn)
- 【安永】靈活應(yīng)對(duì)變局重新平衡優(yōu)先事項(xiàng)
- 《課件醫(yī)院運(yùn)營(yíng)管理》
- 衛(wèi)生保健培訓(xùn)實(shí)務(wù)要點(diǎn)
- 山東省濟(jì)南市重點(diǎn)中學(xué)2025屆高考生物二模試卷含解析
- 湖南省天壹名校聯(lián)盟2025屆高三5月適應(yīng)性考試(物理)
- 新版gmp實(shí)務(wù)教程試題及答案
- 2025年下半年度中鐵特貨物流股份限公司招聘畢業(yè)生三易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2025年中考英語(yǔ)考綱詞匯(包括詞性詞義詞轉(zhuǎn)短語(yǔ))
- 2025年遼寧省各市農(nóng)村電力服務(wù)有限公司招聘筆試參考題庫(kù)附帶答案詳解
- 2025年山東省青島市嶗山區(qū)中考數(shù)學(xué)一模試題(原卷版+解析版)
- 嘉峪關(guān)2025年嘉峪關(guān)市事業(yè)單位引進(jìn)50名高層次和急需緊缺人才(含教育系統(tǒng))筆試歷年參考題庫(kù)附帶答案詳解
- 玉器代銷合同協(xié)議書(shū)范本
- 2025年上海長(zhǎng)寧區(qū)高三二模高考英語(yǔ)試卷試題(含答案詳解)
- 正比例函數(shù)性質(zhì)課件
評(píng)論
0/150
提交評(píng)論