GreenDao实例及一些问题

来源:互联网 发布:c语言char字符串 编辑:程序博客网 时间:2024/05/22 15:11

最近在用GreenDao,做了一个小Demo,其中遇到了一些大多数人都会遇到的问题,也有一些坑。

记录下来,并传到github上,方便大家学习并跳坑。

现在的github当前版本有个未解的空指针问题,希望有人遇到的时候解决之后能告知为什么。

初学者总会遇到一些坑,有时候灵光一现就想明白了问题出在哪,有时候好几天也想不明白。

希望能共同进步,共同分享。

应用GreenDao的方式网上有很多帖子的,这里就不赘述了。

先将注释的一些意义写下来

1.)实体@Entity注解

schema:告知GreenDao当前实体属于哪个schema
active:标记一个实体处于活动状态,活动实体有更新、删除和刷新方法
nameInDb:在数据中使用的别名,默认使用的是实体的类名
indexes:定义索引,可以跨越多个列
createInDb:标记创建数据库表**

2.)基础属性注解

@Id :主键 Long型,可以通过@Id(autoincrement = true)设置自增长
@Property:设置一个非默认关系映射所对应的列名,默认是的使用字段名举例:@Property (nameInDb="name")
@NotNul:设置数据库表当前列不能为空
@Transient:添加次标记之后不会生成数据库表的列

3.)索引注解

@Index:使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束
@Unique:向数据库列添加了一个唯一的约束

4.)关系注解

@ToOne:定义与另一个实体(一个实体对象)的关系
@ToMany:定义与多个实体对象的关系

(一) @Entity 定义实体
@nameInDb 在数据库中的名字,如不写则为实体中类名
@indexes 索引
@createInDb 是否创建表,默认为true,false时不创建
@schema 指定架构名称为实体
@active 无论是更新生成都刷新
(二) @Id
(三) @NotNull 不为null
(四) @Unique 唯一约束
(五) @ToMany 一对多
(六) @OrderBy 排序
(七) @ToOne 一对一
(八) @Transient 不存储在数据库中
(九) @generated 由greendao产生的构造函数或方法


下面看一下自己的类的三种模式

第一种,简单自定义类

@Entitypublic class User {    @Id(autoincrement = true)    private Long id;    private String name;    private String age;    private String sex;    private String salary;
这是最简单的自定义类,这样写完直接就可以生成Dao文件


第二种   包含子类的自定义类

父类@Entitypublic class Student {    @Id(autoincrement = true)    private Long id;    private String name;    private String age;    private String sex;    private String salary;    private Long bookId;    @ToOne(joinProperty = "bookId")    private Books booklist;

子类@Entitypublic class Books{    @Id    private Long id;    private String bookname;    private String bookprice;

需要用@ToOne注释来声明父类和子类的对应关系


   第三种   包含List<X>子类的自定义类

  

父类@Entity(        active = true,        nameInDb = "CLIENTS")public class Client {    @Id(autoincrement = true)    private long id;    @NotNull    private String nom;    @NotNull    private String prenom;    @ToMany(referencedJoinProperty = "clientId")    private List<Commande> listeCommandes;

子类@Entity(        active = true,        nameInDb = "COMMANDES")public class Commande {    @Id(autoincrement = true)    private long id;    @NotNull    private String libelle;    @NotNull    private long clientId;    @NotNull    @ToOne(joinProperty = "clientId")    private Client client;

需要分别声明子类和父类的一对多和多对多的对应关系


其他问题详情,可以看github上的案例,地址https://github.com/beibeiMary/GreenDaoDemo.git

但现在案例中有个问题,希望有遇到过,或者解决过的朋友们留个言,寻求解决办法

dao =BaseApplication.getApplication().getDaoSession().getUserDao();

上面这句代码中的getDaoSession()方法为空指针,也就是

    private void setDatabase() {        mHelper = new DaoMaster.DevOpenHelper(this,"users-db", null);        db =mHelper.getWritableDatabase();        // 注意:该数据库连接属于DaoMaster,所以多个 Session 指的是相同的数据库连接。        mDaoMaster = new DaoMaster(db);        mDaoSession = mDaoMaster.newSession();        Log.e("zhsy","mDaoSession=="+mDaoSession);    }

mDaoSession = mDaoMaster.newSession();
这句获取为空指针。求解决办法
报错信息如下。

BaseApplication.getDaoSession()' on a null object reference   

欢迎留言,后续会继续寻找该问题的解决方案。

原创粉丝点击