android SQLite数据库总结
sqlite
sqlite是一种超轻量级的嵌入式数据库,大小只有几百kb,但是其语法支持标准sql语法,同时还遵循了数据库的acid事务,所以学过其他数据库的开发人员都很容易掌握其使用。
sql语法就不介绍了,直接看在android中的使用
sqliteopenhelper——封装好的数据库操作辅助类,需重写
重写方法
oncreate:初始化数据库,创建表,添加初始数据
onupgrade:数据库版本升级时的数据库操作,如备份删除数据库等
常用方法
getreadabledatabase() 获取sqlitedatabase对象,操作数据库
getwritabledatabase() 获取sqlitedatabase对象,操作数据库
区别:在磁盘空间满或不可写时,1方法将获得只读的数据库对象,而2方法会报错,在正常情况下,获取到的都是可读写的数据库对象。
import android.content.context; import android.database.sqlite.sqlitedatabase; import android.database.sqlite.sqliteopenhelper; public class dbhelper extends sqliteopenhelper { private static final string name="my";//数据库名 private static final int version=1;//版本号 //重写构造方法的时候选择参数少的一项 public dbhelper(context context) { //1:上下文 2:数据库名称 3:游标创建工厂 4:数据库版本 版本只能是整数 1 2 3.. super(context, name, null, version); } //数据库的初始化 sqlitedatabase数据库操作对象 //一般只在第一次运行和版本更新的时候调用 @override public void oncreate(sqlitedatabase db) { //创建数据库 主键默认自增 db.execsql("create table student(" + "_id integer not null primary key autoincrement," + "name varchar(20)," + "phone varchar(11)," + "gender varchar(2))"); //添加一条测试数据 db.execsql("insert into student values(null,?,?,?)" ,new object[]{"小黑","12345678901","男"}); } /** * 在版本升级的时候调用 * 修改version 为2 表示版本升级 就会调用这个方法 * @param db 数据库操作对象 * @param oldversion 旧版本号 * @param newversion 新版本号 */ @override public void onupgrade(sqlitedatabase db, int oldversion, int newversion) { } }
在android数据库的创建是需要创建对象才能创建的
在activity类中创建出一个数据库类对象
创建好数据对象就可以操作数据了 通过sqlitedatabase获取 两种获取方法的区别上面已经提到过了
//创建数据 dbhelper helper =new dbhelper(this); //调用数据操作对象 sqlitedatabase dbwrite=helper.getwritabledatabase(); sqlitedatabase dbread=helper.getreadabledatabase();
sqlitedatabase给我们提供了很多操作数据的方法
删除:(int) delete(string table,string whereclause,string[] whereargs)
table: 表名
whereclause:where条件 列名 占位符 id=?
whereargs:参数值数组
添加:(long) insert(string table,string nullcolumnhack,contentvalues values)
nullcolumnhack:为空列
contentvalues values:通过键值对存储添加的数据 key为列 value为值
insert方法 底层是通过拼接字符串的方式 如果contentvalues是空的 拼接成的sql语句无法执行会报错 所以给一个可以为空的列当contentvalues为空时也可以执行 有兴趣的可以看一下源码
更新:(int) update(string table, contentvalues values, string whereclause, string[] whereargs)
参数意思同上
查询:(cursor) query(boolean distinct,string table, string[] columns, string selection, string[] selectionargs, string groupby, string having, string orderby, string limit)
返回值是一个游标 这个query参数较多 简单的查询就还是写一条sql语句简单点
boolean distinct 去重复
string table 表名
string[] columns要查询的列
string selection查询条件
string[] selectionargs查询参数值
string groupby分组
string having分组条件
string orderby排序
string limit分页查询限制
关闭数据库:(void) close()
执行一条sql语句:(void) execsql(string sql) 增删改查
查询查询sql:(cursor) rawquery(string sql, string[] selectionargs)
事务
try { db.begintransaction();//开启事务 // db.update(); // db.insert(); db.settransactionsuccessful(); //没有设置事物成功 finally就会回滚 } catch (exception e) { e.printstacktrace(); }finally { db.endtransaction(); }
贴代码咯 执行sql语句 和封装好的方法
查询
private void query() { stringbuffer sb=new stringbuffer("select * from student where 1=1"); //参数集合 list<string> params=new arraylist<>(); if(!textutils.isempty(id)){ sb.append(" and _id=?"); params.add(id); } if(!textutils.isempty(phone)){ sb.append(" and phone=?"); params.add(phone); } if(!textutils.isempty(name)){ sb.append(" and name=?"); params.add(name); } if(!textutils.isempty(gender)){ sb.append(" and gender=?"); params.add(gender); } sqlitedatabase db=helper.getreadabledatabase(); string [] projection=new string [params.size()]; params.toarray(projection); //返回值 游标 cursor cursor=db.rawquery(sb.tostring(),projection); //判断游标是否为空,是否有一个值 while(cursor!=null&&cursor.movetonext()){ // getcolumnindex获取列的下标 cursor.getxxxx()获取指定列的值 string name=cursor.getstring(cursor.getcolumnindex("name")); integer id=cursor.getint(cursor.getcolumnindex("_id")); } }
用不到的参数就让它为空吧 遍历数据就while循环就好咯
cursor c = db.query("student",null,null,null,null,null,null);//查询并获得游标
更新
private void update() { stringbuffer sb=new stringbuffer("update student set "); list params=new arraylist(); 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(" where 1=1"); //通过id指定 更新那行数据 if(!textutils.isempty(id)){ sb.append(" and _id=?"); params.add(id); }else{ toast.maketext(this,"请填写id",toast.length_short).show(); return; } sqlitedatabase db=helper.getwritabledatabase(); object [] o=new object[params.size()]; params.toarray(o);//将数据存放到指定的数组中 db.execsql(sb.tostring(),o); } }
contentvalues cv = new contentvalues();//实例化contentvalues cv.put("name","123");//添加要更改的字段及内容 string whereclause = "phone=?";//修改条件 string[] whereargs = {"12312313213"};//修改条件的参数 db.update("student",cv,whereclause,whereargs);//执行修改
删除
private void delete() { getalltext(); //拼接sql语句 stringbuffer sb=new stringbuffer("delete from student where 1=1"); //保存参数的list list params=new arraylist(); //判断条件 动态拼接 if(!textutils.isempty(id)){ sb.append(" and _id=?"); params.add(id); } if(!textutils.isempty(phone)){ sb.append(" and phone=?"); params.add(phone); } if(!textutils.isempty(name)){ sb.append(" and name=?"); params.add(name); } if(!textutils.isempty(gender)){ sb.append(" and gender=?"); params.add(gender); } sqlitedatabase db=helper.getwritabledatabase(); if (params.size()!=0){ object [] o=new object[params.size()]; params.toarray(o);//将数据存放到指定的数组中 //执行删除 db.execsql(sb.tostring(),o); }else{ db.execsql(sb.tostring()); } toast.maketext(this,"删除完成",toast.length_short).show(); }
string whereclause = "name=?";//删除的条件 string[] whereargs = {"123"};//删除的条件参数 db.delete("student",whereclause,whereargs);//执行删除
增加
private void insert() {//保存数据到object数组 object [] o=new object[]{name,phone,gender}; //获取数据库操作对象 sqlitedatabase db=helper.getwritabledatabase(); //sql:sql语句 bingargs:参数数组 db.execsql("insert into student values(null,?,?,?)",o); //关闭连接 db.close(); toast.maketext(this,"增加成功",toast.length_short).show(); }
contentvalues cv = new contentvalues();//实例化一个contentvalues用来装载待插入的数据 cv.put("name","123"); db.insert("student",null,cv);//执行插入操作
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
下一篇: Android 中不用线程如何实现倒计时