版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、Android中SQLite應(yīng)用詳解 分類: ANDROID 2011-08-26 18:36 25212人閱讀 評論(35) 收藏 舉報sqliteandroidstring數(shù)據(jù)庫listviewdatabase上次我向大家介紹了SQLite的基本信息和使用過程,相信朋友們對SQLite已經(jīng)有所了解了,那今天呢,我就和大家分享一下在Android中如何使用SQLite。現(xiàn)在的主流移動設(shè)備像Android、iPhone等都使用SQLite作為復(fù)雜數(shù)據(jù)的存儲引擎,在我們?yōu)橐苿釉O(shè)備開發(fā)應(yīng)用程序時,也許就要使用到SQLite來存儲我們大量的數(shù)據(jù),所以我們就需要掌握移動設(shè)備上的SQLite開發(fā)技巧。對
2、于Android平臺來說,系統(tǒng)內(nèi)置了豐富的API來供開發(fā)人員操作SQLite,我們可以輕松的完成對數(shù)據(jù)的存取。下面就向大家介紹一下SQLite常用的操作方法,為了方便,我將代碼寫在了Activity的onCreate中:java view plaincopyprint?1. Override 2. protected void onCreate(Bundle savedInstanceState) 3. super.onCreate(savedInstanceState); 4.5. /打開或創(chuàng)建test.db數(shù)據(jù)庫 6. SQLiteDatabase db = openOrCreateDat
3、abase("test.db", Context.MODE_PRIVATE, null); 7. db.execSQL("DROP TABLE IF EXISTS person"); 8. /創(chuàng)建person表 9. db.execSQL("CREATE TABLE person (_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age SMALLINT)"); 10. Person person = new Person(); 11. = "
4、john" 12. person.age = 30; 13. /插入數(shù)據(jù) 14. db.execSQL("INSERT INTO person VALUES (NULL, ?, ?)", new O, person.age); 15.16. = "david" 17. person.age = 33; 18. /ContentValues以鍵值對的形式存放數(shù)據(jù) 19. ContentValues cv = new ContentValues(); 20. cv.put("name
5、", ); 21. cv.put("age", person.age); 22. /插入ContentValues中的數(shù)據(jù) 23. db.insert("person", null, cv); 24.25. cv = new ContentValues(); 26. cv.put("age", 35); 27. /更新數(shù)據(jù) 28. db.update("person", cv, "name = ?", new String"john"); 29
6、.30. Cursor c = db.rawQuery("SELECT * FROM person WHERE age >= ?", new String"33"); 31. while (c.moveToNext() 32. int _id = c.getInt(c.getColumnIndex("_id"); 33. String name = c.getString(c.getColumnIndex("name"); 34. int age = c.getInt(c.getColumnIndex(&qu
7、ot;age"); 35. Log.i("db", "_id=>" + _id + ", name=>" + name + ", age=>" + age); 36. 37. c.close(); 38.39. /刪除數(shù)據(jù) 40. db.delete("person", "age < ?", new String"35"); 41.42. /關(guān)閉當(dāng)前數(shù)據(jù)庫 43. db.close(); 44.45. /刪除test.db
8、數(shù)據(jù)庫 46. / deleteDatabase("test.db"); 47. Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState);/打開或創(chuàng)建test.db數(shù)據(jù)庫SQLiteDatabase db = openOrCreateDatabase("test.db", Context.MODE_PRIVATE, null);db.execSQL("DROP TABLE IF EXISTS person"
9、;);/創(chuàng)建person表db.execSQL("CREATE TABLE person (_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age SMALLINT)");Person person = new Person(); = "john"person.age = 30;/插入數(shù)據(jù)db.execSQL("INSERT INTO person VALUES (NULL, ?, ?)", new O, person.ag
10、e); = "david"person.age = 33;/ContentValues以鍵值對的形式存放數(shù)據(jù)ContentValues cv = new ContentValues();cv.put("name", );cv.put("age", person.age);/插入ContentValues中的數(shù)據(jù)db.insert("person", null, cv);cv = new ContentValues();cv.put("age", 35)
11、;/更新數(shù)據(jù)db.update("person", cv, "name = ?", new String"john");Cursor c = db.rawQuery("SELECT * FROM person WHERE age >= ?", new String"33");while (c.moveToNext() int _id = c.getInt(c.getColumnIndex("_id");String name = c.getString(c.getCol
12、umnIndex("name");int age = c.getInt(c.getColumnIndex("age");Log.i("db", "_id=>" + _id + ", name=>" + name + ", age=>" + age);c.close();/刪除數(shù)據(jù)db.delete("person", "age < ?", new String"35");/關(guān)閉當(dāng)前數(shù)據(jù)庫db.
13、close();/刪除test.db數(shù)據(jù)庫/deleteDatabase("test.db");在執(zhí)行完上面的代碼后,系統(tǒng)就會在/data/data/PACKAGE_NAME/databases目錄下生成一個“test.db”的數(shù)據(jù)庫文件,如圖: 上面的代碼中基本上囊括了大部分的數(shù)據(jù)庫操作;對于添加、更新和刪除來說,我們都可以使用java view plaincopyprint?1. db.executeSQL(String sql); 2. db.executeSQL(String sql, Object bindArgs);/sql語句中使用占位符,然后第二個參數(shù)是實際
14、的參數(shù)集 db.executeSQL(String sql);db.executeSQL(String sql, Object bindArgs);/sql語句中使用占位符,然后第二個參數(shù)是實際的參數(shù)集除了統(tǒng)一的形式之外,他們還有各自的操作方法: java view plaincopyprint?1. db.insert(String table, String nullColumnHack, ContentValues values); 2. db.update(String table, Contentvalues values, String whereClause, String wh
15、ereArgs); 3. db.delete(String table, String whereClause, String whereArgs); db.insert(String table, String nullColumnHack, ContentValues values);db.update(String table, Contentvalues values, String whereClause, String whereArgs);db.delete(String table, String whereClause, String whereArgs);以上三個方法的第一
16、個參數(shù)都是表示要操作的表名;insert中的第二個參數(shù)表示如果插入的數(shù)據(jù)每一列都為空的話,需要指定此行中某一列的名稱,系統(tǒng)將此列設(shè)置為NULL,不至于出現(xiàn)錯誤;insert中的第三個參數(shù)是ContentValues類型的變量,是鍵值對組成的Map,key代表列名,value代表該列要插入的值;update的第二個參數(shù)也很類似,只不過它是更新該字段key為最新的value值,第三個參數(shù)whereClause表示W(wǎng)HERE表達(dá)式,比如“age > ? and age < ?”等,最后的whereArgs參數(shù)是占位符的實際參數(shù)值;delete方法的參數(shù)也是一樣。 下面來說說查詢操作。查詢
17、操作相對于上面的幾種操作要復(fù)雜些,因為我們經(jīng)常要面對著各種各樣的查詢條件,所以系統(tǒng)也考慮到這種復(fù)雜性,為我們提供了較為豐富的查詢形式:java view plaincopyprint?1. db.rawQuery(String sql, String selectionArgs); 2. db.query(String table, String columns, String selection, String selectionArgs, String groupBy, String having, String orderBy); 3. db.query(String table, St
18、ring columns, String selection, String selectionArgs, String groupBy, String having, String orderBy, String limit); 4. db.query(String distinct, String table, String columns, String selection, String selectionArgs, String groupBy, String having, String orderBy, String limit); db.rawQuery(String sql,
19、 String selectionArgs);db.query(String table, String columns, String selection, String selectionArgs, String groupBy, String having, String orderBy);db.query(String table, String columns, String selection, String selectionArgs, String groupBy, String having, String orderBy, String limit);db.query(St
20、ring distinct, String table, String columns, String selection, String selectionArgs, String groupBy, String having, String orderBy, String limit);上面幾種都是常用的查詢方法,第一種最為簡單,將所有的SQL語句都組織到一個字符串中,使用占位符代替實際參數(shù),selectionArgs就是占位符實際參數(shù)集;下面的幾種參數(shù)都很類似,columns表示要查詢的列所有名稱集,selection表示W(wǎng)HERE之后的條件語句,可以使用占位符,groupBy指定分組的
21、列名,having指定分組條件,配合groupBy使用,orderBy指定排序的列名,limit指定分頁參數(shù),distinct可以指定“true”或“false”表示要不要過濾重復(fù)值。需要注意的是,selection、groupBy、having、orderBy、limit這幾個參數(shù)中不包括“WHERE”、“GROUP BY”、“HAVING”、“ORDER BY”、“LIMIT”等SQL關(guān)鍵字。最后,他們同時返回一個Cursor對象,代表數(shù)據(jù)集的游標(biāo),有點類似于JavaSE中的ResultSet。 下面是Cursor對象的常用方法:java view plaincopyprint?1. c.
22、move(int offset); /以當(dāng)前位置為參考,移動到指定行 2. c.moveToFirst(); /移動到第一行 3. c.moveToLast(); /移動到最后一行 4. c.moveToPosition(int position); /移動到指定行 5. c.moveToPrevious(); /移動到前一行 6. c.moveToNext(); /移動到下一行 7. c.isFirst(); /是否指向第一條 8. c.isLast(); /是否指向最后一條 9. c.isBeforeFirst(); /是否指向第一條之前 10. c.isAfterLast(); /是否指
23、向最后一條之后 11. c.isNull(int columnIndex); /指定列是否為空(列基數(shù)為0) 12. c.isClosed(); /游標(biāo)是否已關(guān)閉 13. c.getCount(); /總數(shù)據(jù)項數(shù) 14. c.getPosition(); /返回當(dāng)前游標(biāo)所指向的行數(shù) 15. c.getColumnIndex(String columnName);/返回某列名對應(yīng)的列索引值 16. c.getString(int columnIndex); /返回當(dāng)前行指定列的值 c.move(int offset);/以當(dāng)前位置為參考,移動到指定行c.moveToFirst();/移動到第一行
24、c.moveToLast();/移動到最后一行c.moveToPosition(int position);/移動到指定行c.moveToPrevious();/移動到前一行c.moveToNext();/移動到下一行c.isFirst();/是否指向第一條c.isLast();/是否指向最后一條c.isBeforeFirst();/是否指向第一條之前c.isAfterLast();/是否指向最后一條之后c.isNull(int columnIndex);/指定列是否為空(列基數(shù)為0)c.isClosed();/游標(biāo)是否已關(guān)閉c.getCount();/總數(shù)據(jù)項數(shù)c.getPosition()
25、;/返回當(dāng)前游標(biāo)所指向的行數(shù)c.getColumnIndex(String columnName);/返回某列名對應(yīng)的列索引值c.getString(int columnIndex);/返回當(dāng)前行指定列的值在上面的代碼示例中,已經(jīng)用到了這幾個常用方法中的一些,關(guān)于更多的信息,大家可以參考官方文檔中的說明。最后當(dāng)我們完成了對數(shù)據(jù)庫的操作后,記得調(diào)用SQLiteDatabase的close()方法釋放數(shù)據(jù)庫連接,否則容易出現(xiàn)SQLiteException。上面就是SQLite的基本應(yīng)用,但在實際開發(fā)中,為了能夠更好的管理和維護(hù)數(shù)據(jù)庫,我們會封裝一個繼承自SQLiteOpenHelper類的數(shù)據(jù)庫操
26、作類,然后以這個類為基礎(chǔ),再封裝我們的業(yè)務(wù)邏輯方法。下面,我們就以一個實例來講解具體的用法,我們新建一個名為db的項目,結(jié)構(gòu)如下:其中DBHelper繼承了SQLiteOpenHelper,作為維護(hù)和管理數(shù)據(jù)庫的基類,DBManager是建立在DBHelper之上,封裝了常用的業(yè)務(wù)方法,Person是我們的person表對應(yīng)的JavaBean,MainActivity就是我們顯示的界面。下面我們先來看一下DBHelper:java view plaincopyprint?1. package com.scott.db; 2.3. import android.content.Context;
27、4. import android.database.sqlite.SQLiteDatabase; 5. import android.database.sqlite.SQLiteOpenHelper; 6.7. public class DBHelper extends SQLiteOpenHelper 8.9. private static final String DATABASE_NAME = "test.db" 10. private static final int DATABASE_VERSION = 1; 11.12. public DBHelper(Con
28、text context) 13. /CursorFactory設(shè)置為null,使用默認(rèn)值 14. super(context, DATABASE_NAME, null, DATABASE_VERSION); 15. 16.17. /數(shù)據(jù)庫第一次被創(chuàng)建時onCreate會被調(diào)用 18. Override 19. public void onCreate(SQLiteDatabase db) 20. db.execSQL("CREATE TABLE IF NOT EXISTS person" + 21. "(_id INTEGER PRIMARY KEY AUTOI
29、NCREMENT, name VARCHAR, age INTEGER, info TEXT)"); 22. 23.24. /如果DATABASE_VERSION值被改為2,系統(tǒng)發(fā)現(xiàn)現(xiàn)有數(shù)據(jù)庫版本不同,即會調(diào)用onUpgrade 25. Override 26. public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) 27. db.execSQL("ALTER TABLE person ADD COLUMN other STRING"); 28. 29. package co
30、m.scott.db;import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;public class DBHelper extends SQLiteOpenHelper private static final String DATABASE_NAME = "test.db"private static final int DATABASE_VERSION = 1;public D
31、BHelper(Context context) /CursorFactory設(shè)置為null,使用默認(rèn)值super(context, DATABASE_NAME, null, DATABASE_VERSION);/數(shù)據(jù)庫第一次被創(chuàng)建時onCreate會被調(diào)用Overridepublic void onCreate(SQLiteDatabase db) db.execSQL("CREATE TABLE IF NOT EXISTS person" +"(_id INTEGER PRIMARY KEY AUTOINCREMENT, name VARCHAR, age I
32、NTEGER, info TEXT)");/如果DATABASE_VERSION值被改為2,系統(tǒng)發(fā)現(xiàn)現(xiàn)有數(shù)據(jù)庫版本不同,即會調(diào)用onUpgradeOverridepublic void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) db.execSQL("ALTER TABLE person ADD COLUMN other STRING");正如上面所述,數(shù)據(jù)庫第一次創(chuàng)建時onCreate方法會被調(diào)用,我們可以執(zhí)行創(chuàng)建表的語句,當(dāng)系統(tǒng)發(fā)現(xiàn)版本變化之后,會調(diào)用onUpgrade方法,我們可
33、以執(zhí)行修改表結(jié)構(gòu)等語句。 為了方便我們面向?qū)ο蟮氖褂脭?shù)據(jù),我們建一個Person類,對應(yīng)person表中的字段,如下:java view plaincopyprint?1. package com.scott.db; 2.3. public class Person 4. public int _id; 5. public String name; 6. public int age; 7. public String info; 8.9. public Person() 10. 11.12. public Person(String name, int age, String info) 1
34、3. = name; 14. this.age = age; 15. = info; 16. 17. package com.scott.db;public class Person public int _id;public String name;public int age;public String info;public Person() public Person(String name, int age, String info) = name;this.age = age; = info;然后,我們需
35、要一個DBManager,來封裝我們所有的業(yè)務(wù)方法,代碼如下: java view plaincopyprint?1. package com.scott.db; 2.3. import java.util.ArrayList; 4. import java.util.List; 5.6. import android.content.ContentValues; 7. import android.content.Context; 8. import android.database.Cursor; 9. import android.database.sqlite.SQLiteDataba
36、se; 10.11. public class DBManager 12. private DBHelper helper; 13. private SQLiteDatabase db; 14.15. public DBManager(Context context) 16. helper = new DBHelper(context); 17. /因為getWritableDatabase內(nèi)部調(diào)用了mContext.openOrCreateDatabase(mName, 0, mFactory); 18. /所以要確保context已初始化,我們可以把實例化DBManager的步驟放在Act
37、ivity的onCreate里 19. db = helper.getWritableDatabase(); 20. 21.22. /* 23. * add persons 24. * param persons 25. */ 26. public void add(List<Person> persons) 27. db.beginTransaction(); /開始事務(wù) 28. try 29. for (Person person : persons) 30. db.execSQL("INSERT INTO person VALUES(null, ?, ?, ?)&q
38、uot;, new O, person.age, ); 31. 32. db.setTransactionSuccessful(); /設(shè)置事務(wù)成功完成 33. finally 34. db.endTransaction(); /結(jié)束事務(wù) 35. 36. 37.38. /* 39. * update person's age 40. * param person 41. */ 42. public void updateAge(Person person) 43. ContentValues cv = new ContentValu
39、es(); 44. cv.put("age", person.age); 45. db.update("person", cv, "name = ?", new S); 46. 47.48. /* 49. * delete old person 50. * param person 51. */ 52. public void deleteOldPerson(Person person) 53. db.delete("person", "age >= ?",
40、 new StringString.valueOf(person.age); 54. 55.56. /* 57. * query all persons, return list 58. * return List<Person> 59. */ 60. public List<Person> query() 61. ArrayList<Person> persons = new ArrayList<Person>(); 62. Cursor c = queryTheCursor(); 63. while (c.moveToNext() 64. P
41、erson person = new Person(); 65. person._id = c.getInt(c.getColumnIndex("_id"); 66. = c.getString(c.getColumnIndex("name"); 67. person.age = c.getInt(c.getColumnIndex("age"); 68. = c.getString(c.getColumnIndex("info"); 69. persons.add(p
42、erson); 70. 71. c.close(); 72. return persons; 73. 74.75. /* 76. * query all persons, return cursor 77. * return Cursor 78. */ 79. public Cursor queryTheCursor() 80. Cursor c = db.rawQuery("SELECT * FROM person", null); 81. return c; 82. 83.84. /* 85. * close database 86. */ 87. public voi
43、d closeDB() 88. db.close(); 89. 90. package com.scott.db;import java.util.ArrayList;import java.util.List;import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.sqlite.SQLiteDatabase;public class DBManager private DBHelper helper;pr
44、ivate SQLiteDatabase db;public DBManager(Context context) helper = new DBHelper(context);/因為getWritableDatabase內(nèi)部調(diào)用了mContext.openOrCreateDatabase(mName, 0, mFactory);/所以要確保context已初始化,我們可以把實例化DBManager的步驟放在Activity的onCreate里db = helper.getWritableDatabase();/* * add persons * param persons */public
45、void add(List<Person> persons) db.beginTransaction();/開始事務(wù) try for (Person person : persons) db.execSQL("INSERT INTO person VALUES(null, ?, ?, ?)", new O, person.age, ); db.setTransactionSuccessful();/設(shè)置事務(wù)成功完成 finally db.endTransaction();/結(jié)束事務(wù) /* * update p
46、erson's age * param person */public void updateAge(Person person) ContentValues cv = new ContentValues();cv.put("age", person.age);db.update("person", cv, "name = ?", new S);/* * delete old person * param person */public void deleteOldPerson(Person p
47、erson) db.delete("person", "age >= ?", new StringString.valueOf(person.age);/* * query all persons, return list * return List<Person> */public List<Person> query() ArrayList<Person> persons = new ArrayList<Person>();Cursor c = queryTheCursor(); while (c
48、.moveToNext() Person person = new Person(); person._id = c.getInt(c.getColumnIndex("_id"); = c.getString(c.getColumnIndex("name"); person.age = c.getInt(c.getColumnIndex("age"); = c.getString(c.getColumnIndex("info"); persons.add(person
49、); c.close(); return persons;/* * query all persons, return cursor * returnCursor */public Cursor queryTheCursor() Cursor c = db.rawQuery("SELECT * FROM person", null); return c;/* * close database */public void closeDB() db.close();我們在DBManager構(gòu)造方法中實例化DBHelper并獲取一個SQLiteDatabase對象,作為整個應(yīng)用的
50、數(shù)據(jù)庫實例;在添加多個Person信息時,我們采用了事務(wù)處理,確保數(shù)據(jù)完整性;最后我們提供了一個closeDB方法,釋放數(shù)據(jù)庫資源,這一個步驟在我們整個應(yīng)用關(guān)閉時執(zhí)行,這個環(huán)節(jié)容易被忘記,所以朋友們要注意。 我們獲取數(shù)據(jù)庫實例時使用了getWritableDatabase()方法,也許朋友們會有疑問,在getWritableDatabase()和getReadableDatabase()中,你為什么選擇前者作為整個應(yīng)用的數(shù)據(jù)庫實例呢?在這里我想和大家著重分析一下這一點。我們來看一下SQLiteOpenHelper中的getReadableDatabase()方法:java view plain
51、copyprint?1. public synchronized SQLiteDatabase getReadableDatabase() 2. if (mDatabase != null && mDatabase.isOpen() 3. / 如果發(fā)現(xiàn)mDatabase不為空并且已經(jīng)打開則直接返回 4. return mDatabase; 5. 6.7. if (mIsInitializing) 8. / 如果正在初始化則拋出異常 9. throw new IllegalStateException("getReadableDatabase called recurs
52、ively"); 10. 11.12. / 開始實例化數(shù)據(jù)庫mDatabase 13.14. try 15. / 注意這里是調(diào)用了getWritableDatabase()方法 16. return getWritableDatabase(); 17. catch (SQLiteException e) 18. if (mName = null) 19. throw e; / Can't open a temp database read-only! 20. Log.e(TAG, "Couldn't open " + mName + "
53、for writing (will try read-only):", e); 21. 22.23. / 如果無法以可讀寫模式打開數(shù)據(jù)庫 則以只讀方式打開 24.25. SQLiteDatabase db = null; 26. try 27. mIsInitializing = true; 28. String path = mContext.getDatabasePath(mName).getPath();/ 獲取數(shù)據(jù)庫路徑 29. / 以只讀方式打開數(shù)據(jù)庫 30. db = SQLiteDatabase.openDatabase(path, mFactory, SQLiteDa
54、tabase.OPEN_READONLY); 31. if (db.getVersion() != mNewVersion) 32. throw new SQLiteException("Can't upgrade read-only database from version " + db.getVersion() + " to " 33. + mNewVersion + ": " + path); 34. 35.36. onOpen(db); 37. Log.w(TAG, "Opened " + mNa
55、me + " in read-only mode"); 38. mDatabase = db;/ 為mDatabase指定新打開的數(shù)據(jù)庫 39. return mDatabase;/ 返回打開的數(shù)據(jù)庫 40. finally 41. mIsInitializing = false; 42. if (db != null && db != mDatabase) 43. db.close(); 44. 45. public synchronized SQLiteDatabase getReadableDatabase() if (mDatabase != nul
56、l && mDatabase.isOpen() / 如果發(fā)現(xiàn)mDatabase不為空并且已經(jīng)打開則直接返回return mDatabase;if (mIsInitializing) / 如果正在初始化則拋出異常throw new IllegalStateException("getReadableDatabase called recursively");/ 開始實例化數(shù)據(jù)庫mDatabasetry / 注意這里是調(diào)用了getWritableDatabase()方法return getWritableDatabase(); catch (SQLiteExce
57、ption e) if (mName = null)throw e; / Can't open a temp database read-only!Log.e(TAG, "Couldn't open " + mName + " for writing (will try read-only):", e);/ 如果無法以可讀寫模式打開數(shù)據(jù)庫 則以只讀方式打開SQLiteDatabase db = null;try mIsInitializing = true;String path = mContext.getDatabasePath(mName).getPath();/ 獲取數(shù)據(jù)庫路徑/ 以只讀方式打開數(shù)據(jù)庫db = SQ
溫馨提示
- 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度木材綜合利用技術(shù)研發(fā)合同樣本7篇
- 2025年加盟商店面維護(hù)協(xié)議
- 2025版巡游出租車特許經(jīng)營合同修訂版五3篇
- 2025版家居建材銷售合同終止與綠色環(huán)保認(rèn)證協(xié)議
- 2025年度船舶港口日常保潔與維護(hù)服務(wù)合同3篇
- 五氧化二釩項目評價分析報告
- 二零二五年度能源合同解除協(xié)議
- 二零二五年度出租車租賃合同司機休息區(qū)域與設(shè)施協(xié)議
- 二零二五年度海域使用權(quán)租賃及海洋資源綜合利用技術(shù)服務(wù)合同
- 二零二五年度股東變更后的董事會組成與授權(quán)協(xié)議
- 中國聯(lián)合網(wǎng)絡(luò)通信有限公司招聘筆試題庫2024
- 【社會工作介入精神障礙社區(qū)康復(fù)問題探究的文獻(xiàn)綜述5800字】
- 節(jié)前停工停產(chǎn)與節(jié)后復(fù)工復(fù)產(chǎn)安全注意事項課件
- 設(shè)備管理績效考核細(xì)則
- 中國人民銀行清算總中心直屬企業(yè)2023年招聘筆試上岸歷年典型考題與考點剖析附帶答案詳解
- (正式版)SJT 11449-2024 集中空調(diào)電子計費信息系統(tǒng)工程技術(shù)規(guī)范
- 人教版四年級上冊加減乘除四則混合運算300題及答案
- 合成生物學(xué)技術(shù)在生物制藥中的應(yīng)用
- 消化系統(tǒng)疾病的負(fù)性情緒與心理護(hù)理
- 高考語文文學(xué)類閱讀分類訓(xùn)練:戲劇類(含答案)
- 協(xié)會監(jiān)事會工作報告大全(12篇)
評論
0/150
提交評論