第一种方式:(手动写SQL语句方式)
1、创建一个帮助类的对象,调用getReadableDatabase或getWritableDatabase方法,返回一个SqliteDatebase对象
2、使用SqliteDatebase对象调用execSql()做增删改操作,调用rawQuery方法做查询操作。
特点:
增删改没有返回值,不能够判断sql语句是否执行成功。sql语句手动写,容易写错。
public class InfoDao {
MySqliteOpenHelper mySqliteOpenHelper;
public InfoDao(Context context) {
//创建一个帮助类对象
mySqliteOpenHelper = new MySqliteOpenHelper(context);
}
public void add(InfoBean bean){
// 执行sql语句需要SQLiteDatabase对象
//调用getReadableDatabase方法,来初始化数据库的创建
SQLiteDatabase database = mySqliteOpenHelper.getWritableDatabase();
//sql:sql语句 bindArgs:sql语句中占位符的值
database.execSQL(“insert into info(name,phone) values(?,?);”,new Object[]{bean.name,bean.phone});
//关闭数据库对象
database.close();
}
public void del(String name){
// 执行sql语句需要SQLiteDatabase对象
//调用getReadableDatabase方法,来初始化数据库的创建
SQLiteDatabase database = mySqliteOpenHelper.getWritableDatabase();
//sql:sql语句 bindArgs:sql语句中占位符的值
database.execSQL(“delete from info where name=?;”,new Object[]{name});
//关闭数据库对象
database.close();
}
public void update(InfoBean bean){
// 执行sql语句需要SQLiteDatabase对象
//调用getReadableDatabase方法,来初始化数据库的创建
SQLiteDatabase database = mySqliteOpenHelper.getWritableDatabase();
//sql:sql语句 bindArgs:sql语句中占位符的值
database.execSQL(“update info set phone=? where name=?;”,new Object[]{bean.name,bean.phone});
//关闭数据库对象
database.close();
}
public void query(String name){
// 执行sql语句需要SQLiteDatabase对象
//调用getReadableDatabase方法,来初始化数据库的创建
SQLiteDatabase database = mySqliteOpenHelper.getWritableDatabase();
//sql:sql语句 selectionArgs:查询条件占位符的值,返回一个cursor值
Cursor cursor = database.rawQuery(“select _id,name,phone from info where name=?”, new String[]{name});
//解析Cursor中的数据
if (cursor!=null && cursor.getCount()>0){//判断cursor中是否有数据
//循环遍历结果集,获取每一行的内容
while (cursor.moveToNext()){//条件,游标能否定位到下一行
//获取数据
int id = cursor.getInt(cursor.getColumnIndex(“_id”));
String name1 = cursor.getString(cursor.getColumnIndex(“name”));
String phone = cursor.getString(cursor.getColumnIndex(“phone”));
Log.e(“——–”,”_id:”+id+”;name:”+name1+”;phone:”+phone);
}
cursor.close();//关闭结果集
}
//关闭数据库对象
database.close();
}
}
第二种方式:(Android提供的另一种方式)
1、创建一个帮助类,调用 getReadableDatabase方法,返回一个 SqliteDatebase对象;
2、使用 SqliteDatebase对象调用insert,delete,update,query方法做增删改查。
特点:
增删改有了返回值,可以判断sql语句是否执行成功,但是查询不够灵活,不可以做多表查询。所以一般增删改用第二种方式,查询用第一种方式。
public class InfoDao {
MySqliteOpenHelper mySqliteOpenHelper;
public InfoDao(Context context) {
//创建一个帮助类对象
mySqliteOpenHelper = new MySqliteOpenHelper(context);
}
public boolean add(InfoBean bean){
// 执行sql语句需要SQLiteDatabase对象
//调用getReadableDatabase方法,来初始化数据库的创建
SQLiteDatabase database = mySqliteOpenHelper.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(“name”,bean.name);
contentValues.put(“phone”,bean.phone);
//table:表名; nullColumnHack:可以为空,表示添加一个空行; values:存放添加一行数据的值
//返回值代表新添加的这一行的id,-1代表添加失败
long insert = database.insert(“info”, null, contentValues);
//关闭数据库对象
database.close();
if (insert!=-1){
return true;
}else {
return false;
}
}
public int del(String name){
// 执行sql语句需要SQLiteDatabase对象
//调用getReadableDatabase方法,来初始化数据库的创建
SQLiteDatabase database = mySqliteOpenHelper.getWritableDatabase();
//table :表名, whereClause: 删除条件, whereArgs:条件的占位符的参数 ; 返回值:成功删除多少行
int delete = database.delete(“info”, “name=?”, new String[]{name});
//关闭数据库对象
database.close();
return delete;
}
public int update(InfoBean bean){
// 执行sql语句需要SQLiteDatabase对象
//调用getReadableDatabase方法,来初始化数据库的创建
SQLiteDatabase database = mySqliteOpenHelper.getWritableDatabase();
ContentValues contentValues = new ContentValues();
contentValues.put(“phone”,bean.phone);
//table:表名, values:更新的值, whereClause:更新的条件, whereArgs:更新条件的占位符的值,返回值:成功修改多少行
int update = database.update(“info”, contentValues, “name=?”, new String[]{bean.name});
//关闭数据库对象
database.close();
return update;
}
public void query(String name){
// 执行sql语句需要SQLiteDatabase对象
//调用getReadableDatabase方法,来初始化数据库的创建
SQLiteDatabase database = mySqliteOpenHelper.getWritableDatabase();
//table:表名, columns:查询的列名,如果null代表查询所有列; selection:查询条件, selectionArgs:条件占位符的参数值,
//groupBy:按什么字段分组, having:分组的条件, orderBy:按什么字段排序
Cursor cursor = database.query(“info”, null, “name=?”, new String[]{name}, null, null, null);
//解析Cursor中的数据
if (cursor!=null && cursor.getCount()>0){//判断cursor中是否有数据
//循环遍历结果集,获取每一行的内容
while (cursor.moveToNext()){//条件,游标能否定位到下一行
//获取数据
int id = cursor.getInt(cursor.getColumnIndex(“_id”));
String name1 = cursor.getString(cursor.getColumnIndex(“name”));
String phone = cursor.getString(cursor.getColumnIndex(“phone”));
Log.e(“——–”,”_id:”+id+”;name:”+name1+”;phone:”+phone);
}
cursor.close();//关闭结果集
}
//关闭数据库对象
database.close();
}
}
数据库的事务
1、事务:执行多条sql语句,要么同时执行成功,要么同时执行失败,不可以有的成功,有的失败。(银行转账)
//点击按钮执行方法
public void transtation(View view){
//1.创建一个帮助类的对象
BankOpenHelper bankOpenHelper=new BankOpenHelper(mContext);
//2.调用数据库帮助类对象的getReadableDatabase创建数据库,初始化表数据,获取SqliteDatabase对象去做转账(sql语句)
SQLiteDatabase db = bankOpenHelper.getReadableDatabase();
//3.转账,将李四的钱减200,将张三的钱加200
db.beginTransaction();//开启一个数据库事务
try{
db.execSQL(“update info set money= money-200 where name=?”,new String[]{“李四”});
// int i = 100/0;//模拟异常
db.execSQL(“update info set money= money+200 where name=?”,new String[]{“张三”});
db.setTransactionSuccessful();//标记事务中的sql语句全部执行成功
}finally {
db.endTransaction();//判断事务的标记是否成功,如果不成功,回滚错误之前执行的sql语句
}
}