DB注释相关
Studio 导入
compile 'org.xutils:xutils:3.3.32'
1.加注了@Table的实体类将被映射到sqlite中的数据库表,@Table注解有属性name和onCreated两个属性,name属性决定了该实体类映射的数据库表名,而onCreated属性则可以用来添加表一级的属性或约束,例如创建联和唯一索引等
2.加注了@Column的实体类属性将会映射到sqlite数据库中的字段,@Column注解有name、property、isId、autoGen属性,name属性决定了实体类属性对应的数据库字段名;property属性可以用来添加数据库中字段一级的属性或约束条件例如not null,索引等;isId属性表示该字段是否是主键,默认为false;autoGen则表示如果一个字段为主键,是否自增长,默认为true,所以该字段只有在isId属性为true时有效.
3.未加注@Column注解的字段将不映射sqlite字段
通过XUti.getDaoConfig()方法,我们能够获取到一个DaoConfig对象。通过getDaoConfig()方法,我们可以知道这个方法主要可以做以下事情:
1.setDbName 设置数据库的名称
2.setDbDir 设置数据库存放的路径
3.setDbVersion 设置数据库的版本
4.setAllowTransaction(true) 设置允许开启事务
5.setDbUpgradeListener 设置一个版本升级的监听方法
那么具体我们什么时候创建的表呢?如果我们单纯的调用XUti.getDaoConfig()方法是不能够创建PersonTable这个实体对应的person这张表的,那么如何创建表呢?
只需要一下几步:
1.DaoConfig daoConfig=XUtil.getDaoConfig();
2.DbManager db = x.getDb(daoConfig);
3.只有在对表进行操作时,如果没有表则创建,有表则直接引用。
DbManager.DaoConfig daoConfig=new DbManager.DaoConfig() .setDbName("my.db") .setDbVersion(1) .setDbUpgradeListener(new DbManager.DbUpgradeListener() { @Override public void onUpgrade(DbManager db, int oldVersion, int newVersion) { } }) .setDbOpenListener(new DbManager.DbOpenListener() { @Override public void onDbOpened(DbManager db) { db.getDatabase().enableWriteAheadLogging(); } }) .setDbDir(new File("/sdcard/download/")) .setAllowTransaction(true) .setTableCreateListener(new DbManager.TableCreateListener() { @Override public void onTableCreated(DbManager db, TableEntity<?> table) { //db.getDatabase(). } }); String n=""; DbManager db=x.getDb(daoConfig);
增:
1.db.save(entity);//保存成功之后【不会】对user的主键进行赋值绑定
2.db.saveOrUpdate(entity);//如果一个对象主键为null则会新增该对象,成功之后【会】对user的主键进行赋值绑定,否则根据主键去查找更新
3.db.saveBindingId(entity);//保存成功之后【会】对user的主键进行赋值绑定,并返回保存是否成功
如:
DbManager db=x.getDb(daoConfig); MyXb myxb1=new MyXb(); myxb1.setName("huangyu"); myxb1.setAdress("626"); db.save(myxb1); n+=myxb1.getId()+"\n"; MyXb myxb2=new MyXb(); myxb2.setName("zengxuefeng"); myxb2.setAdress("625"); db.saveBindingId(myxb2); n+=myxb2.getId()+"\n"; MyXb myxb3=new MyXb(); myxb3.setName("wuyulun"); myxb2.setAdress("624"); db.saveOrUpdate(myxb3); n+=myxb3.getId()+"\n";
输出结果
即原始对象存储在数据库中后,由数据库自己产生的id值(主键)赋予或不赋予原对象中的id(主键),save不赋予,saveOrUpdate和saveBindingId赋予原对象。
查:
1.findById的使用 :该方法主要是通过主键的值来进行查找表里面的数据
用法:(DbManager).findById(类名,主键值);
如:
DbManager db=x.getDb(daoConfig); try { MyXb ed=db.findById(MyXb.class,1); n+=ed; text.setText(n); } catch (DbException e) { e.printStackTrace(); }
2.findFirst的使用: 该方法主要是返回当前表里面的第一条数据
FindAll的使用: 该方法主要是返回当前表里面的全部数据(List形式)
用法:引用=(DbManager).findFirst(类名);
List<类名> 引用=(DbManager).findAll(类名);
如:
DbManager db=x.getDb(daoConfig); try { MyXb ed=db.findFirst(MyXb.class); n+=ed; text.setText(n); } catch (DbException e) { e.printStackTrace(); }
3.selector的使用:用于特定条件的查找
用法:(DbManager).selector(类名).where(条件).and(条件)
DbManager db=x.getDb(daoConfig); try { MyXb ed=db.selector(MyXb.class) .where("id", ">", 1) .findFirst(); n+=ed; text.setText(n); } catch (DbException e) { e.printStackTrace(); }
5.findDbModelFirst、findDbModelAll的使用
返回符合条件的DbModel
DbModell本质就是一个key为当前表的字段,value为当前某条记录的值的一个HashMap
DbManager db=x.getDb(daoConfig); try { DbModel ed=db.findDbModelFirst (new SqlInfo("select * from MyXb")); n+=ed.getString("id"); text.setText(n); } catch (DbException e) { e.printStackTrace(); }
注:SqlInfo:可以理解Sql语句,构造函数中传入String(Sql语句)(详见下补充)
改:
修改一共有2种方法:
第一种:
需求:我们把上面的id为1的这条记录的age修改为25岁
private void update() {
try{
PersonTable person = db.findById(PersonTable.class, 1);
person.setAge(25);
db.update(person, "age");
}catch(Exception e){
e.printStackTrace();
}
}
通过方法,我们知道首先要通过DBManager通过查找的方法先找到id为1的这个实体bean,如果你对里面的哪个字段需要修改,只需要重新set这个属性的值,然后调用DBManager.update方法,第一个参数是需要修改的实体,第二个参数是对应的属性。
第二种:
需求:将person表中性别为man的工资salary都变成6000。
private void update() {
try {
List<PersonTable> persons = db.findAll(PersonTable.class);
for(PersonTable person:persons){
person.setSalary(6000);
db.update(person,WhereBuilder.b("sex", "=", "man"),"salary");
}
} catch (Exception e) {
e.printStackTrace();
}
}
修改数据一共就2种方法,基本都是需要一个实体bean对象去进行操作的,上面的第二种方法无非就是在修改数据时,多了一个限制条件,这样修改数据显得灵活一些。
上面第二种update的方法的参数简单介绍一下:
第一个参数:实体bean对象
第二个参数:一个WhereBuilder对象,主要是通过静态b方法去构造一个where条件语句
第三个参数:需要修改的字段名,如果你的需求是修改了2个或者更多个字段,只需要在后面加上相应的参数即可,例如第二种方法我不止修改salary还需要修改age统一为40岁,参考如下;
private void update() {
try {
List<PersonTable> persons = db.findAll(PersonTable.class);
for(PersonTable person:persons){
person.setSalary(6000);
person.setAge(40);
db.update(person,WhereBuilder.b("sex", "=", "man"),"salary","age");
}
} catch (Exception e) {
e.printStackTrace();
}
}
删:
删除操作
当前数据库中的person表的效果如下:
1.deleteById的用法
该方法主要是根据表的主键进行单条记录的删除
需求:删除上方person表中id为5的记录
private void delete() {
try {
db.deleteById(PersonTable.class, 5);
} catch (DbException e) {
e.printStackTrace();
}
}
结果如下:
2.delete(Object entity)的用法
该方法主要是根据实体bean进行对表里面的一条或多条数据进行删除
需求:删除name为骆驼这条信息的记录
private void delete() {
try {
PersonTable person =db.selector(PersonTable.class).where("name", "=", "骆驼").findFirst();
db.delete(person);
} catch (DbException e) {
e.printStackTrace();
}
}
3.delete(Class<?> entityType)
该方法主要是用来删除表格里面的所有数据,但是注意:表还会存在,只是表里面数据没有了
private void delete() {
try {
db.delete(PersonTable.class);
} catch (DbException e) {
e.printStackTrace();
}
}
4.delete(Class<?> entityType,WhereBuilder whereBuilder)
该方法主要是根据where语句的条件进行删除操作
需求:将person表总sex为woman并且salary为5000的信息删除
private void delete() {
try {
db.delete(PersonTable.class, WhereBuilder.b("sex","=", "woman").and("salary", "=","5000"));
} catch (DbException e) {
e.printStackTrace();
}
}
5.dropTable(Class<?> entityType)
该方法是用来删除表
private void delete() {
try {
db.dropTable(PersonTable.class);
} catch (DbException e) {
e.printStackTrace();
}
}
6.dropDb()
该方法是用来删除数据库
db.dropDb();
其他方法
1.addColumn(Class<> entityType,String column) 增加列
2.SqlInfo
这个类的结构很简单,包含两个成员变量,sql和bindArgs。SqlInfo用来表示执行实际操作时的sql语句对象,sqlBuilder是对其进行组装的工具类,仍然以上述的Parent类举例,当用户执行对一个Parent对象的插入操作时:
可以看到sql表示执行的含有通配符的sql语句,该sql语句由sqlBuilder组装完成。bindArgs是一个ArrayList,bindArgs是可以单体sql语句中通配符的参数列表,该列表是个KeyValue组成的list,整体的结构如下图
bindArgs中的keyValueList由12个对象组成,其中包括5个有效对象和7个空对象
查看这个List每项的内容,可以发现如下
这个BindArgs正式我们要绑定的数据的kv值,sqlBuilder通过把这个list组装成sql的参数,替代通配符形成最终的插入语句。