




下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Android創(chuàng)建和使用數(shù)據(jù)庫詳細(xì)指南(1)摘要:每個應(yīng)用程序都要使用數(shù)據(jù),Android應(yīng)用程序也不例外,Android使用開源的、與操作系統(tǒng)無關(guān)的SQL數(shù)據(jù)庫-SQLite,本文介紹的就是如何為你的Android應(yīng)用程序創(chuàng)建和操作SQLite數(shù)據(jù)庫。數(shù)據(jù)庫支持每個應(yīng)用程序無論大小的生命線,除非你的應(yīng)用程序只處理簡單的數(shù)據(jù),那么就需要一個數(shù)據(jù)庫系統(tǒng)存儲你的結(jié)構(gòu)化數(shù)據(jù),Android使用SQLite數(shù)據(jù)庫,它是一個開源的、支持多操作系統(tǒng)的SQL數(shù)據(jù)庫,在許多領(lǐng)域廣泛使用,如MozillaFireFox就是使用SQLite來存儲配置數(shù)據(jù)的,iPhone也是使用SQLite來存儲數(shù)據(jù)的。在Andr
2、oid中,你為某個應(yīng)用程序創(chuàng)建的數(shù)據(jù)庫,只有它可以訪問,其它應(yīng)用程序是不能訪問的,數(shù)據(jù)庫位于Android設(shè)備/data/data/databases文件夾中,在這篇文章中,你將會學(xué)習(xí)到如何在Android中創(chuàng)建和使用數(shù)據(jù)庫。1SQLite數(shù)據(jù)庫使用Eclipse創(chuàng)建一個Android項目,取名為Database,如圖1所示:圖1數(shù)據(jù)庫-使用Eclipse創(chuàng)建你的Android新項目2創(chuàng)建DBAdapter輔助類操作數(shù)據(jù)庫的最佳實踐是創(chuàng)建一個輔助類,由它封裝所有對數(shù)據(jù)庫的復(fù)雜訪問,對于調(diào)用代碼而言它是透明的,因此我創(chuàng)建了一個DBAdapter的輔助類,由它創(chuàng)建、打開、關(guān)閉和使用SQLite數(shù)據(jù)
3、庫。首先,在src/文件夾(在這個例子中是src/net.learn2develop.Database)下添力口一個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ù)庫字段在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語句。在DBAdapter類中,你可以擴(kuò)展SQLiteOpenHelper類,它是一個Android輔助類,主要用于數(shù)據(jù)庫創(chuàng)建和版本管理。實際上,你可以
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)建一個新的數(shù)據(jù)庫,onUpgrade()方法用于升級數(shù)據(jù)庫,這可以通過檢查DATABASE_VERSION常量定義的值來實現(xiàn),對于onUpgrade()方法而言,只不過是簡單地刪除表,然后在創(chuàng)建表而已?,F(xiàn)在你可以定義不同的方法來打開和關(guān)閉數(shù)據(jù)庫,如清單3中的添加/編輯/刪除/行的函數(shù)。清單3定義打開和關(guān)閉數(shù)據(jù)庫以及增加/編輯/刪除表中行的方法publiccl
14、assDBAdapter/././-打開數(shù)據(jù)庫-publicDBAdapteropen()throwsSQLExceptiondb=DBHelper.getWritableDatabase();returnthis;/-關(guān)閉數(shù)據(jù)庫-publicvoidclose()DBHelper.close();/一向數(shù)據(jù)庫插入一個標(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);/-刪除一個指定的標(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);/-檢索一個指定的標(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;/-更新一'個標(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類返回一個需要的值,Cursor作為一個指針從數(shù)據(jù)庫查詢返回結(jié)果集,使用Cursor允許Android更有效地管理它們需要的行和列,你使用ContentValues對象存儲鍵/值對,它的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);/-打開數(shù)據(jù)庫-publicDBAdapteropen()throwsSQLExceptio
24、n(db=DBHelper.getWritableDatabase();returnthis;/-關(guān)閉數(shù)據(jù)庫-publicvoidclose()(DBHelper.close();/一向數(shù)據(jù)庫中插入一個標(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);/-刪除一個指定標(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);/-檢索一個指定標(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、-更新一'個標(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ù)庫現(xiàn)在你已經(jīng)可以利用
28、創(chuàng)建的輔助類來使用數(shù)據(jù)庫了,在DatabaseActivity.java文件中,創(chuàng)建一個DBAdapter類的實例: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增加一個標(biāo)題如果想在titles表中增加一個標(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,如果在添加過程中遇到錯誤,它就返回-1。如果你分析Android設(shè)備/模擬器的文件系
31、統(tǒng),你可以看到book數(shù)據(jù)庫創(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é)果是一個Cursor對象,如果要顯示所有標(biāo)題,你首先應(yīng)該調(diào)用Cursor對象的moveToFirst()方法,如果它成功(意味著至少有一行有效),使用DisplayTitle()方法顯示詳細(xì)的標(biāo)題,要移動到下一個標(biāo)題,可以調(diào)用Cursor對象的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ù)庫中檢索并顯示一個標(biāo)題。圖4Toast類6檢索單個標(biāo)題想要通過ID檢索單個標(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é)果是一個Cursor對象,如果返回一行,可以使用DisplayTitle()方法顯示標(biāo)題的詳細(xì)信息,否則就使用Toast類顯示一個錯誤消息。7更新一個標(biāo)題要更新一個特定的標(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();如果更新成功會顯示一條表示成功的消息,同時,你可以檢索剛剛更新的標(biāo)題看更新結(jié)果是否正確。8刪除一個標(biāo)題想要刪除一個標(biāo)題,可以調(diào)用DBAdapter類的deleteTitle()方法,傳遞你想要刪除的標(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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 如何控制清晨高血壓
- 現(xiàn)代農(nóng)業(yè)產(chǎn)業(yè)園區(qū)合作共建協(xié)議書
- 我的最愛它的魅力我解不開寫物與讀后感結(jié)合(12篇)
- ××超市冷藏設(shè)備規(guī)章
- 咖啡廳營業(yè)物資采購與配送協(xié)議
- 2025年測波儀項目提案報告
- 社區(qū)農(nóng)田保護(hù)措施實施協(xié)議
- 成長的足跡心中的情感抒情作文(12篇)
- 回憶兒時的一場雪抒情散文5篇
- 2025年物業(yè)管理師考試物業(yè)管理企業(yè)文化建設(shè)實務(wù)案例分析試卷
- 2025年廣州市荔灣區(qū)招考社區(qū)居委會專職工作人員招考高頻重點提升(共500題)附帶答案詳解
- 2025年春新北師大版數(shù)學(xué)一年級下冊課件 綜合實踐 設(shè)計教室裝飾圖
- 如何做好臨床護(hù)生的帶教
- 森林防火工程技術(shù)標(biāo)準(zhǔn)
- 2025年全國普通話水平測試題標(biāo)準(zhǔn)試卷(共三十五套)
- 2025年全國保密知識競賽經(jīng)典試題庫及答案(共270題)
- 體育賽事輿情處理及應(yīng)對方案
- 2025年中醫(yī)治未病服務(wù)工作計劃及措施
- 《光伏電站運行與維護(hù)》課件-項目五 光伏電站常見故障處理
- 使用錯誤評估報告(可用性工程)模版
- 委托辦事合同范例
評論
0/150
提交評論