欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

android SQLite数据库总结

程序员文章站 2024-02-19 19:20:16
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);//执行插入操作

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