一.SQlite基本使用
定义一个类继承SQLiteOpenHelper即可完成数据的创建和更新操作。
android 提供了一个数据库操作的帮助类 SQLiteOpenHelper,我定义一个类继承SQLiteOpenHelper即可完成数据的创建和更新操作。
1、创建SQLiteOpenHelper
public class SqliteHelper extends SQLiteOpenHelper {
public SqliteHelper(Context context) {
// 版本号:1 (初始化的设置成1,当这个版本号升级之后会触发onUpgrade函数)
super(context, "sqltest.db", null, 1);
}
//数据库第一次创建的时候调用,适合创建表结构
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL("sql语句");
}
//数据库版本变更之后会执行,适合更改表的结构
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
}
}
2、获取SQLiteDatabase对象操作数据库
getReadableDatabase 和 getWritableDatabase 区别?
1.都可以对数据库进行读写
2.当磁盘满了之后, getWritableDatabase会发送异常;getReadableDatabase不会发送异常,直接返回一个可读的SQLiteDatabase对象。
SqliteHelper sqliteHelper=new SqliteHelper(context);
//打开或者创建数据库,如果是第一次就是创建
SQLiteDatabase readableDatabase=sqliteHelper.getReadableDatabase();
//打开或者创建数据库,如果是第一次就是创建
SQLiteDatabase writableDatabase=sqliteHelper.getWritableDatabase();
getReadableDatabase 和 getWritableDatabase 区别?
a.都可以对数据库进行读写
b.当磁盘满了之后getWritableDatabase会发送异常,getReadableDatabase不会发送异常,直接返回一个可读的SQLiteDatabase对象。

3、数据库增删改查()


2).android方式的增删改查:

增:long row= writableDatabase.insert("info",null,contentValues);
返回值:代表添加这个新行的Id ,-1代表添加失败; nullColumnHack可以为空,表示添加一个空行
删: int totalRow=writableDatabase.delete("info",whereClause,whereArgs); 返回值:成功删除多少行
改: int totalRow=writableDatabase.update("info",contentValues,whereClause,whereArgs); 返回值:成功修改多少行
查:Cursor cursor = writableDatabase.query(table, columns, selection, selectionArgs, groupBy, having, orderBy);
//table:表名, columns:查询的列名, 如果null代表查询所有列;selection:查询条件, selectionArgs:条件占位符的参数值,
//groupBy:按什么字段分组, having:分组的条件, orderBy:按什么字段排序
Cursor cursor = db.query("info", new String[]{"_id","name","phone"}, "name = ?", new String[]{name}, null, null, "_id desc");

增加数据:
public boolean insertData(){
SQLiteDatabase writableDatabase=sqliteHelper.getWritableDatabase();
ContentValues contentValues=new ContentValues();
contentValues.put("name","王五");
contentValues.put("age","13");
//参数1:表名, 参数2:默认填写null, 参数3:插入的数据,列名+value
long row= writableDatabase.insert("info",null,contentValues);
Log.e(TAG,"insertData row="+row);
//row更新的行数
writableDatabase.close();
if(row>0)
return true;
else
return false;
}
删除数据:
public boolean delete(){
SQLiteDatabase writableDatabase=sqliteHelper.getWritableDatabase();
String whereClause="name=?";
String[] whereArgs=new String[]{"王五"};
//参1:表名,参2:where条件, 参3:where条件的占位符参数
int totalRow=writableDatabase.delete("info",whereClause,whereArgs);
Log.e(TAG,"delete totalRow="+totalRow);
//totalRow 更新的行数
writableDatabase.close();
if(totalRow>0)
return true;
else
return false;
}
查询数据:
public boolean select() {
SQLiteDatabase writableDatabase = sqliteHelper.getWritableDatabase();
String table = "info";
String[] columns = new String[]{"name"};
String selection = "name=?";
String[] selectionArgs = new String[]{"王五"};
String groupBy = null;
String having = "";
String orderBy = "";
//参1:表名,参2:要查询的列,查询所有直接填null,参3:查询条件, 参4:查询条件的占位符参数
//参5:分组,参6:条件,参7:排序
Cursor cursor = writableDatabase.query(table, columns, selection, selectionArgs, groupBy, having, orderBy);
if (cursor != null && cursor.getCount() > 0) {
while (cursor.moveToNext()) {
String strName = cursor.getString(0);
Log.e(TAG, "select name=" + strName);
}
}
writableDatabase.close();
return true;
}
更新数据:
public boolean update(){
SQLiteDatabase writableDatabase=sqliteHelper.getWritableDatabase();
ContentValues contentValues=new ContentValues();
contentValues.put("name","王五");
contentValues.put("age","15");
String whereClause="name=?";
String[] whereArgs=new String[]{"王五"};
//参1:表名, 参2:更新的列名, 参3:where条件, 参4:where条件的占位符参数
int totalRow=writableDatabase.update("info",contentValues,whereClause,whereArgs);
Log.e(TAG,"update totalRow="+totalRow);
//totalRow 更新的行数
writableDatabase.close();
if(totalRow>0)
return true;
else
return false;
}

数据库的事务
什么是事务: 要么同时成功,要么同时失败。事务:银行转账
介绍:使用SQLiteDatabase的beginTransaction()开启一个事务,程序执行到endTransaction() 时会检查事务的标志是否为成功,
如果程序执行到endTransaction()之前调用了setTransactionSuccessful() 设置事务的标志为成功则提交事务;如果没有调用setTransactionSuccessful() 方法则回滚事务。
下面两条SQL语句在同一个事务中执行。
public void update2(){
SQLiteDatabase db=sqliteHelper.getWritableDatabase();
try {
db.beginTransaction();//开启事务
db.execSQL("insert into person(name, age) values(?,?)", new Object[]{"传智播客", 4});
db.execSQL("update person set name=? where personid=?", new Object[]{"传智", 1});
// 设置事务成功的标记, 设置事务成功之后才会提交所有sql执行的结果。
// 如果没有设置事务成功的标记,在endTransaction之后将会自动回滚事务
db.setTransactionSuccessful(); //调用此方法会在执行到endTransaction() 时提交当前事务,如果不调用此方法会回滚事务
}catch (Exception ex){
//出现异常自动回滚事务
}finally {
// 必须关闭事务,告诉数据库系统结束. 防止Sqlite被挂掉。
db.endTransaction();//事务的结束的标志,决定是提交事务还是回滚事务
}
}

相关文章: