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 }
View Code

 

第一种增删改查:

增:运行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 }
View Code

 

删:和增一样,只需要把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 }
View Code

 

改:也和增一样,改下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 }
View Code

 

查:这个就和前面不一样了,它运行的是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 }
View Code

 

增删改查每次都要运行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 }
View Code

 

删:先得到数据库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 }
View Code

 

改:先得到数据库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 }
View Code

 

查:先得到数据库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 }
View Code

 

 

事务:

 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         }
View Code

 

posted @ 2017-08-15 20:16  starry_sky  阅读(862)  评论(0编辑  收藏  举报