教學(xué)理論授課android程序設(shè)計(jì)基礎(chǔ)十一章存儲(chǔ)技術(shù)數(shù)據(jù)庫操作_第1頁
教學(xué)理論授課android程序設(shè)計(jì)基礎(chǔ)十一章存儲(chǔ)技術(shù)數(shù)據(jù)庫操作_第2頁
教學(xué)理論授課android程序設(shè)計(jì)基礎(chǔ)十一章存儲(chǔ)技術(shù)數(shù)據(jù)庫操作_第3頁
教學(xué)理論授課android程序設(shè)計(jì)基礎(chǔ)十一章存儲(chǔ)技術(shù)數(shù)據(jù)庫操作_第4頁
教學(xué)理論授課android程序設(shè)計(jì)基礎(chǔ)十一章存儲(chǔ)技術(shù)數(shù)據(jù)庫操作_第5頁
已閱讀5頁,還剩42頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

Android程序設(shè)計(jì)基礎(chǔ)第11章:存儲(chǔ)技術(shù)-數(shù)據(jù)庫操作本章內(nèi)容第1節(jié)SQLite數(shù)據(jù)庫概述第2節(jié)SQLite建庫建表第3節(jié)管理數(shù)據(jù)庫連接第4節(jié)

操作數(shù)據(jù)庫數(shù)據(jù)第5節(jié)

數(shù)據(jù)綁定第6節(jié)db4o簡介本章目標(biāo)掌握SQLite數(shù)據(jù)的基本特點(diǎn)與工具使用。熟練掌握SQLite建庫見表的方法。熟練掌握連接SQLite數(shù)據(jù)庫的方法。熟悉SQLite數(shù)據(jù)庫的升級(jí)與建立方法。掌握通過數(shù)據(jù)綁定完成數(shù)據(jù)顯示的方法。了解db4o數(shù)據(jù)的特點(diǎn)與用法第1節(jié)SQLite數(shù)據(jù)庫概述知識(shí)點(diǎn)預(yù)覽#知識(shí)點(diǎn)重點(diǎn)難點(diǎn)應(yīng)用說明1SQLite數(shù)據(jù)庫簡介介紹SQLite數(shù)據(jù)庫的特點(diǎn)。2SQLite數(shù)據(jù)庫工具使用√√介紹操作SQLite數(shù)據(jù)庫的工具用法。3SQLite與大型數(shù)據(jù)庫的區(qū)別介紹SQLite與大型數(shù)據(jù)庫的區(qū)別。SQLite是一種非常流行的嵌入式數(shù)據(jù)庫是由C語言編寫而成是一款輕型關(guān)系型數(shù)據(jù)庫支持SQL支持多種操作系統(tǒng)完全獨(dú)立運(yùn)行,沒有依賴性Android內(nèi)嵌了SQLite數(shù)據(jù)庫SQLite數(shù)據(jù)庫簡介SQLite數(shù)據(jù)庫工具是用來操作數(shù)據(jù)庫文件的工具官方網(wǎng)站提供了命令行工具的下載下載sqlite-shell-******.zip文件解壓縮后只有一個(gè)文件sqlite3將sqlite3所在的路徑加入path環(huán)境變量Sqlite3工具的使用連接數(shù)據(jù)庫文件SQLite數(shù)據(jù)庫工具使用

$sqlite3<數(shù)據(jù)庫文件路徑>SQLite數(shù)據(jù)庫工具是用來操作數(shù)據(jù)庫文件的工具Sqlite3工具的使用數(shù)據(jù)庫的相關(guān)管理命令都是以.開頭,常用命令如下SQLite數(shù)據(jù)庫工具使用2sqlite>.helpsqlite>.quitsqlite>.tablessqlite>.schema[表名]sqlite>.backup<文件全路徑>sqlite>.restore<文件全路徑>SQLite數(shù)據(jù)庫工具是用來操作數(shù)據(jù)庫文件的工具sqlite3工具的使用在sqlite3的命令行下可以直接輸入標(biāo)準(zhǔn)sql語句除了sqlite3以外,還有很多非官方的可視化管理工具SQLiteDatabaseBrowserSQLiteExpertProfessionalSQLiteDeveloperSQLite數(shù)據(jù)庫工具使用3SQLite與大型數(shù)據(jù)庫的區(qū)別兩者都是支持關(guān)系的關(guān)系型數(shù)據(jù)庫SQLite是一個(gè)嵌入型的輕量級(jí)數(shù)據(jù)庫,適合小數(shù)據(jù)量大型數(shù)據(jù)庫獨(dú)立運(yùn)行在數(shù)據(jù)庫服務(wù)器上,適合大數(shù)據(jù)量級(jí)別大型數(shù)據(jù)庫通常以網(wǎng)絡(luò)的方式對(duì)外提供服務(wù)SQLite與大型數(shù)據(jù)庫的區(qū)別第2節(jié)SQLite建庫建表知識(shí)點(diǎn)預(yù)覽#知識(shí)點(diǎn)重點(diǎn)難點(diǎn)應(yīng)用說明1創(chuàng)建SQLite數(shù)據(jù)庫√√介紹如何創(chuàng)建SQLite數(shù)據(jù)庫。2數(shù)據(jù)類型√介紹SQLite中的相關(guān)字段類型。3創(chuàng)建SQLite數(shù)據(jù)表

√√介紹SQLite中創(chuàng)建表的方法。4創(chuàng)建表間關(guān)聯(lián)關(guān)系√√√介紹SQLite中表和表之間的關(guān)聯(lián)。5事務(wù)控制√√√介紹SQLite中的事物控制方法。創(chuàng)建SQLite數(shù)據(jù)庫直接在命令行輸入上面的命令如果test.db不存在,則預(yù)創(chuàng)建(直到執(zhí)行相關(guān)sql才創(chuàng)建文件)如果test.db存在,則連接數(shù)據(jù)庫上述命令可以在創(chuàng)建數(shù)據(jù)庫的同時(shí)使用sql.script進(jìn)行初始化創(chuàng)建SQLite數(shù)據(jù)庫$sqlite3test.db$sqlite3test.db<sql.scriptSQLite數(shù)據(jù)庫的數(shù)據(jù)類型SQLite數(shù)據(jù)中的列可以存儲(chǔ)任意數(shù)據(jù)類型的數(shù)據(jù)為了與其他數(shù)據(jù)庫兼容,可以為字段指定默認(rèn)的類型NULL:空值INTEGER:

帶符號(hào)的整數(shù),具體取決于存入數(shù)字的范圍大小REAL:浮點(diǎn)數(shù),存儲(chǔ)為8-bytes的浮點(diǎn)數(shù)TEXT:字符串文本BLOB:二進(jìn)制對(duì)象同時(shí)還接受如下一些類型:smallint16位整數(shù)int32位整數(shù)float32位浮點(diǎn)數(shù)double64位浮點(diǎn)數(shù)數(shù)據(jù)類型SQLite數(shù)據(jù)庫的數(shù)據(jù)類型為了與其他數(shù)據(jù)庫兼容,可以為字段指定默認(rèn)的類型同時(shí)還接受如下一些類型:char(n)n不能炒作254varchar(n)n不能超過4000datetimetimestamp數(shù)據(jù)類型2創(chuàng)建SQLite數(shù)據(jù)表通過SQL語句創(chuàng)建表創(chuàng)建SQLite數(shù)據(jù)表createtablebooks(idintegerprimarykeyautoincrement,namevarchar(128)notnullunique,authorvarchar(128)notnull,pricedoublenotnull);創(chuàng)建表間關(guān)聯(lián)(也就是通過外鍵建立關(guān)系)創(chuàng)建表間關(guān)聯(lián)createtablegroups(idintegerprimarykeyautoincrement,namevarchar(128)notnullunique);cratetableusers(idintegerprimarykeyautoincrement,group_idintegerconstraintfk_users_group_idreferencesgroups(id),usernamevarchar(128)notnullpasswordvarchar(128)notnull);事務(wù)控制SQLite支持?jǐn)?shù)據(jù)庫事務(wù)事務(wù)控制sqlite>begin;sqlite>insertinto……sqlite>commit;sqlite>rollabck;第3節(jié)管理數(shù)據(jù)庫連接知識(shí)點(diǎn)預(yù)覽#知識(shí)點(diǎn)重點(diǎn)難點(diǎn)應(yīng)用說明1文件保存位置√

