《Android實(shí)戰(zhàn)基礎(chǔ)教程》課件第四章_第1頁
《Android實(shí)戰(zhàn)基礎(chǔ)教程》課件第四章_第2頁
《Android實(shí)戰(zhàn)基礎(chǔ)教程》課件第四章_第3頁
《Android實(shí)戰(zhàn)基礎(chǔ)教程》課件第四章_第4頁
《Android實(shí)戰(zhàn)基礎(chǔ)教程》課件第四章_第5頁
已閱讀5頁,還剩56頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

目錄4.1SQLiteDatabase簡介4.2SQLiteOpenHelper簡介4.3SQLite數(shù)據(jù)庫的應(yīng)用

四、SQLite數(shù)據(jù)庫四、SQLite數(shù)據(jù)庫

Android可以使用SQLiteDatabase來代表一個(gè)數(shù)據(jù)庫??梢酝ㄟ^SQLiteDatabase來創(chuàng)建、刪除、執(zhí)行SQL命令,并執(zhí)行其他常見的數(shù)據(jù)庫管理任務(wù)。SQLiteDatabase提供了openOrCreateDatabase等靜態(tài)方法來打開或者創(chuàng)建數(shù)據(jù)庫。它會(huì)自動(dòng)檢測相應(yīng)的數(shù)據(jù)庫是否存在,如果不存在,則自動(dòng)創(chuàng)建相應(yīng)的數(shù)據(jù)庫。4.1SQLiteDatabase簡介四、SQLite數(shù)據(jù)庫

一些SQLiteDatabase常用操作的方法:publiclonginsert(Stringtable,StringnullColumnHack,ContentValuesvalues):將行插入到數(shù)據(jù)庫的簡便方法。publicintupdate(Stringtable,ContentValuesvalues,StringwhereClause,String[]whereArgs):數(shù)據(jù)庫中的行更新的簡便方法。publicintdelete(Stringtable,StringwhereClause,String[]whereArgs):數(shù)據(jù)庫中刪除行的簡便方法。四、SQLite數(shù)據(jù)庫Cursor(光標(biāo))對象的一些常見方法:booleanmove(intoffset):從當(dāng)前位置移動(dòng)光標(biāo),向前或向后移動(dòng)。正數(shù)向前移,負(fù)數(shù)向后移。成功返回true,失敗返回false。booleanmoveToLast():將光標(biāo)移動(dòng)到最后一行。成功返回true,失敗返回false。booleanmoveToNext():將光標(biāo)移動(dòng)到下一行。成功返回true,失敗返回false。booleanmoveToPosition(intposition):將光標(biāo)移動(dòng)到指定的位置。成功返回true,失敗返回false。

四、SQLite數(shù)據(jù)庫

SQLiteOpenHelper是一個(gè)輔助類,可用來創(chuàng)建和管理數(shù)據(jù)庫。通過創(chuàng)建一個(gè)子類,實(shí)現(xiàn)onCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase,int,int)方法。這個(gè)子類負(fù)責(zé)打開數(shù)據(jù)庫(如果數(shù)據(jù)庫存在)、創(chuàng)建數(shù)據(jù)庫(如果數(shù)據(jù)庫不存在)、更新數(shù)據(jù)庫等。SQLiteOpenHelper同時(shí)也有助于ContentProvider第一次打開和升級數(shù)據(jù)庫。4.2SQLiteOpenHelper簡介四、SQLite數(shù)據(jù)庫

一些SQLiteOpenHelper常用操作的方法:publicSQLiteDatabasegetReadableDatabase():以讀的方式打開數(shù)據(jù)庫。publicSQLiteDatabasegetWritableDatabase():以寫的方式打開數(shù)據(jù)庫。publicabstractvoidonCreate(SQLiteDatabasedb):當(dāng)數(shù)據(jù)庫為第一次創(chuàng)建時(shí)調(diào)用。這是創(chuàng)建表和表的初始化的地方。publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion):當(dāng)數(shù)據(jù)庫需要更新時(shí)調(diào)用。數(shù)據(jù)庫的增刪改等操作需要使用該方法,此方法需要在事務(wù)中執(zhí)行。如果出現(xiàn)異常,所有的更改將自動(dòng)回滾。四、SQLite數(shù)據(jù)庫

