sqlite数据库的两种增删改查、事物
对sqlite数据库进行增删改查常用的有两种方法。
事务: 执行多条sql语句,要么同时执行成功,要么同时执行失败,不能有的成功,有的失败
第一种:
1.创建一个帮助类的对象,调用getReadableDatabase方法,返回一个SqliteDatebase对象
2.使用SqliteDatebase对象调用execSql()做增删改,调用rawQuery方法做查询。
特点:增删改没有返回值,不能判断sql语句是否执行成功。sql语句手动写,容易写错
第二种:
1.创建一个帮助类的对象,调用getReadableDatabase方法,返回一个SqliteDatebase对象
2.使用SqliteDatebase对象调用insert,update,delete ,query方法做增删改查。
特点:增删改有了返回值,可以判断sql语句是否执行成功,但是查询不够灵活,不能做多表查询。
所以一般常用的是:增删改用第二种方式,查询用第一种方式。
创建一个InfoDao.java进行增删改查。
在创建全局变量MySqliteOpenHelper类,这样MySqliteOpenHelper类只需要实例化一次。
1 public InfoDao(Context mContext) { 2 mySqliteOpenHelper = new MySqliteOpenHelper(mContext); 3 }
第一种增删改查:
增:运行getReadableDatabase方法,返回一个SQLiteDatabase类,先取名为db
然后运行db.execSQL(String sql) sql是sql语句,需要自己写。
最后关闭数据库就行了。
1 public void add(InfoBean bean) { 2 SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase(); 3 //sql:sql语句,binArgs:sql语句中占位符 4 db.execSQL("insert into info(name, phone) values(?, ?);", new Object[]{bean.name, bean.phone}); 5 //关闭数据库 6 db.close(); 7 }
删:和增一样,只需要把sql语句改下就行。
1 public void del(String name) { 2 SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase(); 3 //sql:sql语句,binArgs:sql语句中占位符 4 db.execSQL("delete from info where name = ?;", new Object[]{name}); 5 //关闭数据库 6 db.close(); 7 }
改:也和增一样,改下sql语句。
1 public int update(InfoBean bean) { 2 SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase(); 3 //sql:sql语句,binArgs:sql语句中占位符 4 db.execSQL("update info set phone = ? where name = ?", new Object[]{bean.phone, bean.name}); 5 //关闭数据库 6 db.close(); 7 }
查:这个就和前面不一样了,它运行的是rawQuery方法。会返回一个cursor类,和MySQL里查询返回ResultSet相似。
然后判断有没有数据,有的话就遍历下就行了。不过这个遍历是getString、getInt等只能填下标,不能填名字,这个和ResultSet不一样
1 public void query(String name) { 2 SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase(); 3 //sql:sql语句,binArgs:sql语句中占位符 4 Cursor cursor = db.rawQuery("select _id, name, phone from info where name = ?", new String[]{name}); 5 //解析cursor对象 6 if(cursor != null && cursor.getCount() > 0) { //判断cursor中是否存在数据 7 while(cursor.moveToNext()) { 8 int id = cursor.getInt(0); 9 String name_ste = cursor.getString(1); 10 String phone = cursor.getString(2); 11 12 System.out.println("_id:" + id + "name:" + name_ste + "phone:" + phone); 13 } 14 cursor.close(); 15 } 16 //关闭数据库 17 db.close(); 18 }
增删改查每次都要运行SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase();
这句要写在方法里,每次增删改查后就关闭它,这样在Android有限的空间里就不必一直占用内存了。
第二种增删改查:
增:先得到数据库db,然后运行db.insert()方法进行增加,有三个参数 table、nullColumnHack和values。
table是表名、nullColumnHack在创建一个空行是用到,默认填null、values是一个ContentValues类,数据一行的值
方法有个返回值,-1代表添加失败。
1 public boolean add(InfoBean bean) { 2 SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase(); 3 //Android的另一种添加方式,有返回值 4 5 ContentValues values = new ContentValues(); 6 values.put("name", bean.name); 7 values.put("phone", bean.phone); 8 9 long result = db.insert("info", null, values ); 10 //关闭数据库 11 db.close(); 12 13 if(result != -1) { 14 return true; 15 } else { 16 return false; 17 } 18 }
删:先得到数据库db,然后运行db.delete()方法,有三个参数 table、whereClause、whereArgs
table:表名、whereClause:删除条件、whereArgs:条件的占位符的参数
返回值:成功删除多少行
1 public int del(String name) { 2 SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase(); 3 int result = db.delete("info", "name = ?", new String[]{name}); 4 //关闭数据库 5 db.close(); 6 return result; 7 }
改:先得到数据库db,然后运行db.update()方法,有四个参数table、values、whereClause、whereArgs
table:表名、values:更新的值、whereClause更新的条件、whereArgs更新条件的占位符的值
返回值:成功修改多少行
1 public int update(InfoBean bean){ 2 SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase(); 3 ContentValues values = new ContentValues();//是用map封装的对象,用来存放值 4 values.put("phone", bean.phone); 5 int result = db.update("info", values, "name = ?", new String[]{bean.name}); 6 //关闭数据库对象 7 db.close(); 8 return result; 9 }
查:先得到数据库db,然后运行db.query()方法,query方法的参数有很多,调一个参数有7个的说。
table:表名、columns:查询的列名、selection:查询条件、selectionArgs:条件占位符的参数值、groupBy按什么字段分组、having:分组的条件、orderBy:按什么字段排序
得到一个cursor对象,下面和第一种一样。
1 public void query(String name) { 2 SQLiteDatabase db = mySqliteOpenHelper.getReadableDatabase(); 3 Cursor cursor = db.query("info", new String[]{"_id", "name", "phone"}, "name = ?", new String[]{name}, null, null, "_id desc"); 4 //解析cursor对象 5 if(cursor != null && cursor.getCount() > 0) { //判断cursor中是否存在数据 6 while(cursor.moveToNext()) { 7 int id = cursor.getInt(0); 8 String name_ste = cursor.getString(1); 9 String phone = cursor.getString(2); 10 System.out.println("_id:" + id + "name:" + name_ste + "phone:" + phone); 11 } 12 cursor.close(); 13 } 14 //关闭数据库 15 db.close(); 16 }
事务:
1 db.beginTransaction(); 2 try { 3 db.execSQL("update account set money= money-200 where name=?", 4 new String[] { "张三" }); 5 // int i = 100 / 0; 6 db.execSQL("update account set money= money+200 where name=?", 7 new String[] { "李四" }); 8 db.setTransactionSuccessful(); 9 } finally { 10 db.endTransaction(); 11 }