介紹Android中SQLite數(shù)據(jù)庫文件位置。2打開數(shù)據(jù)庫連接√√介紹如何在程序中打開數(shù)據(jù)庫連接。3數(shù)據(jù)庫升級(jí)與存在性檢測(cè)√介紹如何在程序中創(chuàng)建和升級(jí)數(shù)據(jù)庫。4合理關(guān)閉數(shù)據(jù)庫連接√√√介紹數(shù)據(jù)庫連接的關(guān)閉時(shí)機(jī)

Android系統(tǒng)中SQLite數(shù)據(jù)庫文件的保存位置默認(rèn)情況下,數(shù)據(jù)庫文件保存在如下目錄中:/data/data/<應(yīng)用程序包>/databases用戶也可以指定將文件保存在任意有權(quán)限的目錄中通常SD卡中的目錄都可以文件保存位置在Android系統(tǒng)中連接數(shù)據(jù)庫使用SQLiteDatabase類連接數(shù)據(jù)庫通過SQLiteOpenHelper類來連接數(shù)據(jù)庫打開數(shù)據(jù)庫連接SQLiteDatabasedb=SQLiteDatabase.openOrCreateDatabase(dbFile,null);publicclassMyHelperextendsSQLiteOpenHelper{publicstaticfinalintVERSION=1;publicstaticfinalStringDATABASE_NAME=“test.db”;publicMyHelper(Contextcontext){

super(context,DATABASE_NAME,null,VERSION);}}SQLiteDatabasedb=helper.getWritableDatabase();數(shù)據(jù)庫升級(jí)與存在性檢測(cè)當(dāng)應(yīng)用升級(jí)的時(shí)候,需要檢測(cè)數(shù)據(jù)庫是否存在,或者是否要升級(jí)SQLiteOpenHelper提供了創(chuàng)建與升級(jí)的能力覆蓋onCreate(SQLiteDatabasedb)方法,完成創(chuàng)建任務(wù)數(shù)據(jù)庫升級(jí)與存在性檢測(cè)

publicvoidonCreate(SQLiteDatabasedb){Stringstr_sql="CREATETABLE"+TABLE_NAME+"(”+ID+"INTEGERPRIMARYKEYAUTOINCREMENT,”+TEXT+"text);";db.execSQL(str_sql);}publicMyHelper(Contextcontext){super(context,DATABASE_NAME,null,VERSION);}數(shù)據(jù)庫升級(jí)與存在性檢測(cè)覆蓋onUpdate方法,完成升級(jí)任務(wù)數(shù)據(jù)庫升級(jí)與存在性檢測(cè)2

publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){

//這里填寫數(shù)據(jù)庫升級(jí)操作的代碼}合理關(guān)閉數(shù)據(jù)庫連接不再使用或長時(shí)間不用時(shí),應(yīng)關(guān)閉數(shù)據(jù)庫連接程序退出時(shí)程序暫停時(shí)不再需要操作數(shù)據(jù)庫時(shí)使用SQLiteDatabase類中的close方法關(guān)閉連接合理關(guān)閉數(shù)據(jù)庫連接連接數(shù)據(jù)庫示例演示演示連接數(shù)據(jù)庫的示例第4節(jié)操作數(shù)據(jù)庫知識(shí)點(diǎn)預(yù)覽#知識(shí)點(diǎn)重點(diǎn)難點(diǎn)應(yīng)用說明1執(zhí)行查詢

介紹如何在程序中執(zhí)行數(shù)據(jù)庫查詢。2事務(wù)處理介紹如何在程序中處理事務(wù)。3執(zhí)行批量插入√√√介紹批量插入時(shí)的性能問題與解決辦法。執(zhí)行查詢(假設(shè)已經(jīng)存在了數(shù)據(jù)庫連接句柄db)在SQLiteDatabase中提供了如下方法用于查詢execSQLinsert、insertOrThrow、insertWithOnConflictquery、rawQueryreplace、replaceOrThrowupdate、updateWithOnConflictdelete執(zhí)行查詢執(zhí)行查詢(假設(shè)已經(jīng)存在了數(shù)據(jù)庫連接句柄db)插入記錄示例執(zhí)行查詢2//將一條新記錄的各個(gè)字段內(nèi)容裝入一個(gè)ContentValues對(duì)象ContentValuescv=newContentValues();cv.put("name",user.getName());cv.put("age",user.getAge());cv.put("remark",user.getRemark());//插入一條新記錄db.insert("users",null,cv);執(zhí)行查詢(假設(shè)已經(jīng)存在了數(shù)據(jù)庫連接句柄db)刪除記錄示例更新記錄示例執(zhí)行查詢3//第一個(gè)參數(shù)為表名//第二個(gè)參數(shù)表示where后的條件表達(dá)式,可以使用?//第三個(gè)參數(shù)則是一個(gè)對(duì)應(yīng)每一個(gè)?值的數(shù)組db.delete("users","id=?",newString[]{String.valueOf(userId)});ContentValuescv=newContentValues();cv.put("name",user.getName());cv.put("age",user.getAge());cv.put("remark",user.getRemark());db.update("users",cv,"id=?",newString[]{String.valueOf(userId)});執(zhí)行查詢(假設(shè)已經(jīng)存在了數(shù)據(jù)庫連接句柄db)單表查詢所有記錄示例執(zhí)行查詢4Cursorc=db.query("users",null,null,null,null,null,"name");List<User>users=null;if(c!=null){users=newArrayList<User>();while(c!=null&&c.moveToNext()){Useru=newUser();u.setId(c.getInt(0));u.setName(c.getString(1));u.setAge(c.getInt(2));u.setRemark(c.getString(3));users.add(u);}c.close();}執(zhí)行查詢(假設(shè)已經(jīng)存在了數(shù)據(jù)庫連接句柄db)單表?xiàng)l件查詢記錄示例執(zhí)行查詢5Cursorc=db.query(“users”,//表名newString[]{“name”,“age”},//select包含的字段

“age>?”,

//where條件表達(dá)式newString[]{“10”},

//條件值null,//group子句

null,//having子句“namedesc”//排序字段);執(zhí)行查詢(假設(shè)已經(jīng)存在了數(shù)據(jù)庫連接句柄db)任意SQL條件查詢記錄示例執(zhí)行查詢6Stringsql=“selectname,agefromuserswhereage>?”Cursorc=db.query(sqlnewString[]{“10”});事務(wù)是確保數(shù)據(jù)庫操作原子性的保障SQLiteDatabase提供了如下方法用于事務(wù)處理beginTransaction開啟事務(wù)setTransactionSuccessful提交事務(wù)endTransaction關(guān)閉事務(wù),如果未提交事務(wù),則自動(dòng)rollback事務(wù)處理db.beginTransaction();//開始事務(wù)try{……//這里填寫數(shù)據(jù)庫操作代碼db.setTransactionSuccessful();//提交事務(wù)}finally{db.endTransaction();//關(guān)閉事務(wù)}執(zhí)行批量插入時(shí)的性能問題簡單的批量插入實(shí)例這樣的程序在實(shí)際運(yùn)行時(shí)將會(huì)產(chǎn)生低效率由于沒有開啟事務(wù),使得每一次插入都會(huì)提交一次,耗時(shí)很長執(zhí)行批量插入for(inti=0;i<userList.size();i++){Useruser=userList.get(i);ContentValuescv=newContentValues();cv.put("name",user.getName());cv.put("age",user.getAge());cv.put("remark",user.getRemark());db.insert("users",null,cv);}執(zhí)行批量插入時(shí)的性能問題開啟事務(wù)的批量插入實(shí)例執(zhí)行批量插入2db.beginTransaction();try{for(inti=0;i<userList.size();i++){Useruser=userList.get(i);ContentValuescv=newContentValues();cv.put("name",user.getName());cv.put("age",user.getAge());cv.put("remark",user.getRemark());db.insert("users",null,cv);}db.setTransactionSuccessful();}finally{db.endTransaction();}數(shù)據(jù)庫操作示例演示演示數(shù)據(jù)庫操作示例第5節(jié)數(shù)據(jù)綁定知識(shí)點(diǎn)預(yù)覽#知識(shí)點(diǎn)重點(diǎn)難點(diǎn)應(yīng)用說明1數(shù)據(jù)綁定的必要性√

介紹數(shù)據(jù)綁定的必要性。2SimpleCursorAdapter√介紹用SimpleCursorAdapter進(jìn)行數(shù)據(jù)綁定。3修改綁定數(shù)據(jù)√介紹使用數(shù)據(jù)綁定時(shí)如何修改顯示數(shù)據(jù)。數(shù)據(jù)綁定是指將界面和數(shù)據(jù)進(jìn)行綁定在界面和數(shù)據(jù)之間建立綁定模式有助于數(shù)據(jù)的呈現(xiàn)Adapter其實(shí)就是界面和數(shù)據(jù)之間綁定的橋梁將視圖和數(shù)據(jù)綁定后將會(huì)降低維護(hù)數(shù)據(jù)的復(fù)雜度SimpleCursorAdapter提供了數(shù)據(jù)層的數(shù)據(jù)綁定橋梁數(shù)據(jù)綁定的必要性SimpleCursorAdapter可以將數(shù)據(jù)庫層的數(shù)據(jù)提供給列表1、準(zhǔn)備一個(gè)列表項(xiàng)的布局用于ListView的展現(xiàn)SimpleCursorAdapter<LinearLayoutxmlns:android=""android:layout_width="match_parent"android:layout_height="match_parent"android:orientation="horizontal">

<TextViewandroid:id="@+id/nametextview“android:layout_width="0dp“android:layout_height="40dp“android:layout_weight="1"/><TextViewandroid:id="@+id/agetextview“android:layout_width="80dp"android:layout_height="40dp"/></LinearLayout>SimpleCursorAdapter可以將數(shù)據(jù)庫層的數(shù)據(jù)提供給列表2、使用SimpleCursorAdapter展現(xiàn)數(shù)據(jù)SimpleCursorAdapter2ListViewbookListView=(ListView)findViewById(R.id.booklist);String[]from=newString[]{"_name","_age“};int[]to=newint[]{R.textview,R.id.agetextview};Cursorcursor=db.rawQuery(“select*frombooks”,null);SimpleCursorAdapteradapter=newSimpleCursorAdapter(MainActivity.this,R.layout.book_list_item,cursor,from,to,0);bookListView.setAdapter(adapter);修改綁定數(shù)據(jù)有時(shí)候直接展現(xiàn)的數(shù)據(jù)可能不符合要求,需要轉(zhuǎn)變后展示可以通過SimpleCursorAdapter.ViewBinder接口來實(shí)現(xiàn)修改的步驟如下:1、編寫一個(gè)類實(shí)現(xiàn)SimpleCursorAdapter.ViewBinder接口修改綁定數(shù)據(jù)SimpleCursorAdapter.ViewBinderviewBinder=newSimpleCursorAdapter.ViewBinder(){publicbooleansetViewValue(Viewview,Cursorcursor,intcolumnIndex){if(cursor.getColumnIndex("_name")==columnIndex){TextViewv=(TextView)view;v.setText("N:"+cursor.getString(columnIndex));returntrue;}returnfalse;}};修改綁定數(shù)據(jù)修改的步驟如下:2、使用ViewBinder修改數(shù)據(jù)修改綁定數(shù)據(jù)2ListViewbookListView=(ListView)findViewById(R.id.booklist);String[]from=newString[]{"_name","_age“};int[]to=newint[]{R.textview,R.id.agetextview};Cursorcursor=db.rawQuery(“select*frombooks”,null);SimpleCursorAdapteradapter=newSimpleCursorAdapte

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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)論