版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jielundewode/article/details/72675599
目前只使用了db模块,将其他模块剔除,减小包的体积!已经修改好的包上传。下载地址,笔记基于该修改包!
1.定义vo
定义简单的一对多关系,Parent和Child。
import org.xutils.db.annotation.Column;
import org.xutils.db.annotation.Table;
import java.util.Date;
@Table(name = "parent", onCreated = "CREATE UNIQUE INDEX index_name ON parent(name,email)")
public class Parent {
@Column(name = "id", isId = true,autoGen = false)
private int id;
@Column(name = "name")
public String name;
@Column(name = "email")
private String email;
@Column(name = "isAdmin")
private boolean isAdmin;
@Column(name = "time")//可以直接保存date类型参数
private Date time;
@Column(name = "date")//可以直接保存date类型参数
private java.sql.Date date;
//setter/getter省略
public List<Child> getChildren(DbManager db) throws DbException {
return db.selector(Child.class).where("parentId", "=", this.id).findAll();
}
}
import org.xutils.db.annotation.Column;
import org.xutils.db.annotation.Table;
@Table(name = "child")
public class Child {
@Column(name = "id", isId = true)
private int id;
@Column(name = "name")
public String name;
@Column(name = "email")
private String email;
@Column(name = "parentId"/*, property = "UNIQUE"//如果是一对一加上唯一约束*/)//此处保存parentId
public long parentId;
// 这个属性被忽略,不存入数据库
public String willIgnore;
@Column(name = "text")
private String text;
//setter/getter省略
}
2.初始化数据库设置
2.1 设置数据库
DbManager.DaoConfig daoConfig = new DbManager.DaoConfig()
.setDbName("test.db")
// 不设置dbDir时, 默认存储在app的私有目录.
.setDbDir(new File("/sdcard")) // "sdcard"的写法并非最佳实践, 这里为了简单, 先这样写了.
.setDbVersion(2)
.setDbOpenListener(new DbManager.DbOpenListener() {
@Override
public void onDbOpened(DbManager db) {
// 开启WAL, 对写入加速提升巨大
db.getDatabase().enableWriteAheadLogging();
}
})
.setDbUpgradeListener(new DbManager.DbUpgradeListener() {
@Override
public void onUpgrade(DbManager db, int oldVersion, int newVersion) {
// TODO: ...
// db.addColumn(...);
// db.dropTable(...);
// ...
// or
// db.dropDb();
}
});
2.2 初始化一个数据库实例
DbManager db = DbManagerImpl.getInstance(daoConfig,getApplicationContext());
注意此处是我修改的去掉其他模块的写法,若使用原生的,用 x.getDb(daoConfig);
这个方法会缓存一个db实例,重复调用不会新建一个db实例。
3 保存实例
Parent parent = new Parent();
parent.name = "测试" + System.currentTimeMillis();
parent.setAdmin(true);
parent.setEmail("[email protected]");
parent.setTime(new Date());
parent.setDate(new java.sql.Date(new Date().getTime()));
//db.save(parent);
db.saveBindingId(parent);//保存对象关联数据库生成的id
也可以批量保存:
parentList = new ArrayList<Parent>();
for (int i = 0; i < 1000; i++) {
Parent parent = new Parent();
parent.setAdmin(true);
parent.setDate(new java.sql.Date(1234));
parent.setTime(new Date());
parent.setEmail(i + "[email protected]");
parentList.add(parent);
}
try {
db.save(parentList);
} catch (DbException ex) {
ex.printStackTrace();
}
注意不会级联保存,需要手动操作!
4 查改删
4.1 查询数据
查询所有数据:
List<Child> children = db.selector(Child.class).findAll();
按条件查找:
List<Parent> list = db.selector(Parent.class)
.where("id", "<", 54)
.and("time", ">", calendar.getTime())
.orderBy("id")
.limit(10)
.offset(10 * currPage)
.findAll();
4.2 更改数据
parent.name = "hahaha123";
parent.setEmail("[email protected]");
db.update(parent);
db.update(parent, "name", "email");
db.update(Parent.class,WhereBuilder.b("id", "=", 1).and("isAdmin", "=", true),
new KeyValue("name", "test_name"), new KeyValue("isAdmin", false));
delete类似,有4个方法重载,可以根据id删除或对象、条件删除,不在赘述!