SQLiteOpenHelper是一個(gè)輔助類,可用來創(chuàng)建和管理數(shù)據(jù)庫。通過創(chuàng)建一個(gè)子類,實(shí)現(xiàn)onCreate(SQLiteDatabase),onUpgrade(SQLiteDatabase,int,int)方法。這個(gè)子類負(fù)責(zé)打開數(shù)據(jù)庫(如果數(shù)據(jù)庫存在)、創(chuàng)建數(shù)據(jù)庫(如果數(shù)據(jù)庫不存在)、更新數(shù)據(jù)庫等。SQLiteOpenHelper同時(shí)也有助于ContentProvider第一次打開和升級數(shù)據(jù)庫。4.3SQLite數(shù)據(jù)庫的應(yīng)用四、SQLite數(shù)據(jù)庫back

案例1使用SQLiteOpenHelper來完成一個(gè)簡單的注冊功能。

效果如圖4.1所示。圖4.1四、SQLite數(shù)據(jù)庫該案例的布局文件有以下幾種:(1)?activity_main.xml文件:<LinearLayoutxmlns:android="http:///apk/res/android"xmlns:tools="/tools"android:layout_width="match_parent"android:layout_height="match_parent"android:paddingBottom="@dimen/activity_vertical_margin"android:paddingLeft="@dimen/activity_horizontal_margin"android:paddingRight="@dimen/activity_horizontal_margin"android:paddingTop="@dimen/activity_vertical_margin"android:orientation="vertical">

四、SQLite數(shù)據(jù)庫<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="用戶名:"/><EditText android:id="@+id/nameTxt" android:layout_width="match_parent" android:layout_height="wrap_content" />四、SQLite數(shù)據(jù)庫<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="密碼:"/><EditText android:id="@+id/pwdTxt" android:password="true" android:layout_width="match_parent" android:layout_height="wrap_content" />四、SQLite數(shù)據(jù)庫<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="年齡:"/><EditText android:id="@+id/ageTxt" android:layout_width="match_parent" android:layout_height="wrap_content" />

四、SQLite數(shù)據(jù)庫<Button android:id="@+id/btn1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="clickBtn" android:text="注冊"/><Button android:id="@+id/btn2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="創(chuàng)建數(shù)據(jù)庫"/></LinearLayout>四、SQLite數(shù)據(jù)庫(2)?MyDatabaseHelper.java文件:publicclassMyDatabaseHelperextendsSQLiteOpenHelper //創(chuàng)建表的SQL語句 finalStringCREATE_TABLE_SQL="createtableuserinfo(_idintegerprimarykeyautoincrement,name,pwd,age)";publicMyDatabaseHelper(Contextcontext,Stringname,CursorFactoryfactory,intversion){ super(context,name,factory,version); //TODOAuto-generatedconstructorstub}四、SQLite數(shù)據(jù)庫 @Override publicvoidonCreate(SQLiteDatabasedb){ //第一次使用數(shù)據(jù)庫時(shí)自動(dòng)創(chuàng)建表 db.execSQL(CREATE_TABLE_SQL); } @Override publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){ //TODOAuto-generatedmethodstub }}//End四、SQLite數(shù)據(jù)庫(3)?MainActivity.java文件:publicclassMainActivityextendsActivity{

//定義組件

EditTextnameTxt=null;

EditTextageTxt=null;

EditTextpwdTxt=null;

MyDatabaseHelperdb;

四、SQLite數(shù)據(jù)庫@OverrideprotectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//db=SQLiteDatabase.openOrCreateDatabase(this.getFilesDir().toString()+"/user.db",null);

db=newMyDatabaseHelper(this,"user.db3",null,1);

//初始化組件

initComponents();}//onCreate

四、SQLite數(shù)據(jù)庫 /*

*初始化組件

*/

publicvoidinitComponents()

{

nameTxt=(EditText)findViewById(R.Txt);

pwdTxt=(EditText)findViewById(R.id.pwdTxt);

ageTxt=(EditText)findViewById(R.id.ageTxt);

}//initComponents四、SQLite數(shù)據(jù)庫 /*

*按鈕的點(diǎn)擊事件

*/

publicvoidclickBtn(Viewview){

intid=view.getId();

if(id==R.id.btn1)

{

Stringname=nameTxt.getText().toString();

Stringpwd=pwdTxt.getText().toString();

Stringage=ageTxt.getText().toString();

//保存數(shù)據(jù)

saveInfo(db.getReadableDatabase(),name,pwd,age);}

}//clickBtn四、SQLite數(shù)據(jù)庫publicvoidsaveInfo(SQLiteDatabasedb,Stringname,Stringpwd,Stringage){

