GreenDao的使用

项目引入

1.在 项目的根build.gradle中引入:
 repositories {
    mavenCentral()
}
dependencies {
    classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
}

2.在项目的build.gradle引入
//引入插件名
apply plugin: 'org.greenrobot.greendao'
//在android{}中引入 
greendao{
    schemaVersion 15 //数据库版本号
    daoPackage'com.laisontech.projectdb'//数据库放入的包名
    targetGenDir'src/main/java'//数据库放在哪个目录下
}
dependencies {
 implementation 'org.greenrobot:greendao:3.2.2'
implementation 'org.greenrobot:greendao-generator:3.2.2'
}

项目编码

基础字段数据库建立
1.在项目中添加使用的db包,编写一个实体类
如 Person类
@Entity
public class Person {
    @Id(autoincrement = true)
    private Long personId;
    private String name;
    private int age;
}
使用ctrl+F9,插件会自动生成以下几个类
DaoMaster用于添加表单、删除、更新表单等
DaoSession注册Dao
PersonDao操作Person数据库的增删改查
另Person类将会自动更新代码如下
@Entity
public class Person {
@Id(autoincrement = true)
private Long personId;
private String name;
private int age;
@Generated(hash = 1357244396)
public Person(Long personId, String name, int age) {
    this.personId = personId;
    this.name = name;
    this.age = age;
}
@Generated(hash = 1024547259)
public Person() {
}
public Long getPersonId() {
    return this.personId;
}
public void setPersonId(Long personId) {
    this.personId = personId;
}
public String getName() {
    return this.name;
}
public void setName(String name) {
    this.name = name;
}
public int getAge() {
    return this.age;
}
public void setAge(int age) {
    this.age = age;
}
}
//在项目中构建单例
    public class DaoManager {
private static DaoManager mInstance;
private SQLiteDatabase mDB;
private DaoSession mDaoSession;
public static DaoManager getInstance() {
    if (mInstance == null) {
        synchronized (DaoManager.class) {
            if (mInstance == null) {
                mInstance = new DaoManager();
            }
        }
    }
    return mInstance;
}
public void init(Context context, String dbName) {
    if (dbName == null || dbName.isEmpty()) {
        dbName = "default.db";
    }
    DaoMaster.DevOpenHelper dBHelper = new DaoMaster.DevOpenHelper(context, dbName, null);
    mDB = dBHelper.getWritableDatabase();
    DaoMaster mDaoMaster = new DaoMaster(mDB);
    mDaoSession = mDaoMaster.newSession();
}
public SQLiteDatabase getDB() {
    return mDB;
}
public DaoSession getDaoSession() {
    return mDaoSession;
}
}

在自己的Application中引入
DaoManager.getInstance().init(this,"xxx.db");
数据的增删改查
DaoManager.getInstance().getDaoSession().getPersonDao()获取PersonDao,进行数据的增删改查。
ToOne
一个对象对一个对象的插入
@Entity
public class One {
@Id(autoincrement = true)
private Long id;
private String name;

private Long twoId;//使用该id将其关联
@ToOne(joinProperty = "twoId")
private Two two;
}

@Entity
public class Two {
@Id
private Long id;
private String name;
}
 One one = new One();
                one.setName(etName.getText().toString() + "One");
                one.setTwoId(Long.parseLong(etAge.getText().toString()));
                DaoManager.getInstance().getDaoSession().getOneDao().insert(one);

                Two two = new Two();
                two.setId(one.getTwoId());
                two.setName(etName.getText().toString() + "Two");
                DaoManager.getInstance().getDaoSession().getTwoDao().insert(two);
通过上面代码描述即可知道,一对一的关联是需要一个外键添加,但是当删除一个One时,Two并不会被删除掉,可以先获取one中的two的key,调用two的方法就可删除。
ToMany
@Entity
public class Teacher {
    @Id(autoincrement = true)
    private Long id;
    private String name;//教师名称
    private int age;
    @ToMany(referencedJoinProperty = "tid")//每个student都会有该老师的tid
    private List<Student> students;
    /**
     * Used to resolve relations
     */
    @Generated(hash = 2040040024)
    private transient DaoSession daoSession;
    /**
     * Used for active entity operations.
     */
    @Generated(hash = 648119699)
    private transient TeacherDao myDao;

    @Generated(hash = 2041461762)
    public Teacher(Long id, String name, int age) {
        this.id = id;
        this.name = name;
        this.age = age;
    }

    @Generated(hash = 1630413260)
    public Teacher() {
    }

    public Long getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return this.age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    /**
     * To-many relationship, resolved on first access (and after reset).
     * Changes to to-many relations are not persisted, make changes to the target entity.
     */
    @Generated(hash = 439084603)
    public List<Student> getStudents() {
        if (students == null) {
            final DaoSession daoSession = this.daoSession;
            if (daoSession == null) {
                throw new DaoException("Entity is detached from DAO context");
            }
            StudentDao targetDao = daoSession.getStudentDao();
            List<Student> studentsNew = targetDao._queryTeacher_Students(id);
            synchronized (this) {
                if (students == null) {
                    students = studentsNew;
                }
            }
        }
        return students;
    }

    /**
     * Resets a to-many relationship, making the next get call to query for a fresh result.
     */
    @Generated(hash = 238993120)
    public synchronized void resetStudents() {
        students = null;
    }

    /**
     * Convenient call for {@link org.greenrobot.greendao.AbstractDao#delete(Object)}.
     * Entity must attached to an entity context.
     */
    @Generated(hash = 128553479)
    public void delete() {
        if (myDao == null) {
            throw new DaoException("Entity is detached from DAO context");
        }
        myDao.delete(this);
    }

    /**
     * Convenient call for {@link org.greenrobot.greendao.AbstractDao#refresh(Object)}.
     * Entity must attached to an entity context.
     */
    @Generated(hash = 1942392019)
    public void refresh() {
        if (myDao == null) {
            throw new DaoException("Entity is detached from DAO context");
        }
        myDao.refresh(this);
    }

    /**
     * Convenient call for {@link org.greenrobot.greendao.AbstractDao#update(Object)}.
     * Entity must attached to an entity context.
     */
    @Generated(hash = 713229351)
    public void update() {
        if (myDao == null) {
            throw new DaoException("Entity is detached from DAO context");
        }
        myDao.update(this);
    }

    /**
     * called by internal mechanisms, do not call yourself.
     */
    @Generated(hash = 1349174479)
    public void __setDaoSession(DaoSession daoSession) {
        this.daoSession = daoSession;
        myDao = daoSession != null ? daoSession.getTeacherDao() : null;
    }


    @Override
    public String toString() {
        String memberBeanListStr = "";
        if (getStudents().size() > 0) {
            for (Student memberBean : getStudents()) {
                memberBeanListStr = memberBeanListStr + memberBean.toString() + ";";
            }
        } else {
            memberBeanListStr = "null";
        }
        return "LeaderBean{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", memberBeanList=" + getStudents().toString() +
                '}';
    }
}
@Entity
public class Student {
    @Id(autoincrement = true)
    private Long id;
    private Long tid;//引用老师id同用id
    private String name;
    private int age;

    @Generated(hash = 1771707059)
    public Student(Long id, Long tid, String name, int age) {
        this.id = id;
        this.tid = tid;
        this.name = name;
        this.age = age;
    }

    @Generated(hash = 1556870573)
    public Student() {
    }

    public Long getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getTid() {
        return this.tid;
    }

    public void setTid(Long tid) {
        this.tid = tid;
    }

    public String getName() {
        return this.name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return this.age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", tid=" + tid +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
 Teacher teacher = new Teacher();
                teacher.setName(etName.getText().toString());
                teacher.setAge(Integer.parseInt(etAge.getText().toString()));
                teacherOperate.insert(teacher);//先插入老师
                List<Student> studentList = new ArrayList<>();
                for (int i = 0; i < 3; i++) {
                    Student student = new Student();
                    student.setTid(teacher.getId());//该作用是和teacher相关联 必须设置
                    student.setAge(i + 10);
                    student.setName("测试" + i);
                    studentList.add(student);
                }
                studentOperate.insert(studentList);//插入学生
一对多的道理与一对一不太一致,需要在“一”中引入学生要用的键名“tid”,
然后再学生中设置tid值。这样就会相互关联了。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值