重點掌握execSQL()和rawQuery()方法,rawQuery()方法用於執行select語句。java
SQLiteOpenHelper,實現了onCreate和onUpgrade方法。android
第一次建立以後接着會調用onCreate方法(咱們在這裏建立了數據表),以後onCreate就再也不被調用。git
DatabaseHelper類:github
package com.example.hellodatabases; import android.content.Context; import android.database.DatabaseErrorHandler; import android.database.sqlite.SQLiteDatabase; import android.database.sqlite.SQLiteDatabase.CursorFactory; import android.database.sqlite.SQLiteOpenHelper; import android.util.Log; public class DatabaseHelper extends SQLiteOpenHelper// 繼承SQLiteOpenHelper類 { // 數據庫版本號 private static final int DATABASE_VERSION = 1; // 數據庫名 private static final String DATABASE_NAME = "TestDB.db"; // 數據表名,一個數據庫中能夠有多個表(雖然本例中只創建了一個表) public static final String TABLE_NAME = "PersonTable"; // 構造函數,調用父類SQLiteOpenHelper的構造函數 public DatabaseHelper(Context context, String name, CursorFactory factory, int version, DatabaseErrorHandler errorHandler) { super(context, name, factory, version, errorHandler); } public DatabaseHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); // SQLiteOpenHelper的構造函數參數: // context:上下文環境 // name:數據庫名字 // factory:遊標工廠(可選) // version:數據庫模型版本號 } public DatabaseHelper(Context context) { super(context, DATABASE_NAME, null, DATABASE_VERSION); // 數據庫實際被建立是在getWritableDatabase()或getReadableDatabase()方法調用時 Log.d(AppConstants.LOG_TAG, "DatabaseHelper Constructor"); // CursorFactory設置爲null,使用系統默認的工廠類 } // 繼承SQLiteOpenHelper類,必需要覆寫的三個方法:onCreate(),onUpgrade(),onOpen() @Override public void onCreate(SQLiteDatabase db) { // 調用時間:數據庫第一次建立時onCreate()方法會被調用 // onCreate方法有一個 SQLiteDatabase對象做爲參數,根據須要對這個對象填充表和初始化數據 // 這個方法中主要完成建立數據庫後對數據庫的操做 Log.d(AppConstants.LOG_TAG, "DatabaseHelper onCreate"); // 構建建立表的SQL語句(能夠從SQLite Expert工具的DDL粘貼過來加進StringBuffer中) StringBuffer sBuffer = new StringBuffer(); sBuffer.append("CREATE TABLE [" + TABLE_NAME + "] ("); sBuffer.append("[_id] INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, "); sBuffer.append("[name] TEXT,"); sBuffer.append("[age] INTEGER,"); sBuffer.append("[info] TEXT)"); // 執行建立表的SQL語句 db.execSQL(sBuffer.toString()); // 即使程序修改從新運行,只要數據庫已經建立過,就不會再進入這個onCreate方法 } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // 調用時間:若是DATABASE_VERSION值被改成別的數,系統發現現有數據庫版本不一樣,即會調用onUpgrade // onUpgrade方法的三個參數,一個 SQLiteDatabase對象,一箇舊的版本號和一個新的版本號 // 這樣就能夠把一個數據庫從舊的模型轉變到新的模型 // 這個方法中主要完成更改數據庫版本的操做 Log.d(AppConstants.LOG_TAG, "DatabaseHelper onUpgrade"); db.execSQL("DROP TABLE IF EXISTS " + TABLE_NAME); onCreate(db); // 上述作法簡單來講就是,經過檢查常量值來決定如何,升級時刪除舊錶,而後調用onCreate來建立新表 // 通常在實際項目中是不能這麼作的,正確的作法是在更新數據表結構時,還要考慮用戶存放於數據庫中的數據不丟失 } @Override public void onOpen(SQLiteDatabase db) { super.onOpen(db); // 每次打開數據庫以後首先被執行 Log.d(AppConstants.LOG_TAG, "DatabaseHelper onOpen"); } }
Person類:sql
package com.example.hellodatabases; 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) { this.name = name; this.age = age; this.info = info; } }
管理類DBManager:數據庫
package com.example.hellodatabases; 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; import android.util.Log; //參考:http://blog.csdn.net/liuhe688/article/details/6715983 public class DBManager { private DatabaseHelper helper; private SQLiteDatabase db; public DBManager(Context context) { Log.d(AppConstants.LOG_TAG, "DBManager --> Constructor"); helper = new DatabaseHelper(context); // 由於getWritableDatabase內部調用了mContext.openOrCreateDatabase(mName, 0, // mFactory); // 因此要確保context已初始化,咱們能夠把實例化DBManager的步驟放在Activity的onCreate裏 db = helper.getWritableDatabase(); } /** * add persons * * @param persons */ public void add(List<Person> persons) { Log.d(AppConstants.LOG_TAG, "DBManager --> add"); // 採用事務處理,確保數據完整性 db.beginTransaction(); // 開始事務 try { for (Person person : persons) { db.execSQL("INSERT INTO " + DatabaseHelper.TABLE_NAME + " VALUES(null, ?, ?, ?)", new Object[] { person.name, person.age, person.info }); // 帶兩個參數的execSQL()方法,採用佔位符參數?,把參數值放在後面,順序對應 // 一個參數的execSQL()方法中,用戶輸入特殊字符時須要轉義 // 使用佔位符有效區分了這種狀況 } db.setTransactionSuccessful(); // 設置事務成功完成 } finally { db.endTransaction(); // 結束事務 } } /** * update person's age * * @param person */ public void updateAge(Person person) { Log.d(AppConstants.LOG_TAG, "DBManager --> updateAge"); ContentValues cv = new ContentValues(); cv.put("age", person.age); db.update(DatabaseHelper.TABLE_NAME, cv, "name = ?", new String[] { person.name }); } /** * delete old person * * @param person */ public void deleteOldPerson(Person person) { Log.d(AppConstants.LOG_TAG, "DBManager --> deleteOldPerson"); db.delete(DatabaseHelper.TABLE_NAME, "age >= ?", new String[] { String.valueOf(person.age) }); } /** * query all persons, return list * * @return List<Person> */ public List<Person> query() { Log.d(AppConstants.LOG_TAG, "DBManager --> query"); ArrayList<Person> persons = new ArrayList<Person>(); Cursor c = queryTheCursor(); while (c.moveToNext()) { Person person = new Person(); person._id = c.getInt(c.getColumnIndex("_id")); person.name = c.getString(c.getColumnIndex("name")); person.age = c.getInt(c.getColumnIndex("age")); person.info = c.getString(c.getColumnIndex("info")); persons.add(person); } c.close(); return persons; } /** * query all persons, return cursor * * @return Cursor */ public Cursor queryTheCursor() { Log.d(AppConstants.LOG_TAG, "DBManager --> queryTheCursor"); Cursor c = db.rawQuery("SELECT * FROM " + DatabaseHelper.TABLE_NAME, null); return c; } /** * close database */ public void closeDB() { Log.d(AppConstants.LOG_TAG, "DBManager --> closeDB"); // 釋放數據庫資源 db.close(); } }
Activity:app
HelloDBActivity package com.example.hellodatabases; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.database.Cursor; import android.database.CursorWrapper; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.widget.ListView; import android.widget.SimpleAdapter; import android.widget.SimpleCursorAdapter; //參考:http://blog.csdn.net/liuhe688/article/details/6715983 public class HelloDBActivity extends Activity { private DBManager dbManager; private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_hello_db); listView = (ListView) findViewById(R.id.listView); // 初始化DBManager dbManager = new DBManager(this); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.hello_db, menu); return true; } @Override protected void onDestroy() { super.onDestroy(); dbManager.closeDB();// 釋放數據庫資源 } public void add(View view) { ArrayList<Person> persons = new ArrayList<Person>(); Person person1 = new Person("Ella", 22, "lively girl"); Person person2 = new Person("Jenny", 22, "beautiful girl"); Person person3 = new Person("Jessica", 23, "sexy girl"); Person person4 = new Person("Kelly", 23, "hot baby"); Person person5 = new Person("Jane", 25, "a pretty woman"); persons.add(person1); persons.add(person2); persons.add(person3); persons.add(person4); persons.add(person5); dbManager.add(persons); } public void update(View view) { // 把Jane的年齡改成30(注意更改的是數據庫中的值,要查詢才能刷新ListView中顯示的結果) Person person = new Person(); person.name = "Jane"; person.age = 30; dbManager.updateAge(person); } public void delete(View view) { // 刪除全部三十歲以上的人(此操做在update以後進行,Jane會被刪除(由於她的年齡被改成30)) // 一樣是查詢才能查看更改結果 Person person = new Person(); person.age = 30; dbManager.deleteOldPerson(person); } public void query(View view) { List<Person> persons = dbManager.query(); ArrayList<Map<String, String>> list = new ArrayList<Map<String, String>>(); for (Person person : persons) { HashMap<String, String> map = new HashMap<String, String>(); map.put("name", person.name); map.put("info", person.age + " years old, " + person.info); list.add(map); } SimpleAdapter adapter = new SimpleAdapter(this, list, android.R.layout.simple_list_item_2, new String[] { "name", "info" }, new int[] { android.R.id.text1, android.R.id.text2 }); listView.setAdapter(adapter); } @SuppressWarnings("deprecation") public void queryTheCursor(View view) { Cursor c = dbManager.queryTheCursor(); startManagingCursor(c); // 託付給activity根據本身的生命週期去管理Cursor的生命週期 CursorWrapper cursorWrapper = new CursorWrapper(c) { @Override public String getString(int columnIndex) { // 將簡介前加上年齡 if (getColumnName(columnIndex).equals("info")) { int age = getInt(getColumnIndex("age")); return age + " years old, " + super.getString(columnIndex); } return super.getString(columnIndex); } }; // 確保查詢結果中有"_id"列 SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, android.R.layout.simple_list_item_2, cursorWrapper, new String[] { "name", "info" }, new int[] { android.R.id.text1, android.R.id.text2 }); ListView listView = (ListView) findViewById(R.id.listView); listView.setAdapter(adapter); } }
佈局:ide
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="add" android:text="add" /> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="update" android:text="update" /> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="delete" android:text="delete" /> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="query" android:text="query" /> <Button android:layout_width="fill_parent" android:layout_height="wrap_content" android:onClick="queryTheCursor" android:text="queryTheCursor" /> <ListView android:id="@+id/listView" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>
常量:函數
package com.example.hellodatabases; public class AppConstants { public static final String LOG_TAG="Hello DB"; }
1111111111111工具
實例代碼地址: