android SQLite数据库总结
SQLite
SQLite是一种超轻量级的嵌入式数据库,大小只有几百KB,但是其语法支持标准SQL语法,同时还遵循了数据库的ACID事务,所以学过其他数据库的开发人员都很容易掌握其使用。
sql语法就不介绍了,直接看在android中的使用
SQLiteOpenHelper——封装好的数据库操作辅助类,需重写
重写方法
onCreate:初始化数据库,创建表,添加初始数据
onUpgrade:数据库版本升级时的数据库操作,如备份删除数据库等
常用方法
getReadableDatabase() 获取SQLiteDatabase对象,操作数据库
getWritableDatabase() 获取SQLiteDatabase对象,操作数据库
区别:在磁盘空间满或不可写时,1方法将获得只读的数据库对象,而2方法会报错,在正常情况下,获取到的都是可读写的数据库对象。
importandroid.content.Context;
importandroid.database.sqlite.SQLiteDatabase;
importandroid.database.sqlite.SQLiteOpenHelper;
publicclassDBHelperextendsSQLiteOpenHelper{
privatestaticfinalStringname="my";//数据库名
privatestaticfinalintversion=1;//版本号
//重写构造方法的时候选择参数少的一项
publicDBHelper(Contextcontext){
//1:上下文2:数据库名称3:游标创建工厂4:数据库版本版本只能是整数123..
super(context,name,null,version);
}
//数据库的初始化SQLiteDatabase数据库操作对象
//一般只在第一次运行和版本更新的时候调用
@Override
publicvoidonCreate(SQLiteDatabasedb){
//创建数据库主键默认自增
db.execSQL("createtablestudent("+
"_idintegernotnullprimarykeyautoincrement,"+
"namevarchar(20),"+
"phonevarchar(11),"+
"gendervarchar(2))");
//添加一条测试数据
db.execSQL("insertintostudentvalues(null,?,?,?)"
,newObject[]{"小黑","12345678901","男"});
}
/**
*在版本升级的时候调用
*修改version为2表示版本升级就会调用这个方法
*@paramdb数据库操作对象
*@paramoldVersion旧版本号
*@paramnewVersion新版本号
*/
@Override
publicvoidonUpgrade(SQLiteDatabasedb,intoldVersion,intnewVersion){
}
}
在android数据库的创建是需要创建对象才能创建的
在activity类中创建出一个数据库类对象
创建好数据对象就可以操作数据了通过SQLiteDatabase获取 两种获取方法的区别上面已经提到过了
//创建数据 DBHelperhelper=newDBHelper(this); //调用数据操作对象 SQLiteDatabasedbWrite=helper.getWritableDatabase(); SQLiteDatabasedbRead=helper.getReadableDatabase();
SQLiteDatabase给我们提供了很多操作数据的方法
删除:(int)delete(Stringtable,StringwhereClause,String[]whereArgs)
table:表名
whereClause:where条件 列名占位符 id=?
whereArgs:参数值数组
添加:(long)insert(Stringtable,StringnullColumnHack,ContentValuesvalues)
nullColumnHack:为空列
ContentValuesvalues:通过键值对存储添加的数据 key为列value为值
insert方法底层是通过拼接字符串的方式如果ContentValues是空的拼接成的sql语句无法执行会报错所以给一个可以为空的列当ContentValues为空时也可以执行有兴趣的可以看一下源码
更新:(int)update(Stringtable,ContentValuesvalues,StringwhereClause,String[]whereArgs)
参数意思同上
查询:(Cursor)query(booleandistinct,Stringtable,String[]columns,Stringselection,String[]selectionArgs,StringgroupBy,Stringhaving,StringorderBy,Stringlimit)
返回值是一个游标 这个query参数较多简单的查询就还是写一条sql语句简单点
booleandistinct去重复
Stringtable表名
String[]columns要查询的列
Stringselection查询条件
String[]selectionArgs查询参数值
StringgroupBy分组
Stringhaving分组条件
StringorderBy排序
Stringlimit分页查询限制
关闭数据库:(void)close()
执行一条sql语句:(void)execSQL(Stringsql)增删改查
查询查询sql:(Cursor)rawQuery(Stringsql,String[]selectionArgs)
事务
try{
db.beginTransaction();//开启事务
//db.update();
//db.insert();
db.setTransactionSuccessful();//没有设置事物成功finally就会回滚
}catch(Exceptione){
e.printStackTrace();
}finally{
db.endTransaction();
}
贴代码咯 执行sql语句和封装好的方法
查询
privatevoidquery(){
StringBuffersb=newStringBuffer("select*fromstudentwhere1=1");
//参数集合
List<String>params=newArrayList<>();
if(!TextUtils.isEmpty(id)){
sb.append("and_id=?");
params.add(id);
}
if(!TextUtils.isEmpty(phone)){
sb.append("andphone=?");
params.add(phone);
}
if(!TextUtils.isEmpty(name)){
sb.append("andname=?");
params.add(name);
}
if(!TextUtils.isEmpty(gender)){
sb.append("andgender=?");
params.add(gender);
}
SQLiteDatabasedb=helper.getReadableDatabase();
String[]projection=newString[params.size()];
params.toArray(projection);
//返回值游标
Cursorcursor=db.rawQuery(sb.toString(),projection);
//判断游标是否为空,是否有一个值
while(cursor!=null&&cursor.moveToNext()){
//getColumnIndex获取列的下标cursor.getXXXX()获取指定列的值
Stringname=cursor.getString(cursor.getColumnIndex("name"));
Integerid=cursor.getInt(cursor.getColumnIndex("_id"));
}
}
用不到的参数就让它为空吧 遍历数据就while循环就好咯
Cursorc=db.query("student",null,null,null,null,null,null);//查询并获得游标
更新
privatevoidupdate(){
StringBuffersb=newStringBuffer("updatestudentset");
Listparams=newArrayList();
if(!TextUtils.isEmpty(phone)){
sb.append("phone=?,");
params.add(phone);
}
if(!TextUtils.isEmpty(name)){
sb.append("name=?,");
params.add(name);
}
if(!TextUtils.isEmpty(gender)){
sb.append("gender=?,");
params.add(gender);
}
if(params.size()!=0){
//更新操作拼接字符串末尾有一个","需要去除
//删除最后一位的“,”
sb.setLength(sb.length()-1);
sb.append("where1=1");
//通过id指定更新那行数据
if(!TextUtils.isEmpty(id)){
sb.append("and_id=?");
params.add(id);
}else{
Toast.makeText(this,"请填写id",Toast.LENGTH_SHORT).show();
return;
}
SQLiteDatabasedb=helper.getWritableDatabase();
Object[]o=newObject[params.size()];
params.toArray(o);//将数据存放到指定的数组中
db.execSQL(sb.toString(),o);
}
}
ContentValuescv=newContentValues();//实例化ContentValues
cv.put("name","123");//添加要更改的字段及内容
StringwhereClause="phone=?";//修改条件
String[]whereArgs={"12312313213"};//修改条件的参数
db.update("student",cv,whereClause,whereArgs);//执行修改
删除
privatevoiddelete(){
getAllText();
//拼接sql语句
StringBuffersb=newStringBuffer("deletefromstudentwhere1=1");
//保存参数的list
Listparams=newArrayList();
//判断条件动态拼接
if(!TextUtils.isEmpty(id)){
sb.append("and_id=?");
params.add(id);
}
if(!TextUtils.isEmpty(phone)){
sb.append("andphone=?");
params.add(phone);
}
if(!TextUtils.isEmpty(name)){
sb.append("andname=?");
params.add(name);
}
if(!TextUtils.isEmpty(gender)){
sb.append("andgender=?");
params.add(gender);
}
SQLiteDatabasedb=helper.getWritableDatabase();
if(params.size()!=0){
Object[]o=newObject[params.size()];
params.toArray(o);//将数据存放到指定的数组中
//执行删除
db.execSQL(sb.toString(),o);
}else{
db.execSQL(sb.toString());
}
Toast.makeText(this,"删除完成",Toast.LENGTH_SHORT).show();
}
StringwhereClause="name=?";//删除的条件
String[]whereArgs={"123"};//删除的条件参数
db.delete("student",whereClause,whereArgs);//执行删除
增加
privatevoidinsert(){//保存数据到object数组
Object[]o=newObject[]{name,phone,gender};
//获取数据库操作对象
SQLiteDatabasedb=helper.getWritableDatabase();
//sql:sql语句bingArgs:参数数组
db.execSQL("insertintostudentvalues(null,?,?,?)",o);
//关闭连接
db.close();
Toast.makeText(this,"增加成功",Toast.LENGTH_SHORT).show();
}
ContentValuescv=newContentValues();//实例化一个ContentValues用来装载待插入的数据
cv.put("name","123");
db.insert("student",null,cv);//执行插入操作
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持毛票票!