//創(chuàng)建SQL語句

Stringinsert="insertintouserinfovalues(null,?,?,?)";

//執(zhí)行SQL語句,其中insertSQL語句中的三個(gè)?問號可由第二個(gè)參數(shù)的object數(shù)組填充代替

db.execSQL(insert,newString[]{name,pwd,age});

Log.i("test","插入數(shù)據(jù)");

//關(guān)閉連接

db.close();}//saveInfo}//End四、SQLite數(shù)據(jù)庫

案例2簡單的圖書信息管理系統(tǒng)。

界面效果如圖4.4:圖4.4四、SQLite數(shù)據(jù)庫(1)?activity_book_list.xml:<RelativeLayoutxmlns:android="/apk/res/android" xmlns:tools="/tools" android:layout_width="match_parent"

android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin"

android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin">四、SQLite數(shù)據(jù)庫<ListView android:id="@+id/listview1“ android:layout_width="match_parent" android:layout_height="wrap_content" /></RelativeLayout>(2)?activity_main.xml:<LinearLayoutxmlns:android="/apk/res/android"

xmlns:tools="/tools"

android:layout_width="match_parent" android:layout_height="match_parent"四、SQLite數(shù)據(jù)庫

android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" android:orientation="vertical" >

<LinearLayout

android:orientation="horizontal"

android:layout_width="match_parent"

android:layout_height="wrap_content"

>四、SQLite數(shù)據(jù)庫<TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="圖書編號"/><EditText

android:id="@+id/bookidTxt"

android:layout_width="match_parent" android:layout_height="wrap_content"

/></LinearLayout>四、SQLite數(shù)據(jù)庫<LinearLayout

android:orientation="horizontal"

android:layout_width="match_parent"

android:layout_height="wrap_content"><TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="圖書名稱"/><EditText

android:id="@+id/nameTxt"

android:layout_width="match_parent" android:layout_height="wrap_content"/></LinearLayout>四、SQLite數(shù)據(jù)庫<LinearLayout

android:orientation="horizontal"

android:layout_width="match_parent"

android:layout_height="wrap_content"><TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="圖書作者"/><EditText

android:id="@+id/authorTxt"

android:layout_width="match_parent" android:layout_height="wrap_content"/></LinearLayout>四、SQLite數(shù)據(jù)庫<LinearLayout

android:orientation="horizontal"

android:layout_width="match_parent"

android:layout_height="wrap_content"><TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="圖書價(jià)格"/><EditText

android:id="@+id/priceTxt"

android:layout_width="match_parent" android:layout_height="wrap_content"/></LinearLayout>四、SQLite數(shù)據(jù)庫<Button

android:id="@+id/Btn_insert"

android:layout_width="match_parent" android:layout_height="wrap_content"

android:onClick="clickBtn"

android:text="添加圖書"/>

<Button

android:id="@+id/Btn_delete"

android:layout_width="match_parent" android:layout_height="wrap_content"

android:onClick="clickBtn"

android:text="根據(jù)圖書編號刪除圖書"/>四、SQLite數(shù)據(jù)庫<Button

android:id="@+id/Btn_update"

android:layout_width="match_parent" android:layout_height="wrap_content"

android:onClick="clickBtn"

android:text="根據(jù)圖書編號修改圖書"/><Button

android:id="@+id/Btn_find"

android:layout_width="match_parent" android:layout_height="wrap_content"

android:onClick="clickBtn"

android:text="根據(jù)圖書編號查看圖書"

/>四、SQLite數(shù)據(jù)庫<Button

android:id="@+id/Btn_showlist"

android:layout_width="match_parent" android:layout_height="wrap_content"

android:onClick="clickBtn"

android:text="查看圖書列表"

/></LinearLayout>四、SQLite數(shù)據(jù)庫(3)?Book.java:publicclassBookimplementsParcelable{

publicint_id;

publicStringname;

publicStringauthor;

publicfloatprice;

//Constructor

publicBook(Parcelsource){

//反序列化(反序列化的順序要和序列化的順序一致)

_id=source.readInt();

name=source.readString();

author=source.readString();

price=source.readFloat();}//Constructor四、SQLite數(shù)據(jù)庫publicBook(){}

@Override

publicintdescribeContents(){

return();

}

@Override

publicvoidwriteToParcel(Parceldest,intflags){

//可以對Book對象的屬性一個(gè)一個(gè)的序列化

dest.writeInt(_id);

dest.writeString(name);

dest.writeString(author);

dest.writeFloat(price);

}

四、SQLite數(shù)據(jù)庫//收到數(shù)據(jù)之后可以使用Creator把數(shù)據(jù)反序列化成BookpublicstaticfinalParcelable.CreatorCREATOR=newCreator<Book>(){

@Override

publicBookcreateFromParcel(Parcelsource){

//TODOAuto-generatedmethodstub

returnnewBook(source);

}

@Override

publicBook[]newArray(intsize){

returnnewBook[size];

} };四、SQLite數(shù)據(jù)庫 @Override

publicStringtoString(){

return"【編號="+_id+",書名="+name+",作者="+author +",價(jià)格="+price+"】";

}

}//End四、SQLite數(shù)據(jù)庫(4)?MyDatabaseHelper.java:publicclassMyDatabaseHelperextendsSQLiteOpenHelper{

//創(chuàng)建表的SQL語句

publicfinalStringSQL_CREATE_TABLE="createtable"+BookDao.TABLE_BOOK+"("+BookDao.COL_BOOK_ID+"integerprimarykeyautoincrement," +BookDao.COL_NAME+","+BookDao.COL_AUTHOR ","+BookDao.COL_PRICE+")";

//刪除表SQL語句

publicfinalStringSQL_DROP_TABLE="droptable"+BookDao.TABLE_BOOK;

publicMyDatabaseHelper(Contextcontext,Stringname,

CursorFactoryfactory,intversion){

super(context,name,factory,version);

//TODOAuto-generatedconstructorstub

}//Constructor四、SQLite數(shù)據(jù)庫/**此方法是在應(yīng)用程序第一次運(yùn)行時(shí)自動(dòng)調(diào)用,所以我們可以在這個(gè)方法中創(chuàng)建數(shù)據(jù)庫的表*如果以后再允許程序,此方法將不再執(zhí)行,所以可以保證數(shù)據(jù)庫只創(chuàng)建一次*/

@Override

publicvoidonCreate(SQLiteDatabasedb)

{

//創(chuàng)建表

db.execSQL(SQL_CREATE_TABLE);

}//onCreate四、SQLite數(shù)據(jù)庫/**發(fā)現(xiàn)當(dāng)前執(zhí)行的程序和原有程序版本不一致時(shí),自動(dòng)調(diào)用

*所以在此方法中我們可以將老數(shù)據(jù)更新為新數(shù)據(jù)

*/

@Override

publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion)

{

//刪除原來的表

db.execSQL(SQL_DROP_TABLE);

onCreate(db);

}//onUpgrade}//End四、SQLite數(shù)據(jù)庫(5)?BookDao.java:publicclassBookDao{

//數(shù)據(jù)庫名

publicstaticfinalStringDB_NAME="book.db";

//保存圖書信息的表名

publicstaticfinalStringTABLE_BOOK="bookinfo";

//id的列名

publicstaticfinalString COL_BOOK_ID="_id";

//圖書名稱的列名

publicstaticfinalStringCOL_NAME="name";

//圖書作者的列名

publicstaticfinalStringCOL_AUTHOR="author";

//圖書價(jià)格的列名

publicstaticfinalStringCOL_PRICE="price";

MyDatabaseHelperdbHelper=null;四、SQLite數(shù)據(jù)庫//ConstructorpublicBookDao(Contextcontext){

//創(chuàng)建數(shù)據(jù)庫

dbHelper=newMyDatabaseHelper(context,DB_NAME,null,1);}//Constructor四、SQLite數(shù)據(jù)庫/**關(guān)閉數(shù)據(jù)庫*/publicvoidcloseDB(){

if(dbHelper!=null)

{

dbHelper.close();

dbHelper=null;

}}//closeDB四、SQLite數(shù)據(jù)庫publicvoidinsertBook(Stringname,Stringauthor,floatprice){

//獲得SQLiteDatabase對象

SQLiteDatabasedb=dbHelper.getWritableDatabase();

ContentValuesvalues=newContentValues();

//編輯數(shù)據(jù)

values.put(COL_NAME,name);

values.put(COL_AUTHOR,author);

values.put(COL_PRICE,price);

//插入數(shù)據(jù)

db.insert(TABLE_BOOK,COL_AUTHOR,values);}//insertBook四、SQLite數(shù)據(jù)庫publicBookfindBookById(intid){

Bookbook=newBook();

