版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Android數(shù)據(jù)存儲(chǔ)數(shù)據(jù)存儲(chǔ)應(yīng)用程序的基本功能數(shù)據(jù)需要以某種方式保存而不會(huì)丟失數(shù)據(jù)能夠有效方便的被使用Android數(shù)據(jù)存儲(chǔ)4種數(shù)據(jù)存儲(chǔ)方式SharedPreferencesFilesSQLiteContentProviders1Android數(shù)據(jù)存儲(chǔ)(2)SharedPreferences用來(lái)存儲(chǔ)鍵-值對(duì)形式的數(shù)據(jù)輕量級(jí)的鍵值存儲(chǔ)方式,用來(lái)存儲(chǔ)基本數(shù)據(jù)Files通過(guò)文件來(lái)進(jìn)行數(shù)據(jù)的存儲(chǔ)文件是私有的SQLite支持SQL的關(guān)系數(shù)據(jù)庫(kù)ContentProviders實(shí)現(xiàn)程序之間對(duì)數(shù)據(jù)的共享通過(guò)提供公共URI(對(duì)象)2第8章數(shù)據(jù)存儲(chǔ)與訪問(wèn)8.1SharedPreferences8.2SQLite數(shù)據(jù)庫(kù)8.1SharedPreferencesSharedPreferences是一種輕量級(jí)數(shù)據(jù)存儲(chǔ)方式,能夠?qū)崿F(xiàn)不同應(yīng)用程序間數(shù)據(jù)共享。(有點(diǎn)類(lèi)似Web中的Cookie)
保存在Android文件系統(tǒng)中屏蔽了文件系統(tǒng)的操作過(guò)程SharedPreferences使用鍵值對(duì)(Name/Value)的方式把簡(jiǎn)單數(shù)據(jù)類(lèi)型(boolean、int、float、long和String)存儲(chǔ)在應(yīng)用程序的私有目錄下自己定義的xml文件中。私有目錄是:/data/data/應(yīng)用程序包名/shared_prefs/SharedPreferences(2)SharedPreferences支持的數(shù)據(jù)類(lèi)型布爾類(lèi)型字符串類(lèi)型長(zhǎng)整型整型可存儲(chǔ)的數(shù)據(jù)對(duì)象默認(rèn)值類(lèi)實(shí)例變量當(dāng)前UI狀態(tài)用戶(hù)首選項(xiàng)SharedPreferences可跨越用戶(hù)會(huì)話(huà)持久保存數(shù)據(jù)并可以在應(yīng)用程序之間進(jìn)行共享設(shè)置5SharedPreferences支持三種訪問(wèn)模式MODE_PRIVATE(私有):僅創(chuàng)建SharedPreferences的程序有權(quán)限對(duì)其進(jìn)行讀取或?qū)懭隡ODE_WORLD_READABLE(全局讀):不僅創(chuàng)建程序可以對(duì)其進(jìn)行讀取或?qū)懭耄渌鼞?yīng)用程序也具有讀取操作的權(quán)限,但沒(méi)有寫(xiě)入操作的權(quán)限MODE_WORLD_WRITEABLE(全局寫(xiě)):所有程序都可以對(duì)其進(jìn)行寫(xiě)入操作,但沒(méi)有讀取操作的權(quán)限SharedPreferences編程主要步驟(1)先創(chuàng)建SharedPreferences對(duì)象,例如:
SharedPreferencessp=getSharedPreferences(名稱(chēng),訪問(wèn)模式);(2)寫(xiě)入數(shù)據(jù):
SharedPreferences.Editoreditor=sp.edit();editor.putString("Name","Tom");//put方法寫(xiě)數(shù)據(jù)
mit();//一定要提交才能保存(3)讀取數(shù)據(jù):
SharedPreferencessp=getSharedPreferences(名稱(chēng),訪問(wèn)模式);Stringname=sp.getString("Name","DefaultVal");//對(duì)應(yīng)的get方法讀數(shù)據(jù)第2個(gè)參數(shù):在無(wú)法獲取值的時(shí)候使用的缺省值SharedPreferences數(shù)據(jù)保存的文件名SharedPreferences示例第一次運(yùn)行輸入3個(gè)值保存后退出,下一次再啟動(dòng)程序時(shí)自動(dòng)將保存的值讀取出來(lái)顯示MainActivity主要代碼(保存數(shù)據(jù))protectedvoidonCreate(BundlesavedInstanceState){…finalEditTextet1=(EditText)findViewById(R.id.editText1);finalEditTextet2=(EditText)findViewById(R.id.editText2);finalEditTextet3=(EditText)findViewById(R.id.editText3);Buttonbt1=(Button)findViewById(R.id.button1);bt1.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewarg0){SharedPreferencessp=getSharedPreferences("MyInfo",Context.MODE_WORLD_READABLE+Context.MODE_WORLD_WRITEABLE);SharedPreferences.Editoreditor=sp.edit();editor.putString("username",et1.getText().toString());editor.putString("password",et2.getText().toString());editor.putInt("age",Integer.parseInt(et3.getText().toString()));mit();}});}數(shù)據(jù)保存的文件名為MyInfo.xml讀和寫(xiě)操作2種權(quán)限提交保存putInt()時(shí)注意轉(zhuǎn)換數(shù)據(jù)Put方法存儲(chǔ)數(shù)據(jù)ThisconstantwasdeprecatedinAPIlevel17.Creatingworld-readablefilesisverydangerous,andlikelytocausesecurityholesinapplications.Itisstronglydiscouraged;instead,applicationsshouldusemoreformalmechanismforinteractionssuchasContentProvider,BroadcastReceiver,andService.Therearenoguaranteesthatthisaccessmodewillremainonafile,suchaswhenitgoesthroughabackupandrestore.Filecreationmode:allowallotherapplicationstohavereadaccesstothecreatedfile.MainActivity主要代碼(讀取數(shù)據(jù))@OverrideprotectedvoidonStart(){EditTextet1=(EditText)findViewById(R.id.editText1);EditTextet2=(EditText)findViewById(R.id.editText2);EditTextet3=(EditText)findViewById(R.id.editText3);
SharedPreferencessp=getSharedPreferences("MyInfo",
Context.MODE_WORLD_READABLE);et1.setText(sp.getString("username","noname"));et2.setText(sp.getString("password","000000"));et3.setText(String.valueOf(sp.getInt("age",0)));super.onStart();}從MyInfo.xml文件中讀取數(shù)據(jù)getInt()后注意轉(zhuǎn)換為字符串用對(duì)應(yīng)的get方法讀取數(shù)據(jù)第2個(gè)參數(shù):在無(wú)法獲取值的時(shí)候使用的缺省值查看設(shè)備上的SharedPreferences數(shù)據(jù)(本例在MyInfo.xml中)/data/data/包名/shared_prefs/MyInfo.xml文件打開(kāi)DDMS補(bǔ)充:Linux系統(tǒng)中的文件權(quán)限Linux系統(tǒng)中的文件權(quán)限描述創(chuàng)建者、同組用戶(hù)和其他用戶(hù)對(duì)文件的操作限制x表示可執(zhí)行,r表示可讀,w表示可寫(xiě),d表示目錄,-表示普通文件“-rw-rw-rw”表示文件可以被創(chuàng)建者、同組用戶(hù)和其他用戶(hù)進(jìn)行讀取和寫(xiě)入操作,但不可執(zhí)行產(chǎn)生的文件權(quán)限與程序人員設(shè)定的SharedPreferences的訪問(wèn)模式有關(guān)“-rw-rw-rw”的權(quán)限是“全局讀+全局寫(xiě)”的結(jié)果SharedPreferences的訪問(wèn)模式設(shè)置為私有文件權(quán)限將成為“-rw-rw---”表示僅有創(chuàng)建者和同組用戶(hù)具有讀寫(xiě)文件的權(quán)限13MyInfo.xml文件內(nèi)容<?xmlversion='1.0'encoding='utf-8'standalone='yes'?><map><stringname="password">123456</string><stringname="username">wustzz</string><intname="age"value="39"/></map>editor.putString("username",et1.getText().toString());editor.putString("password",et2.getText().toString());editor.putInt("age",Integer.parseInt(et3.getText().toString()));【返回】8.2SQLite數(shù)據(jù)庫(kù)SQLite是在2000年由D.RichardHipp發(fā)布,可以支援Java、Net、PHP、Ruby、Python、Perl、C等幾乎所有的現(xiàn)代編程語(yǔ)言,支持Windows、Linux、Unix、MacOS、Android、IOS等幾乎所有的主流操作系統(tǒng)平臺(tái)。D.RichardHippAndroid在運(yùn)行時(shí)(run-time)集成了SQLite,所以每個(gè)Android應(yīng)用程序都可以使用SQLite數(shù)據(jù)庫(kù)。SQLite特點(diǎn)SQLite是一款開(kāi)源的、輕量級(jí)的、嵌入式的、關(guān)系型數(shù)據(jù)庫(kù)。普通數(shù)據(jù)庫(kù)的管理系統(tǒng)比較龐大和復(fù)雜,會(huì)占用了較多的系統(tǒng)資源,輕量級(jí)數(shù)據(jù)庫(kù)SQLite的特點(diǎn):比傳統(tǒng)數(shù)據(jù)庫(kù)更適合用于嵌入式系統(tǒng)占用資源少,運(yùn)行高效可靠,可移植性強(qiáng)提供了零配置(zero-configuration)運(yùn)行模式數(shù)據(jù)庫(kù)存儲(chǔ)在:/data/data/應(yīng)用程序包名/databases/SQLite編程示例假設(shè)數(shù)據(jù)庫(kù)名稱(chēng):test.dbperson表結(jié)構(gòu):列名類(lèi)型說(shuō)明idINTEGER(自增)主鍵name
VARCHARageSMALLINT準(zhǔn)備工作先建一個(gè)Person類(lèi):publicclassPerson{publicintid;publicStringname;publicintage;publicPerson(){}publicPerson(Stringname,intage){=name;this.age=age;;}}SQLite基本編程--創(chuàng)建數(shù)據(jù)庫(kù)和表//打開(kāi)或創(chuàng)建test.db數(shù)據(jù)庫(kù)SQLiteDatabasedb=openOrCreateDatabase("test.db",
Context.MODE_PRIVATE,null);
db.execSQL("DROPTABLEIFEXISTSperson");
//創(chuàng)建person表db.execSQL("CREATETABLEperson(idINTEGERPRIMARYKEY
AUTOINCREMENT,nameVARCHAR,ageSMALLINT)");execSQL()方法執(zhí)行標(biāo)準(zhǔn)的SQL語(yǔ)句主鍵自增不能將數(shù)據(jù)庫(kù)設(shè)為WORLD_READABLE每個(gè)數(shù)據(jù)庫(kù)都只能被創(chuàng)建它的包訪問(wèn),數(shù)據(jù)庫(kù)名CursorFactory一般設(shè)置為空查看SQLite數(shù)據(jù)庫(kù)文件(本例為test.db)/data/data/包名/databases/test.db文件打開(kāi)DDMSSQLite基本編程--添加數(shù)據(jù)Personperson=newPerson();="wust";person.age=20;//插入數(shù)據(jù)db.execSQL("INSERTINTOpersonVALUES(NULL,?,?)",newObject[]{,person.age});
?為占位符由于id字段是主鍵且自增,在添加記錄時(shí)系統(tǒng)會(huì)自動(dòng)生成id值,因此不需要再在程序中添加。注意填充占位符的數(shù)據(jù)定義方法SQLite基本編程--添加數(shù)據(jù)2Personperson2=newPerson("Tom",20);//ContentValues以鍵值對(duì)的形式存放數(shù)據(jù)ContentValuescv=newContentValues();cv.put("name",);cv.put("age",person2.age);//插入ContentValues中的數(shù)據(jù)db.insert("person",null,cv);//第二個(gè)參數(shù)一般設(shè)置為nullSQLite基本編程--更新數(shù)據(jù)cv=newContentValues();cv.put("age",35);//用ContentValues中的數(shù)據(jù)更新記錄db.update("person",cv,"name=?",newString[]{"Tom"});//或者//db.execSQL("Updatepersonsetage=?wherename=?",newObject[]{35,"Tom"});條件語(yǔ)句條件值SQLite基本編程--刪除數(shù)據(jù)//刪除數(shù)據(jù)db.delete("person","age<?",newString[]{"38"});//或者//db.execSQL("Deletefrompersonwhereage<?",newObject[]{"38"});SQLite為弱類(lèi)型,會(huì)自動(dòng)將String轉(zhuǎn)換為intSQLite基本編程--查詢(xún)數(shù)據(jù)TextViewtv=(TextView)findViewById(R.id.textView1);//簡(jiǎn)單用TextView顯示數(shù)據(jù)Cursorc=db.rawQuery("SELECT*FROMpersonwhereage>?",newString[]{"10"});while(c.moveToNext()){intid=c.getInt(c.getColumnIndex("id"));
Stringname=c.getString(c.getColumnIndex("name"));intage=c.getInt(c.getColumnIndex("age"));tv.setText(tv.getText()+"\n"+"id="+id+",name="+name+",age="+age);}c.close();rawQuery()原生查詢(xún),返回值是Cursor游標(biāo)(結(jié)果集)根據(jù)列號(hào)來(lái)取值處理完畢后記得關(guān)閉游標(biāo)Cursor游標(biāo)的一些重要操作c.move(intoffset);//以當(dāng)前位置為參考,移動(dòng)到指定行c.moveToFirst(); //移動(dòng)到第一行c.moveToLast(); //移動(dòng)到最后一行c.moveToPosition(intposition);//移動(dòng)到指定行c.moveToPrevious();//移動(dòng)到前一行c.moveToNext(); //移動(dòng)到下一行c.isFirst();//是否指向第一條c.isLast();//是否指向最后一條c.isNull(intcolumnIndex); //指定列是否為空(列基數(shù)為0)c.isClosed(); //游標(biāo)是否已關(guān)閉c.getCount(); //總數(shù)據(jù)項(xiàng)數(shù)c.getPosition(); //返回當(dāng)前游標(biāo)所指向的行數(shù)c.getColumnIndex(StringcolumnName);//返回某列名對(duì)應(yīng)的列索引值c.getString(intcolumnIndex);//返回當(dāng)前行指定列的值SQLite基本編程--示例SQLiteDemo實(shí)例:建立數(shù)據(jù)庫(kù)(20)SQLiteDemo數(shù)據(jù)庫(kù)操作28關(guān)于SQLiteOpenHelper輔助類(lèi)Android提供了一個(gè)名為SQLiteOpenHelper的輔助類(lèi)幫助開(kāi)發(fā)人員創(chuàng)建一個(gè)數(shù)據(jù)庫(kù)。SQLiteOpenHelper是一個(gè)包裝了數(shù)據(jù)庫(kù)的創(chuàng)建、打開(kāi)和更新的抽象類(lèi)。創(chuàng)建過(guò)程:當(dāng)前項(xiàng)目src某包上->右鍵->New->class
->輸入class名(例如DBConnection),并繼承SQLiteOpenHelper類(lèi)即可。SQLiteOpenHelper子類(lèi)主要代碼publicclassDBConnectionextendsSQLiteOpenHelper{
DBConnection(Contextcontext,Stringname,CursorFactoryfactory,intversion){
super(context,name,factory,version);
}@OverridepublicvoidonCreate(SQLiteDatabasedb){
//數(shù)據(jù)庫(kù)第一次被創(chuàng)建時(shí)onCreate被調(diào)用//通常將創(chuàng)建表的操作放在這里
}@OverridepublicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){
//當(dāng)數(shù)據(jù)庫(kù)版本發(fā)生變化時(shí)會(huì)調(diào)用onUpgrade//這里可寫(xiě)更新數(shù)據(jù)表的操作,也可空著不寫(xiě)
}}構(gòu)造函數(shù)的四個(gè)參數(shù):上下文環(huán)境(例如一個(gè)Activity)數(shù)據(jù)庫(kù)名字游標(biāo)工廠(通常是Null)數(shù)據(jù)庫(kù)版本號(hào)開(kāi)發(fā)人員為了方便數(shù)據(jù)庫(kù)操作可以進(jìn)一步擴(kuò)展SQLiteOpenHelper類(lèi)DBConnection擴(kuò)展示例publicclassDBConnectionextendsSQLiteOpenHelper{privatestaticfinalStringDATABASE_NAME="test.db";privatestaticfinalintDATABASE_VERSION=1;
privatestaticContextcontext;
publicDBConnection(){super(context,DATABASE_NAME,null,DATABASE_VERSION);}@OverridepublicvoidonCreate(SQLiteDatabasedb){db.execSQL("CREATETABLEIFNOTEXISTSperson"+"(idINTEGERPRIMARYKEYAUTOINCREMENT,nameVARCHAR,ageINTEGER)");}新建一個(gè)構(gòu)造函數(shù)數(shù)據(jù)庫(kù)名數(shù)據(jù)庫(kù)版本號(hào)數(shù)據(jù)庫(kù)第一次被創(chuàng)建時(shí)onCreate被調(diào)用,這里用來(lái)創(chuàng)建數(shù)據(jù)表DBConnection擴(kuò)展示例@OverridepublicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){}publicstaticvoidsetContext(Contextcontext){DBConnection.context=context;}publicSQLiteDatabasegetConnection(){SQLiteDatabasedb=getWritableDatabase();returndb;}publicvoidclose(SQLiteDatabasedb){db.close();}}新添加3個(gè)方法getWritableDatabase():打開(kāi)一個(gè)可以讀寫(xiě)的數(shù)據(jù)庫(kù)getReadableDatabase():打開(kāi)一個(gè)只讀的數(shù)據(jù)庫(kù)設(shè)置上下文連接數(shù)據(jù)庫(kù)(打開(kāi)數(shù)據(jù)庫(kù))關(guān)閉數(shù)據(jù)庫(kù)實(shí)例:建立數(shù)據(jù)庫(kù)直接創(chuàng)建數(shù)據(jù)庫(kù)首先調(diào)用openOrCreateDatabases()函數(shù)創(chuàng)建數(shù)據(jù)庫(kù)對(duì)象然后執(zhí)行SQL命令建立數(shù)據(jù)庫(kù)中的表和直接的關(guān)系不使用SQLiteOpenHelper類(lèi)33privatestaticfinalStringDB_CREATE="createtable"+ DB_TABLE+"("+KEY_ID+"integerprimarykeyautoincrement,"+ KEY_NAME+"textnotnull,"+KEY_AGE+"integer,"+KEY_HEIGHT+"float);";publicvoidcreate(){ db.openOrCreateDatabases(DB_NAME,context.MODE_PRIVATE,null) db.execSQL(DB_CREATE);}使用SQLiteOpenHelper子類(lèi)DBConnectionDBConnection.setContext(getApplicationContext());
//必須先設(shè)置上下文或用MainActivity.this//創(chuàng)建DBConnection對(duì)象(含創(chuàng)建數(shù)據(jù)庫(kù)+數(shù)據(jù)表)DBConnectionconn=newDBConnection();//打開(kāi)數(shù)據(jù)庫(kù)SQLiteDatabasedb=conn.getConnection();//后面的操作同前TextViewtv=(TextView)findViewById(R.id.textView1);Cursorc=db.rawQuery("SELECT*FROMpersonwhereage>?",newString[]{"10"});while(c.moveToNext()){intid=c.getInt(c.getColumnIndex("id"));Stringname=c.getString(c.getColumnIndex("name"));intage=c.getInt(c.getColumnIndex("age"));tv.setText(tv.getText()+"\n"+"id="+id+",name="+name+",age="+age);}c.close();//關(guān)閉Cursorconn.close(db);//關(guān)閉當(dāng)前數(shù)據(jù)庫(kù)SQLite數(shù)據(jù)庫(kù)編程實(shí)例例子:
【完】動(dòng)態(tài)建立和使用SQLite數(shù)據(jù)庫(kù)動(dòng)態(tài)建立SQLite數(shù)據(jù)庫(kù)在程序中使用代碼動(dòng)態(tài)建立數(shù)據(jù)庫(kù)數(shù)據(jù)庫(kù)的建立創(chuàng)建和打開(kāi)數(shù)據(jù)庫(kù)使用openOrCreateDatabase方法openOrCreateDatabase方自動(dòng)檢測(cè)數(shù)據(jù)庫(kù)的存在如果存在打開(kāi)數(shù)據(jù)庫(kù)如果數(shù)據(jù)庫(kù)并不存在,自動(dòng)建立數(shù)據(jù)庫(kù)后打開(kāi)創(chuàng)建成功,返回SQLiteDatabase對(duì)象創(chuàng)建不成功,拋出FileNotFoundException數(shù)據(jù)庫(kù)操作的封裝編程實(shí)現(xiàn)時(shí)一般將所有對(duì)數(shù)據(jù)庫(kù)的操作都封裝在一個(gè)類(lèi)中調(diào)用這個(gè)類(lèi)來(lái)完成對(duì)數(shù)據(jù)庫(kù)的操作添加,更新,刪除,查詢(xún)等36實(shí)例:建立數(shù)據(jù)庫(kù)DBAdapter類(lèi)封裝數(shù)據(jù)庫(kù)的建立、打開(kāi)和關(guān)閉等操作37publicclassDBAdapter{ privatestaticfinalStringDB_NAME="people.db"; privatestaticfinalStringDB_TABLE="peopleinfo"; privatestaticfinalintDB_VERSION=1;
publicstaticfinalStringKEY_ID="_id"; publicstaticfinalStringKEY_NAME="name"; publicstaticfinalStringKEY_AGE="age"; publicstaticfinalStringKEY_HEIGHT="height";
privateSQLiteDatabasedb; privatefinalContextcontext; privateDBOpenHelperdbOpenHelper;實(shí)現(xiàn)內(nèi)部靜態(tài)類(lèi)DBOpenHelper,繼承幫助類(lèi)SQLiteOpenHelper輔助建立、更新和打開(kāi)數(shù)據(jù)庫(kù)DBAdapter類(lèi)中首先聲明數(shù)據(jù)庫(kù)的基本信息聲明SQLiteDatabase對(duì)象db,建立刪除數(shù)據(jù)庫(kù)、執(zhí)行SQL命令對(duì)數(shù)據(jù)進(jìn)行管理實(shí)例:建立數(shù)據(jù)庫(kù)(2)3814. privatestaticclassDBOpenHelperextendsSQLiteOpenHelper{ publicDBAdapter(Context_context){ context=_context; }
publicvoidopen()throwsSQLiteException{ dbOpenHelper=newDBOpenHelper(context,DB_NAME,null,DB_VERSION); try{ db=dbOpenHelper.getWritableDatabase(); }catch(SQLiteExceptionex){ db=dbOpenHelper.getReadableDatabase(); } }
open()函數(shù)中并沒(méi)有任何對(duì)數(shù)據(jù)庫(kù)進(jìn)行實(shí)際操作的代碼調(diào)用SQLiteOpenHelper類(lèi)的getWritableDatabase()函數(shù)和getReadableDatabase()函數(shù)這個(gè)兩個(gè)函數(shù)會(huì)根據(jù)數(shù)據(jù)庫(kù)是否存在、版本號(hào)和是否可寫(xiě)等情況,決定在返回?cái)?shù)據(jù)庫(kù)對(duì)象前,是否需要建立數(shù)據(jù)庫(kù)實(shí)例:建立數(shù)據(jù)庫(kù)(3)39
publicvoidclose(){ if(db!=null){ db.close(); db=null; } }}close()函數(shù)中調(diào)用了SQLiteDatabase對(duì)象的close()方法關(guān)閉數(shù)據(jù)庫(kù)唯一直接調(diào)用SQLiteDatabase對(duì)象的方法SQLiteDatabase中封裝打開(kāi)數(shù)據(jù)庫(kù)的函數(shù)openDatabases()創(chuàng)建數(shù)據(jù)庫(kù)函數(shù)openOrCreateDatabases()代碼中使用幫助類(lèi)SQLiteOpenHelper避免直接調(diào)用SQLiteDatabase中的打開(kāi)和創(chuàng)建數(shù)據(jù)庫(kù)的方法簡(jiǎn)化數(shù)據(jù)庫(kù)打開(kāi)過(guò)程中繁瑣的邏輯判斷過(guò)程實(shí)例:建立數(shù)據(jù)庫(kù)(6)重載onCreate()函數(shù)和onUpgrade()函數(shù)40privatestaticclassDBOpenHelperextendsSQLiteOpenHelper{publicDBOpenHelper(Contextcontext,Stringname,CursorFactoryfactory,intversion){ super(context,name,factory,version); }privatestaticfinalStringDB_CREATE="createtable"+ DB_TABLE+"("+KEY_ID+"integerprimarykeyautoincrement,"+KEY_NAME+"textnotnull,"+KEY_AGE+"integer,"+KEY_HEIGHT+"float);";@OverridepublicvoidonCreate(SQLiteDatabase_db){ db.execSQL(DB_CREATE); }
onCreate()函數(shù)在數(shù)據(jù)庫(kù)第一次建立時(shí)被調(diào)用實(shí)例:建立數(shù)據(jù)庫(kù)(7)41@Override publicvoidonUpgrade(SQLiteDatabase_db,int_oldVersion,int_newVersion){ _db.execSQL("DROPTABLEIFEXISTS"+DB_TABLE); onCreate(_db); }}onUpgrade()函數(shù)在數(shù)據(jù)庫(kù)需要升級(jí)時(shí)被調(diào)用一般用來(lái)刪除舊的數(shù)據(jù)庫(kù)表,并將數(shù)據(jù)轉(zhuǎn)移到新版本的數(shù)據(jù)庫(kù)表中實(shí)例:建立數(shù)據(jù)庫(kù)(9)函數(shù)的調(diào)用onCreate()和onUpgrade()函數(shù)調(diào)用程序員不應(yīng)直接調(diào)用由SQLiteOpenHelper類(lèi)來(lái)決定何時(shí)調(diào)用這兩個(gè)函數(shù)getWritableDatabase()函數(shù)和getReadableDatabase()函數(shù)可以直接調(diào)用屬于SQLiteOpenHelper類(lèi)getWritableDatabase()函數(shù)用來(lái)建立或打開(kāi)可讀寫(xiě)的數(shù)據(jù)庫(kù)對(duì)象函數(shù)調(diào)用成功后數(shù)據(jù)庫(kù)對(duì)象將被緩存任何需要使用數(shù)據(jù)庫(kù)對(duì)象時(shí),都可以調(diào)用這個(gè)方法獲取到數(shù)據(jù)庫(kù)對(duì)象不使用時(shí)必須調(diào)用close()函數(shù)關(guān)閉數(shù)據(jù)庫(kù)如果保存數(shù)據(jù)庫(kù)文件的磁盤(pán)空間已滿(mǎn),調(diào)用getWritableDatabase()函數(shù)則無(wú)法獲得可讀寫(xiě)的數(shù)據(jù)庫(kù)對(duì)象,可==可以調(diào)用getReadableDatabase()函數(shù),獲得一個(gè)只讀的數(shù)據(jù)庫(kù)對(duì)象42實(shí)例:建立數(shù)據(jù)庫(kù)(10)數(shù)據(jù)操作對(duì)數(shù)據(jù)的添加、刪除、查找和更新的操作通過(guò)執(zhí)行SQL命名完成數(shù)據(jù)操作推薦使用Android提供的專(zhuān)用類(lèi)和方法更加簡(jiǎn)潔易用在DBAdapter類(lèi)中增加下面的這些函數(shù)使DBAdapter類(lèi)支持?jǐn)?shù)據(jù)操作insert(Peoplepeople):添加一條數(shù)據(jù)queryAllData():獲取全部數(shù)據(jù)queryOneData(longid):根據(jù)id獲取一條數(shù)據(jù)deleteAllData():刪除全部數(shù)據(jù)deleteOneData(longid):根據(jù)id刪除一條數(shù)據(jù)updateOneData(longid,Peoplepeople):根據(jù)id更新一條數(shù)據(jù)43實(shí)例:建立數(shù)據(jù)庫(kù)(11)ConvertToPeople(Cursorcursor)私有函數(shù),將查詢(xún)結(jié)果轉(zhuǎn)換為用來(lái)存儲(chǔ)數(shù)據(jù)自定義的People類(lèi)對(duì)象People類(lèi)的四個(gè)公共屬性ID、Name、Age和Height,對(duì)應(yīng)數(shù)據(jù)庫(kù)中的四個(gè)屬性值重載toString()函數(shù)主要是便于界面顯示的需要44publicclassDBAdapter{ publiclonginsert(Peoplepeople){} publiclongdeleteAllData(){} publiclongdeleteOneData(longid){} publicPeople[]queryAllData(){} publicPeople[]queryOneData(longid){} publiclongupdateOneData(longid,Peoplepeople){}
privatePeople[]ConvertToPeople(Cursorcursor){}}實(shí)例:建立數(shù)據(jù)庫(kù)(12)People類(lèi)45
publicclassPeople{ publicintID=-1; publicStringName; publicintAge; publicfloatHeight;
@Override publicStringtoString(){ Stringresult=""; result+="ID:"+this.ID+","; result+="姓名:"+this.Name+","; result+="年齡:"+this.Age+","; result+="身高:"+this.Height+","; returnresult; }}實(shí)例:建立數(shù)據(jù)庫(kù)(13)添加功能首先構(gòu)造一個(gè)ContentValues對(duì)象然后調(diào)用ContentValues對(duì)象的put()方法將每個(gè)屬性的值寫(xiě)入到ContentValues對(duì)象中最后使用SQLiteDatabase對(duì)象的insert()函數(shù)將ContentValues對(duì)象中的數(shù)據(jù)寫(xiě)入指定的數(shù)據(jù)庫(kù)表中insert()函數(shù)的返回值新數(shù)據(jù)插入的位置,即ID值ContentValues類(lèi)是一個(gè)數(shù)據(jù)承載容器主要用來(lái)向數(shù)據(jù)庫(kù)表中添加一條數(shù)據(jù)46SQ實(shí)例:建立數(shù)據(jù)庫(kù)(14)添加功能向ContentValues對(duì)象newValues中添加一個(gè)名稱(chēng)/值對(duì)put()函數(shù)的第1個(gè)參數(shù)是名稱(chēng),第2個(gè)參數(shù)是值insert()函數(shù)的第1個(gè)參數(shù)是數(shù)據(jù)表的名稱(chēng),第2個(gè)參數(shù)是在NULL時(shí)的替換數(shù)據(jù),第3個(gè)參數(shù)是需要向數(shù)據(jù)庫(kù)表中添加的數(shù)據(jù)47publiclonginsert(Peoplepeople){ ContentValuesnewValues=newContentValues();
newValues.put(KEY_NAME,people.Name); newValues.put(KEY_AGE,people.Age); newValues.put(KEY_HEIGHT,people.Height);
returndb.insert(DB_TABLE,null,newValues);}ContentValues類(lèi)是一個(gè)數(shù)據(jù)承載容器實(shí)例:建立數(shù)據(jù)庫(kù)(15)刪除功能刪除數(shù)據(jù)比較簡(jiǎn)單只需調(diào)用當(dāng)前數(shù)據(jù)庫(kù)對(duì)象的delete()函數(shù),并指明表名稱(chēng)和刪除條件即可delete()函數(shù)的第1個(gè)參數(shù)是數(shù)據(jù)庫(kù)的表名稱(chēng),第2個(gè)參數(shù)是刪除條件第2行代碼:刪除條件為null,表示刪除表中的所有數(shù)據(jù)第6行代碼:指明需要?jiǎng)h除數(shù)據(jù)的id值,deleteOneData()函數(shù)僅刪除一條數(shù)據(jù),delete()函數(shù)的返回值表示被刪除的數(shù)據(jù)的數(shù)量48publiclongdeleteAllData(){ returndb.delete(DB_TABLE,null,null);}publiclongdeleteOneData(longid){ returndb.delete(DB_TABLE,KEY_ID+"="+id,null);}實(shí)例:建立數(shù)據(jù)庫(kù)(16)更新功能需要使用ContentValues對(duì)象首先構(gòu)造ContentValues對(duì)象然后調(diào)用put()函數(shù)將屬性的值寫(xiě)入到ContentValues對(duì)象中最后使用SQLiteDatabase對(duì)象的update()函數(shù),并指定數(shù)據(jù)的更新條件第7行代碼:update()函數(shù)的第1個(gè)參數(shù)表示數(shù)據(jù)表的名稱(chēng),第2個(gè)參數(shù)是更新條件。update()函數(shù)的返回值表示數(shù)據(jù)庫(kù)表中被更新的數(shù)據(jù)數(shù)量49publiclongupdateOneData(longid,Peoplepeople){ ContentValuesupdateValues=newContentValues(); updateValues.put(KEY_NAME,people.Name); updateValues.put(KEY_AGE,people.Age); updateValues.put(KEY_HEIGHT,people.Height);
returndb.update(DB_TABLE,updateValues,KEY_ID+"="+id,null);}實(shí)例:建立數(shù)據(jù)庫(kù)(17)50privatePeople[]ConvertToPeople(Cursorcursor){ intresultCounts=cursor.getCount(); if(resultCounts==0||!cursor.moveToFirst()){ returnnull; } People[]peoples=newPeople[resultCounts]; for(inti=0;i<resultCounts;i++){ peoples[i]=newPeople(); peoples[i].ID=cursor.getInt(0); peoples[i].Name=cursor.getString(cursor.getColumnIndex(KEY_NAME)); peoples[i].Age=cursor.getInt(cursor.getColumnIndex(KEY_AGE)); peoples[i].Height=cursor.getFloat(cursor.getColumnIndex(KEY_HEIGHT)); cursor.moveToNext(); } returnpeoples;}實(shí)例:建立數(shù)據(jù)庫(kù)(18)數(shù)據(jù)查詢(xún)調(diào)用SQLiteDatabase類(lèi)的query()函數(shù)query()函數(shù)的語(yǔ)法如下query()函數(shù)的參數(shù)說(shuō)明51Cursorandroid.database.sqlite.SQLiteDatabase.query(Stringtable,String[]columns,Stringselection,String[]selectionArgs,StringgroupBy,Stringhaving,StringorderBy)位置類(lèi)型+名稱(chēng)說(shuō)明1Stringtable表名稱(chēng)2String[]columns返回的屬性列名稱(chēng)3Stringselection查詢(xún)條件4String[]selectionArgs如果在查詢(xún)條件中使用的問(wèn)號(hào),則需要定義替換符的具體內(nèi)容5StringgroupBy分組方式6Stringhaving定義組的過(guò)濾器7StringorderBy排序方式實(shí)例:建立數(shù)據(jù)庫(kù)(19)根據(jù)id查詢(xún)數(shù)據(jù)的代碼根據(jù)id查詢(xún)?nèi)繑?shù)據(jù)的代碼52publicPeople[]getOneData(longid){ Cursorresults=db.query(DB_TABLE,newString[]{KEY_ID,KEY_NAME,KEY_AGE,KEY_HEIGHT},KEY_ID+"="+id,null,null,null,null); returnConvertToPeople(results);}publicPeople[]getAllData(){ Cursorresults=db.query(DB_TABLE,newString[]{KEY_ID,KEY_NAME,KEY_AGE,KEY_HEIGHT},null,null,null,null,null); returnConvertToPeople(results);}實(shí)例:建立數(shù)據(jù)庫(kù)(20)SQLiteDemo數(shù)據(jù)庫(kù)操作53實(shí)例:建立數(shù)據(jù)庫(kù)(21)SQLiteDemo的功能界面上方可以輸入數(shù)據(jù)信息通過(guò)“添加數(shù)據(jù)”按鈕將數(shù)據(jù)寫(xiě)入數(shù)據(jù)庫(kù)“全部顯示”查詢(xún)數(shù)據(jù)庫(kù)中的所有數(shù)據(jù),數(shù)據(jù)顯示在界面下方“清除顯示”清除界面下面顯示的數(shù)據(jù),不對(duì)數(shù)據(jù)庫(kù)進(jìn)行任何操作“全部刪除”刪除數(shù)據(jù)庫(kù)中的所有數(shù)據(jù)界面中間以“ID+功能”命名的按鈕根據(jù)ID刪除數(shù)據(jù)根據(jù)ID進(jìn)行數(shù)據(jù)查詢(xún)根據(jù)ID更新數(shù)據(jù)ID值就取自EditText控件54補(bǔ)充實(shí)例:出版社管理系統(tǒng)出版社作者管理系統(tǒng)AUTHOR_TABLE中定義作者的相關(guān)信息,主鍵為idBOOK_TABLE中定義了書(shū)的相關(guān)信息,主鍵為id通過(guò)author_id與AUTHOR_TABLE建立關(guān)聯(lián)兩個(gè)表結(jié)構(gòu)的定義:56實(shí)例:出版社管理系統(tǒng)(2)獲取一個(gè)可讀的SQLiteDatabase獲取一個(gè)可寫(xiě)的SQLiteDatabase57SQLiteDatabasedb=SQLOpenHelper.getReadableDatabase()SQLiteDatabasedb=SQLOpenHelper.getWriteableDatabase()實(shí)例:出版社管理系統(tǒng)(3)觸發(fā)器(Trigger)機(jī)制在試圖對(duì)指定的數(shù)據(jù)表執(zhí)行指定的修改語(yǔ)句時(shí),特定的數(shù)據(jù)操作將被自動(dòng)執(zhí)行,實(shí)現(xiàn)關(guān)聯(lián)操作58db.execSQL("CREATETRIGGERbook_deleteDELETEON"+Publisher.AUTHOR_TABLE+""+"BEGIN"+"DELETEFROM"+Publisher.BOOK_TABLE+"WHERE"+Publisher.BOOK.AUTHOR_ID+"=old._id;"+"END;");//在數(shù)據(jù)庫(kù)升級(jí)時(shí),應(yīng)該在onUpdate方法中刪除已經(jīng)創(chuàng)建的觸發(fā)器db.execSQL("DROPTRIGERIFEXISTSbook_delete");實(shí)例:出版社管理系統(tǒng)(4)索引(Index)對(duì)數(shù)據(jù)表中一列或多列的值進(jìn)行排序的一種結(jié)構(gòu)索引在不讀取整個(gè)表的情況下可以更快地查找數(shù)據(jù)通常僅僅在經(jīng)常被檢索的列上創(chuàng)建索引更新一個(gè)含有索引的表的時(shí)間要比更新沒(méi)有索引的表的時(shí)間長(zhǎng)59//建立了一個(gè)針對(duì)AUTHOR_TABLE表的NAME列的降序索引db.execSQL("CREATEINDEXauthorname_indexON"+Publisher.AUTHOR_TABLE+"("+Publisher.AUTHOR.NAME+""+DESC+");");實(shí)例:出版社管理系統(tǒng)(5)視圖(View)表示一個(gè)或多個(gè)表中的記錄可以在數(shù)據(jù)庫(kù)中生成虛擬表視圖的創(chuàng)建過(guò)程中經(jīng)常使用到連接操作通過(guò)該操作可以聯(lián)合查詢(xún)多個(gè)表60db.execSQL("CREATEVIEWIFNOTEXISTS"+Publisher.BOOK_AUTHOR_TABLE+"AS"+"SELECT"+Publisher.BOOK_TABLE+".*"+","+Publisher.AUTHOR.NAME+"FROM"+Publisher.BOOK_TABLE+"LEFTOUTERJOIN"+Publisher.AUTHOR_TABLE+"ON"+Publisher.AUTHOR_TABLE+"."+Publisher.AUTHOR._ID+"="+Publisher.BOOK_TABLE+"."+Publisher.BOOK.AUTHOR_ID);實(shí)例:出版社管理系統(tǒng)(6)視圖的建立PublisherDatabaseHelper類(lèi)的onCreate方法中建立了一個(gè)名為“book_author”的視圖為了能在應(yīng)用的其余程序中訪問(wèn)到該視圖,將視圖的名字以靜態(tài)變量的形式定義在Publisher類(lèi)中變量名是BOOK_AUTHOR_TABLE該視圖將BOOK_TABLE表的全部列和AUTHOR_TABLE表的NAME列重新組成一個(gè)新的虛擬表Select操作語(yǔ)句位于“AS”之后“Publisher.BOOK_TABLE+".*"+","+Publisher.AUTHOR.NAME”表示生成的虛擬表的列包含BOOK表中的全部列和AUTHOR表中的NAME列AUTHOR表的NAME列前面不能有表名做修飾“LEFTOUTERJOIN”表示左外連接操作,表示最終生成的虛擬表的行包括左表(BOOK_TABLE)的全部和右表(AUTHOR_TABLE)滿(mǎn)足特定條件的行“ON”后面的語(yǔ)句表示了記錄需要滿(mǎn)足的特定條件,AUTHOR_TABLE表的紀(jì)錄的“_ID”列的值必須等于BOOK_TABLE表的紀(jì)錄的“AUTHOR_ID”列的值61實(shí)例:出版社管理系統(tǒng)(7)execSQL方法insert方法62db.execSQL("INSERTINTO"+Publisher.AUTHOR_TABLE+"(author_name,address,phone)"+"VALUES("+"‵"+name+"',"+"'"+address+"',"+"'"+phone+"'"+")");ContentValuesvalues=newContentValues();values.put(Publisher.AUTHOR.NAME,name);values.put(Publisher.AUTHOR.ADDRESS,address);values.put(Publisher.AUTHOR.PHONE,phone);SQLiteDatabasedb=helper.getWritableDatabase();db.insert(Publisher.AUTHOR_TABLE,null,values);實(shí)例:出版社管理系統(tǒng)(8)SQLiteDatabase類(lèi)的execSQL方法直接操作SQL語(yǔ)句,SQLiteDatabase類(lèi)的longinsert(Stringtable,StringnullColumnHack,ContentValuesvalues)方法簡(jiǎn)化插入操作第一個(gè)參數(shù)是需要新增數(shù)據(jù)的表第二個(gè)參數(shù)表示一個(gè)列名,因?yàn)镾QLite數(shù)據(jù)庫(kù)不允許增加沒(méi)有任何內(nèi)容的記錄,所以如果插入的values值為空,則nullColumnHack表示的列的值將被賦為NULL,并將該記錄插入到數(shù)據(jù)庫(kù)中第三個(gè)參數(shù)是一個(gè)ContentValues對(duì)象,它和哈希表類(lèi)似,負(fù)責(zé)存儲(chǔ)鍵值(key/value)對(duì),將需要存儲(chǔ)的數(shù)據(jù)進(jìn)行封裝兩種插入記錄的方法沒(méi)有給出記錄的“_id”值數(shù)據(jù)表AUTHOR_TABLE含有_ID列因?yàn)镾QLite數(shù)據(jù)庫(kù)會(huì)按遞增的順序?yàn)樾略鲇涗涀詣?dòng)添加這個(gè)序號(hào)值,這個(gè)序號(hào)是記錄唯一性的標(biāo)識(shí)。SQL表達(dá)式中的表示輸入值的字符串一定要用單引號(hào)包括起來(lái),否則數(shù)據(jù)庫(kù)會(huì)出現(xiàn)故障63實(shí)例:出版社管理系統(tǒng)(9)execSQL方法delete方法(不使用通配符)delete方法(使用通配符)64db.execSQL("DELETEFROM"+Publisher.AUTHOR_TABLE+"WHERE"+AUTHOR._ID+"="+author_id);db.delete(Publisher.AUTHOR_TABLE,Publisher.AUTHOR._ID+"="+author_id,null);db.delete(Publisher.AUTHOR_TABLE,Publisher.AUTHOR._ID+"=?",newString[]{String.valueOf(author_id)});實(shí)例:出版社管理系統(tǒng)(10)execSQL方法update方法65db.execSQL("UPDATE"+Publisher.AUTHOR_TABLE+"SET"+AUTHOR.NAME+"='"+name+"'"+","+AUTHOR.ADDRESS+"='"+address+"'"+","+AUTHOR.PHONE+"='"+phone+"'"+"WHERE"+AUTHOR._ID+"="+id);ContentValuesvalues=newContentValues();values.put(Publisher.AUTHOR.NAME,name);values.put(Publisher.AUTHOR.ADDRESS,address);values.put(Publisher.AUTHOR.PHONE,phone);SQLiteDatabasedb=helper.getWritableDatabase();db.update(Publisher.AUTHOR_TABLE,values,Publisher.AUTHOR._ID+"="+id,null);實(shí)例:出版社管理系統(tǒng)(11)SQLiteDatabase提供了Cursorquery(Stringtable,String[]columns,Stringselection,String[]selectionArgs,StringgroupBy,Stringhaving,StringorderBy)方法實(shí)現(xiàn)查詢(xún)記錄table代表查詢(xún)的數(shù)據(jù)表Columns代表要查詢(xún)的列數(shù)組selection代表查詢(xún)的條件,可以使用“?”通配符selectionArgs代表selection表達(dá)式中的?groupBy代表數(shù)據(jù)分組Having代表哪些行顯示orderBy代表排序的方式66實(shí)例:出版社管理系統(tǒng)(12)Cursor類(lèi)用于對(duì)數(shù)據(jù)庫(kù)查詢(xún)的結(jié)果進(jìn)行隨機(jī)的讀寫(xiě)訪問(wèn)默認(rèn)情況下Cursor的游標(biāo)位于返回的所有數(shù)據(jù)行的前面Cursor常用方法move(intoffset)將當(dāng)前游標(biāo)移動(dòng)offset個(gè)位置moveToFirst()將游標(biāo)移動(dòng)到第一行moveToLast()將游標(biāo)移動(dòng)到最后一行isLast()判斷游標(biāo)是否在最后一行isFirst()判斷游標(biāo)是否在第一行g(shù)etPosition()獲得游標(biāo)當(dāng)前所在行的位置getCount()獲得cursor中的所有行數(shù)67實(shí)例:字典實(shí)例:字典SQLite(7)SQLite的數(shù)據(jù)類(lèi)型動(dòng)態(tài)數(shù)據(jù)類(lèi)型根據(jù)存入值自動(dòng)判斷SQLite數(shù)據(jù)類(lèi)型5種NULL空值INTEGER帶符號(hào)的整型,具體取決有存入數(shù)字的范圍大小REAL浮點(diǎn)數(shù)字,存儲(chǔ)為8-byteIEEE浮點(diǎn)數(shù)TEXT字符串文本BLOB二進(jìn)制對(duì)象70手動(dòng)建立與使用SQLite數(shù)據(jù)庫(kù)手動(dòng)創(chuàng)建SQLite數(shù)據(jù)庫(kù)Android提供了sqlite3工具使用sqlite3工具通過(guò)輸入命令(命令行方式)建立SQLite數(shù)據(jù)庫(kù)Sqlite3SQLite數(shù)據(jù)庫(kù)自帶命令行方式SQL命令執(zhí)行工具可以顯示命令執(zhí)行結(jié)果通過(guò)命令行輸入sqlite3可啟動(dòng)sqlite3工具,并得到工具的版本信息,CMD中輸入命令71手動(dòng)建立與使用SQLite數(shù)據(jù)庫(kù)(2)啟動(dòng)sqlite3工具后命令行界面進(jìn)入與SQLite數(shù)據(jù)庫(kù)的交互模式可以輸入命令建立、刪除或修改數(shù)據(jù)庫(kù)的內(nèi)容退出sqlite3工具使用.exit命令應(yīng)用程序的數(shù)據(jù)庫(kù)保存位置在應(yīng)用程序的/data/data/<packagename>/databases目錄下使用手工方式建立數(shù)據(jù)庫(kù),必須手工建立數(shù)據(jù)庫(kù)目錄目前版本無(wú)須修改數(shù)據(jù)庫(kù)目錄的權(quán)限72手動(dòng)建立與使用SQLite數(shù)據(jù)庫(kù)(3)打開(kāi)時(shí)創(chuàng)建使用sqlite3工具后加文件名的方式打開(kāi)數(shù)據(jù)庫(kù)文件如果指定文件不存在,sqlite3工具自動(dòng)創(chuàng)建新文件創(chuàng)建名為people的數(shù)據(jù)庫(kù)在文件系統(tǒng)中將產(chǎn)生一個(gè)名為people.db的數(shù)據(jù)庫(kù)文件73#sqlite3people.dbSQLiteversionEnter“.help”forinstructionssqlite>手動(dòng)建立與使用SQLite數(shù)據(jù)庫(kù)(4)表的創(chuàng)建在新創(chuàng)建的數(shù)據(jù)庫(kù)中創(chuàng)建名為表peopleinfo使用createtable命令關(guān)系模式為peopleinfo(_id,name,age,height)表包含四個(gè)屬性_id是整型的主鍵name表示姓名,字符型,notnull表示屬性不能為空age表示年齡,整數(shù)型height表示身高,浮點(diǎn)型74sqlite>createtablepeopleinfo...>(_idintegerprimarykeyautoincrement,...>nametextnotnull,...>ageinteger,...>heightfloat);sqlite>手動(dòng)建立與使用SQLite數(shù)據(jù)庫(kù)(5)確認(rèn)數(shù)據(jù)表是否創(chuàng)建成功使用.tables命令,顯示當(dāng)前數(shù)據(jù)庫(kù)中的所有表當(dāng)前數(shù)據(jù)庫(kù)僅有一個(gè)名為peopleinfo的表或者使用.
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 物流配送司機(jī)薪酬方案
- 光學(xué)儀器工廠租賃合同樣本
- 電力公司用戶(hù)數(shù)據(jù)保密制度
- 城市綠化養(yǎng)護(hù)招投標(biāo)合同審查
- 水利教師聘用合同模板
- 環(huán)保工程庫(kù)房施工合同
- 油氣管道施工員勞動(dòng)合同樣本
- 購(gòu)物中心設(shè)施安裝物業(yè)合同
- 醫(yī)療衛(wèi)生評(píng)審員管理辦法
- 2025版教育機(jī)構(gòu)安全責(zé)任保險(xiǎn)合同2篇
- 2024屆甘肅省平?jīng)鍪徐o寧縣英語(yǔ)九年級(jí)第一學(xué)期期末教學(xué)質(zhì)量檢測(cè)模擬試題含解析
- 滄源永弄華能100MW茶光互補(bǔ)光伏發(fā)電項(xiàng)目環(huán)評(píng)報(bào)告
- 倉(cāng)儲(chǔ)業(yè)行業(yè)SWOT分析
- 輔導(dǎo)員工作匯報(bào)課件
- 公司金融學(xué)張德昌課后參考答案
- 商務(wù)英語(yǔ)口語(yǔ)與實(shí)訓(xùn)學(xué)習(xí)通課后章節(jié)答案期末考試題庫(kù)2023年
- DB3302-T 1015-2022 城市道路清掃保潔作業(yè)規(guī)范
- 手術(shù)室提高患者術(shù)中保溫措施的執(zhí)行率PDCA課件
- 報(bào)刊雜志發(fā)放登記表
- 大學(xué)物理(下)(太原理工大學(xué))知到章節(jié)答案智慧樹(shù)2023年
- 布袋除塵器項(xiàng)目可行性分析報(bào)告
評(píng)論
0/150
提交評(píng)論