作为一个Android开发的小白,刚完成了一个不一样的项目。在以往的项目中都是通过请求上传和获取数据,但前段时间的项目由于考虑到在没有网络的恶劣情况下也要保证功能的正常使用,所以采用了数据先本地存储,当有网络之后再和后台数据同步。
那么问题就来了。以前的开发中数据库逻辑都是在后台,所以,我并不关心数据库中表的关联和逻辑,只知道后台需要什么数据我就穿什么,我想要什么数据后台就给我什么。现在这些都不用了,考验数据库操作能力的时候到了。经过一段时间的摸索,总算有了一些小的体会,现在做个记录。
数据库操作都是基于xutils框架的。
第一步当然就是建立数据库了:
DaoConfig config = new DaoConfig(context);
config.setDbName("xUtils-demo"); //db名
config.setDbVersion(1); //db版本
DbUtils db = DbUtils.create(config);//db还有其他的一些构造方法,比如含有更新表版本的监听器的
或者直接用 DbUtils db = DbUtils.create("xx.db");
建好数据库之后就是建表了:
关于表的建立,有用到
@Check check约束
@Column 列名
@Finder 一对多、多对一、多对多关系(见sample的Parent、Child中的使用)
@Foreign 外键
@Id 主键,当为int类型时,默认自增。 非自增时,需要设置id的值
@NoAutoIncrement 不自增
@NotNull 不为空
@Table 表名
@Transient 不写入数据库表结构
@Unique 唯一约束
例:
@Table(name="user")
class User{
@Column(column="ID")
private int id; //当存在整型的变量id或_id时不用特意声明主键,否则需要@Id注明
@Column(column="Name") //声明一个字段
private String name;
@Column(column="Sex")
private String sex;
@Foreign(column="State",foreign="ID")//声明一个外键
private State state;
@Transient //不写入表结构
private int age;
}
class State{
@Id(column="ID") @NoAutoIncrement//声明一个String类型的主键,并设定不自增
private String id;
@Column(column="Job")
private String job;
}
@Finder 还不清楚用法,希望用过的人多多指教
库和表建好之后就是对表的操作了:
1,查询
1-1,通过类查询
User user = db.findFirst(User.class); //查询表user中的第一条数据
List<User> list = db.findAll(User.class); //查询表user中的所有数据
1-2,条件查询
List<User> list = db.findAll(Selector.from(User.class).Where("字段 ","判断","条件"));
例:List<User> list = db.findAll(Selector.from(User.class).Where("Name","=","张三"));
User user = db.findByid(User.class,1);//通过id查找
List<User> list = db.findAll(Selector.from(User.class).Where("Name","=","张三").and(Where.b("Sex","=","男"))); //多条件查询
List<User> list = db.findAll(Selector.from(User.class).Where("Name","in",String[]));//在什么之中查询符合条件的,最后一个参数可以是数组或集合
List<User> list = db.findAll(Selector.from(User.class).Where("Name","in",String[]).or("ID","<",3));//复杂的条件查询,其他查询一次类推
1-3,排序
List<User> list = db.findAll(Selector.from(User.class).orderBy("字段",boolean));//按某个字段进行排序,true为降序,false为升序;
例:List<User> list = db.findAll(Selector.from(User.class).orderBy("ID",true));//一id字段做一个降序排列
1-4,分组
List<DbModle> list = db.findAll(User.class).groupBy("字段").select("字段");//按某个字段分组,并保存字段的值
例:List<DbModle> list = db.findAll(User.class).groupBy("Sex").select("Sex");//表user里的数据按性别分类,并保存性别值,在使用的时候用DbModle.getString("Sex"),取出保存的数据.