对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