android-数据库SQLite相关
android平臺下的SQLite數據庫是一種輕量級數據庫,支持標準的SQL語句。
本文將介紹
- android數據庫的創建
- 利用sql語句對數據庫增刪改查
- 系統api數據庫增刪改查
- 數據庫的事務
- 1,數據庫的創建
步驟:
- 寫一個類繼承SQLiteOpenHelper
- 在構造函數中指定 數據庫名稱,游標工廠, 版本號
- 初始化數據庫,執行getWritableDatabase或getReadableDatabase, 創建或打開一個數據庫.
-
onCreate里執行SQL創建語句
-
?????? android平臺下數據庫的創建需要一個輔助類繼承SQLiteOpenHelper,并且需要重寫父類的構造方法。
- /**
* 數據庫創建輔助類 寫一個類繼承SQLiteOpenHelper
*
* @author wgk
*
*/
public class PersonSQLiteOpenHelper extends SQLiteOpenHelper {public PersonSQLiteOpenHelper(Context context) { super(context, "PERSON.db", null, 1);//此處是super,直接調用父類的構造方法
}/** * * 構造方法,用于創建一個輔助類,用于打開/創建/管理一個數據庫 * * @param context * 上下文 * @param name * 數據庫文件的名字 * @param factory * 游標工廠 Cursor 游標(指針), 本身并不存儲數據. 保存數據庫的引用. * @param version * 數據庫版本 */ public PersonSQLiteOpenHelper(Context context, String name, CursorFactory factory, int version) { super(context, name, factory, version); }@Override // 數據庫第一次被創建時調用,適合初始化操作 public void onCreate(SQLiteDatabase db) { // 創建表 db.execSQL("create table person (" + " _id integer primary key autoincrement, " + " name varchar(20), " + " age integer);"); }@Override // 數據庫更新時調用這個方法 // 用于執行表的更新操作 public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { // TODO Auto-generated method stub
}}
??? 這個類僅僅是一個輔助類,若想使用數據庫,還需要創建一個數據庫訪問類PersonDAO。
-
2,對數據庫進行增刪改查
- public class PersonDAO{private final Context context;private PersonSQLiteOpenHelper helper;public PersonDAO(Context context) {this.context = context;helper = new PersonSQLiteOpenHelper(context);}/*** @param name* @param age*/public void add(String name, int age) {SQLiteDatabase db = helper.getWritableDatabase();// db.execSQL("insert into person (name,age) values ('"+name+"',"+age+")");// 防止SQL注入db.execSQL("insert into person (name,values) values(?,?)",new Object[] { name, age });}/*** 根據名字刪除一條數據* * @param name*/public void delete(String name) {SQLiteDatabase db = helper.getWritableDatabase();db.execSQL("delete from person where name=?", new Object[] { name });}//根據名字更新年齡 public void update(int age, String name) {SQLiteDatabase db = helper.getWritableDatabase();db.execSQL("update person set age=? where name=?", new Object[] { age,name });}public void querySingleRecord(String nameStr) {SQLiteDatabase db = helper.getReadableDatabase();Cursor cursor = db.rawQuery("select * from person where name=?",new String[] { nameStr });if (cursor != null && cursor.moveToFirst()) {String _id = cursor.getString(0);String name = cursor.getString(1);String age = cursor.getString(2);System.out.println("_id: " + _id);System.out.println("name: " + name);System.out.println("age: " + age);cursor.close();}}/*** 查詢所有數據*/public void queryAll() {SQLiteDatabase db = helper.getReadableDatabase();Cursor cursor = db.rawQuery("select * form person", null);if (cursor != null && cursor.getCount() > 0) {while (cursor.moveToNext()) {int _id = cursor.getInt(cursor.getColumnIndex("_id"));String name = cursor.getString(cursor.getColumnIndex("name"));int age = cursor.getInt(cursor.getColumnIndex("age"));System.out.println("_id: " + _id);System.out.println("name: " + name);System.out.println("age: " + age);System.out.println("-----------------");}cursor.close();}}}
-
注意:在獲得數據庫輔助類對象時,此時并未創建數據庫,只有在輔助類對象調用getxxxxDatabase方法(創建可讀或者可寫的數據庫)時,才創建數據庫。
- //此時并未創建數據可 PersonSQLiteOpenHelper helper = new PersonSQLiteOpenHelper(getContext()); // 獲取一個可讀/可寫的數據庫, 真正創建了數據庫 helper.getWritableDatabase(); ? 3,使用goole的api操作數據庫
-
除了使用SQL語句來進行增刪改查,還可以使用google提供的api。
//主要語句 // 增 db.insert("person", "name", values);// 刪db.delete("person", "name=?", new String[]{name});// 改db.update("person", values, "name=?", new String[]{name});//查Cursor cursor = db.query("person", // 表名null, // 要查詢列名 new String[]{name,age}"name = ?", // 查詢條件new String[]{nameStr},// 條件參數null, // 分組 null, // 分組null); // 排序使用google的api對PersonDAO進行修改,如下
/*** 使用google提供的api來操作數據庫* * 數據庫訪問對象* @author wgk**/ public class PersonDAO3 {private final Context context;private PersonSQLiteOpenHelper helper;public PersonDAO3(Context context){this.context=context;helper=new PersonSQLiteOpenHelper(context);}/*** 增加一條數據* @param name* @param age*/public void add(String name,int age){SQLiteDatabase db=helper.getWritableDatabase();ContentValues values=new ContentValues();values.put("name", name);values.put("age", age);//若需要插入一條空的數據,需要指定任意一個列的名稱,以避免異常String nullColumnHack="null";long insert=db.insert("person", nullColumnHack, values);System.out.println(insert);}/*** 刪除一條數據根據名字* @param name*/public void delete(String name){SQLiteDatabase db=helper.getWritableDatabase();int delete=db.delete("person", "name=?", new String[]{name});System.out.println(delete); }/*** 更新年齡!根據名字* @param age* @param name*/public void update(int age,String name){SQLiteDatabase db=helper.getWritableDatabase();ContentValues values=new ContentValues();values.put("age", age);int update =db.update("person", values, "name=?", new String[]{name});System.out.println(update);}/*** 查!根據一個人的名字* @param name*/public void querySingleRecord(String nameStr){SQLiteDatabase db=helper.getReadableDatabase();Cursor cursor=db.query("person",null,//列名"name=?",//查詢條件new String[]{nameStr},//查詢參數null, //分組null,//分組null);//排序if(cursor!=null&&cursor.moveToFirst()){String _id=cursor.getString(0);String name=cursor.getString(1);String age=cursor.getString(2);System.out.println("_id: " + _id);System.out.println("name: " + name);System.out.println("age: " + age);//關閉cursor//關閉cursor//關閉cursor cursor.close();}}/*** 查詢所有數據*/public void queryAll(){SQLiteDatabase db=helper.getReadableDatabase();Cursor cursor=db.query("person",null,null,null, null, null, "_id DESC");//排序if(cursor!=null&&cursor.getCount()>0){while(cursor.moveToNext()){int _id=cursor.getInt(cursor.getColumnIndex("_id"));String name=cursor.getString(cursor.getColumnIndex("name"));int age=cursor.getInt(cursor.getColumnIndex("age"));System.out.println("_id: " + _id);System.out.println("name: " + name);System.out.println("age: " + age); }//關閉cursor//關閉cursor//關閉cursor cursor.close();}} }兩種方式的比較
1.利用SQL語句進行增刪改查
優點:靈活, 根據需要進行表的級聯查詢.缺點:容易出錯. 沒有返回值
2.利用系統API增刪改查
優點:不容易出錯. 有返回值
缺點:不靈活, 效率稍低, 拼接sql語句耗時
-------------------------------------------------我是分割線-------------------------------------------------
數據庫的事務(Transaction)
-
(安全性)銀行轉賬:
- 轉出,laowang 賬戶10000 -> 轉出1000 ->
- 轉入,xiaosan 賬戶 0 收到1000
?
-
(高效性)數據的插入:
-
- 提高數據庫操作效率, 大約提升6倍速度
- 打開一次數據,
以laowang給xiaosan轉賬1000的例子寫一段demo如下
public class TransactionDemo extends AndroidTestCase{public void transactionDemo(){PersonSQLiteOpenHelper helper= new PersonSQLiteOpenHelper(getContext());//此時才真正創建數據庫SQLiteDatabase db=helper.getWritableDatabase();try{//開始事務 db.beginTransaction();//轉出1000db.execSQL("update person set money=money-1000 where name=?", new Object[]{"laowang"});//在執行至回滾點之前,并不會對數據庫進行真的操作,一切都在內存中進行,只有執行到回滾點之后,才會影響到數據庫 //int i =1/0;//轉入1000db.execSQL("update person set money=money+1000 where name=?", new Object[]{"xiaosan"});//設置回滾點 db.setTransactionSuccessful();}catch (Exception e){e.printStackTrace();}finally{db.endTransaction();}}?
總結:
-------------------------------------------------基礎要像磐石!!!
轉載于:https://www.cnblogs.com/wgkupupup/p/4604991.html
總結
以上是生活随笔為你收集整理的android-数据库SQLite相关的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [转]oracle中查询指定行数的记录
- 下一篇: javaweb学习总结(三十三)——使用