概述
在使用Greendao操作数据库时,对于主键的定义不是很明确,正常我们在使用数据库时会有大概三种情况下的主键定义
ID主键
如题,就是使用id值作为主键,这个也是greendao内部默认的
@Id(autoincrement = true)
private Long id;
这里有个坑,一定要提醒一下,掉进去的人还挺多。
就是在定义id的数据类型时,一定要使用Long
类型,而不能使用long
简单类型。
完整代码
@Entity(nameInDb = "tb_note") // greendao解析注解,描述中指定表名称
public class NoteEntity implements Serializable {
private static final long serialVersionUID = 6049457346549266619L;
@Id(autoincrement = true)
private Long id;
private String note_desc;
}
唯一值主键
这个貌似有点费话,其实是说我们需要一个主键,但不是id,主键本身都是唯一的。
直接上实例了,通过唯一索引的形式定义主键
@Index(unique = true) // 定义唯一约束索引,当作主键使用
private String note_no;
完整代码
@Entity(nameInDb = "tb_note") // greendao解析注解,描述中指定表名称
public class NoteEntity implements Serializable {
private static final long serialVersionUID = 6049457346549266619L;
@Id(autoincrement = true) // 始终保留一个自增长字段当作默认主键
private Long id;
@Index(unique = true) // 定义唯一约束索引,当作主键使用
private String note_no;
private String note_desc;
}
复合主键
这个在我们使用关系型数据库时使用的并不少,但在greendao里面却没有这样的安排,没搞懂为什么,那就只能自己想办法解决了
基本思想和上面一样,所以借助indexes
的unique
唯一索引来当作复合主键
建议还是要定义一个自增长的主键id,只是使用时不去管它,如果需要则传入null值即可。毕竟greendao内部源码里很多还是依托于这个id主键的。
另外就是,插入数据时使用insertOrReplace()
方法即可,如果定义的复合主键存在则会替换原有数据。
@Entity(nameInDb = "tb_todo", indexes = {
@Index(value = "todo_no ASC, todo_ser ASC", unique = true) // 定义组合主键
})
public class ToDoEntity implements Serializable {
private static final long serialVersionUID = 808736119697275862L;
@Id(autoincrement = true) // 始终保留一个自增长字段当作默认主键
private Long id;
private String todo_no;
private Integer todo_ser;
private String todo_desc;
private Integer todo_status;
}