SQLiteDatabasedb=dbHelper.getWritableDatabase();

Cursorc=db.query(TABLE_BOOK,null,COL_BOOK_ID+"="+id,null,null,null,null);

if(c.moveToNext()){

book._id=c.getInt(c.getColumnIndex(COL_BOOK_ID));

=c.getString(c.getColumnIndex(COL_NAME));

book.author=c.getString(c.getColumnIndex(COL_AUTHOR));

book.price=c.getFloat(c.getColumnIndex(COL_PRICE));

}

returnbook;}//findBookById四、SQLite數(shù)據(jù)庫publicvoidupdateBook(int_id,Stringname,Stringauthor,floatprice){

//獲得SQLiteDatabase對象

SQLiteDatabasedb=dbHelper.getWritableDatabase();

ContentValuesvalues=newContentValues();

//編輯數(shù)據(jù)

values.put(COL_NAME,name);

values.put(COL_AUTHOR,author);

values.put(COL_PRICE,price);

//插入數(shù)據(jù)

Stringwhere=COL_BOOK_ID+"=?";

String[]whereValue={Integer.toString(_id)};

db.update(TABLE_BOOK,values,where,whereValue);}//updateBook四、SQLite數(shù)據(jù)庫/**根據(jù)圖書編號刪除圖書信息*/publicvoiddeleteBookById(intbookid){

SQLiteDatabasedb=dbHelper.getWritableDatabase();

db.delete(TABLE_BOOK,COL_BOOK_ID+"="+bookid,null);}//deleteBookById四、SQLite數(shù)據(jù)庫publicList<Book>getBookList(){

List<Book>bookList=newArrayList<Book>();

SQLiteDatabasedb=dbHelper.getWritableDatabase();

Cursorc=db.query(TABLE_BOOK,null,null,null,null,null,null);

while(c.moveToNext()){

Bookbook=newBook();

book._id=c.getInt(c.getColumnIndex(COL_BOOK_ID));

=c.getString(c.getColumnIndex(COL_NAME));

book.author=c.getString(c.getColumnIndex(COL_AUTHOR));

book.price=c.getFloat(c.getColumnIndex(COL_PRICE));

bookList.add(book);

}

returnbookList;

}//getBookList}//End四、SQLite數(shù)據(jù)庫(6)?BookListActivity.java:publicclassBookListActivityextendsActivity{

@Override

protectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_book_list);

//獲得MainActivity傳遞過來的數(shù)據(jù)

Intentintent=this.getIntent();

ArrayList<Book>bookList=intent.getParcelableArrayListExtra("book");

//將bookList轉(zhuǎn)化為List類型

List<String>strList=newArrayList<String>();四、SQLite數(shù)據(jù)庫 for(Bookb:bookList) {

strList.add(b.toString());

Log.i("test","添加一個(gè)成功");

} //填充列表 ListViewlistview=(ListView)findViewById(R.id.listview1); ArrayAdapter<String>adapter=newArrayAdapter<String>(this,android.R.layout.simple_list_item_1,strList); listview.setAdapter(adapter); }//onCreate

}//End四、SQLite數(shù)據(jù)庫(7)?MainActivity.java:publicclassMainActivityextendsActivity{

//定義一些組件

publicEditTextbookidTxt=null;

publicEditTextnameTxt=null;

publicEditTextauthorTxt=null;

publicEditTextpriceTxt=null;

//定義一個(gè)操作數(shù)據(jù)庫的類

BookDaodb=null;四、SQLite數(shù)據(jù)庫@OverrideprotectedvoidonCreate(BundlesavedInstanceState){

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

//初始化控件

initConponents();

//創(chuàng)建db

db=newBookDao(this);}//onCreate四、SQLite數(shù)據(jù)庫@OverrideprotectedvoidonPause(){

if(db!=null)//判斷db是否為空,不為空則關(guān)閉數(shù)據(jù)庫

{

db.closeDB();

}

super.onPause();}//onPause四、SQLite數(shù)據(jù)庫/**初始化組件*/publicvoidinitConponents(){

bookidTxt=(EditText)findViewById(R.id.bookidTxt);

nameTxt=(EditText)findViewById(R.Txt);

authorTxt=(EditText)findViewById(R.id.authorTxt);

priceTxt=(EditText)findViewById(R.id.priceTxt);}//initConponents四、SQLite數(shù)據(jù)庫publicvoidclickBtn(Viewview){

intid=view.getId();

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(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ǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論