zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    转:Backbone源码分析-Backbone架构+流程图
    PHP标记、
    虚拟机
    PHP学习的第一天
    对基础班的总结
    JS
    基础班学习总结
    react-router-dom
    vuecli3 自适应pc端界面
    vuecli内使用hotcss做移动端适配
  • 原文地址:https://www.cnblogs.com/xingkongyihao/p/7367509.html
Copyright © 2011-2022 走看看