当前位置: 移动技术网 > 移动技术>移动开发>Android > android SQLite数据库总结

android SQLite数据库总结

2019年07月24日  | 移动技术网移动技术  | 我要评论
sqlite sqlite是一种超轻量级的嵌入式数据库,大小只有几百kb,但是其语法支持标准sql语法,同时还遵循了数据库的acid事务,所以学过其他数据库的开发人员都很

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);//执行插入操作

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持移动技术网!

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

相关文章:

验证码:
移动技术网