Android:GreenDao的使用

说明:

GreenDao是一个数据表对象映射的框架,用于简化数据表的增删改查操作,将编写sql语句改为直接操作java对象,增删改查的过程操作的是对象,而不是sql语句。


一、添加依赖:

1.打开工程根目录,在build.gradle中添加classpath:

buildscript {
    ...
    dependencies {
        ...
        //greendao插件
        classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'
    }
}


2.打开工程-> app目录,在build.gradle中添加jar包依赖:

...
//应用greendao插件
apply plugin: 'org.greenrobot.greendao'

android {
    ...

    greendao {
        //设置数据库版本号
        schemaVersion 1
        //设置dao的包名,不设置默认为实体类的包名,build后会在此包下生成DaoMaster.java、DaoSession.java、实体类名Dao.java
        daoPackage 'com.yyh.im.dao'
        //设置数据库文件目录
        targetGenDir 'src/main/java/'
    }

}

dependencies {
    ...
    //greendao依赖的jar包
    compile 'org.greenrobot:greendao:+'
    compile 'org.greenrobot:greendao-generator:+'
}

二、定义实体类(每一个实体类对应一张表,build后自动生成对应dao类):

1.注解说明:

(1)类注解说明:
@Entity:表示此实体类为数据表(有一些属性放在@Entity()中,多个时以,分隔):
nameInDb:指定表的名称,为空则用类名作表名
使用:@Entity(nameInDb="表名")

createInDb:默认为true,是否创建表
使用:@Entity(createInDb = true)

schema,默认为default,设置当前实体属于哪个schema
使用:@Entity(schema = "schema值")

active:默认为false,是否生成更新/删除/刷新方法,当实体类中有ToMany和ToOne的时,这个值无效,都会产生这3个方法
使用:@Entity(active = true)

(2)成员变量注解说明:
@Id:表示此变量为表主键,autoincrement表示主键自增
使用:
@Id(autoincrement = true)
private Long 变量名;

@NotNull:表示此变量值不能为null
使用:
@NotNull
private String 变量名;

@Unique:表示此变量值唯一
使用:
@Unique
private String 变量名;

@Index:表示索引
使用:
@Index(unique = true)
private long 变量名;

@OrderBy:表示此变量列表结果进行排序
使用:
@OrderBy(value = "ASC")
private String 变量名;

一对一,A表需要保存B表的id值时,只在A类中加入@ToOne:
public class A {
    ...
    private long bId;  //此id值用于链接B表的id值,命名随意
    @ToOne(joinProperty = "bId")   //bId为上面定义的值
    private B b;    //保存着B对象
}
类B:
public class B {
    ...
}

一对多,A表需要保存B表的id值时,在A类中加入@ToOne,并在B类加入ToMany:
public class A {
    ...
    private long bId;  //此id值用于链接B表的id值,命名随意
    @ToOne(joinProperty = "bId")   //bId为上面定义的值
    private B b;  //保存着B对象
}
类B:
public class B {
    ...
    @ToMany(referencedJoinProperty = "bId")  //引用A类中定义的bId
    private List<A> as;  //保存着A对象列表
}

多对多,A表需要保存B表的id值时,在A类中加入@ToOne,并在B类加入ToMany:
public class A {
    ...
    @ToMany
    @JoinEntity(
            entity = AAndB.class,
            sourceProperty = "aId",   //aId为中间类中的aId
            targetProperty = "bId"    //bId为中间类中的bId
    )
    private List<B> b;
}
类B:
public class B {
    ...
    @ToMany
    @JoinEntity(
            entity = AAndB.class,
            sourceProperty = "bId",   //bId为中间类中的aId
            targetProperty = "aId"    //aId为中间类中的bId
    )
    private List<A> a;
}
中间类AAndB:
public class B {
    ...
    private Long aId;  //aId为A表的id
    private Long bId;  //bId为B表的id
}

@Transient:忽略属性,不在表中创建此字段,使用:
@Transient
private String 变量名;

@Property:设置列名,不设时以变量名作为列名
使用:
@Property(nameInDb = "列名")
private String 变量名;

@generated:build时自动产生的

2.定义实体类(展示各字段,以及示例一对一、一对多、多对多):

Adress.java类定义(与User一对一):

@Entity(nameInDb = "ADRESS")
public class Adress {
    @NotNull
    @Unique
    @Id
    private Long id;

    private String name;

}


Department.java定义(与User一对多):

@Entity(nameInDb = "DEPARTMENT")
public class Department {
    @NotNull
    @Unique
    @Id
    private Long id;

    @NotNull
    private String name;

    /**
     * departmentId为用户对象中的字段,实现一对多(部门为一,用户为多)
     */
    @ToMany(referencedJoinProperty = "departmentId")
    private List<User> users;

}

Job.java类定义(与User多对多):

@Entity(nameInDb = "JOB")
public class Job {
    @NotNull
    @Unique
    @Id
    private Long id;

    @NotNull
    @Property(nameInDb = "NAME")
    private String name;

    /**
     * Job和User多对多
     */
    @ToMany
    @JoinEntity(
            entity = UserAndJob.class,
            sourceProperty = "jobId",
            targetProperty = "userId"
    )
    private List<User> users;

}


User.java定义(与Adress、Department、Job形成了一对一、多对一、多对多):
@Entity(nameInDb = "USER")
public class User {
    @NotNull
    @Unique
    @Id
    private Long id;

    @NotNull
    @Property(nameInDb = "NAME")
    private String name;

    private long adressId;

    /**
     * 一对一,用adressId关联Adress
     */
    @ToOne(joinProperty = "adressId")
    private Adress adress;

    /**
     * 部门id
     */
    private long departmentId;

    /**
     * User和Department多对一
     */
    @ToOne(joinProperty = "departmentId")
    private Department department;

    /**
     * User和Job多对多
     */
    @ToMany
    @JoinEntity(
            entity = UserAndJob.class,
            sourceProperty = "userId",
            targetProperty = "jobId"
    )
    private List<Job> sheep;

    @Transient
    private int temp;

}

关联User和Job的中间类UserAndJob.java:

@Entity(nameInDb = "USER_JOB")
public class UserAndJob {
    @NotNull
    @Unique
    @Id(autoincrement = true)
    private Long id;

    private Long userId;

    private Long jobId;

}


三、增加改查操作:

1.Dao管理类:

/**
 * Dao管理类
 */
public class DaoManager {
    private static final String DB_NAME = "db";
    private static DaoManager instance;
    private DaoMaster.DevOpenHelper mDBOpenHelper;

    public static DaoManager getInstance(Context context) {
        if (instance == null) {
            synchronized (DaoManager.class) {
                if (instance == null) {
                    instance = new DaoManager(context);
                }
            }
        }
        return instance;
    }

    private DaoManager(Context context) {
        //创建DatabaseOpenHelper实例
        mDBOpenHelper = new DaoMaster.DevOpenHelper(context, DB_NAME, null);
    }

    /**
     * 读数据时使用的DaoSession
     */
    public DaoSession getReadableDatabase() {
        return new DaoMaster(mDBOpenHelper.getReadableDatabase()).newSession();
    }

    /**
     * 写数据时使用的DaoSession
     */
    public DaoSession getWritableDatabase() {
        return new DaoMaster(mDBOpenHelper.getWritableDatabase()).newSession();
    }

    /**
     * 关闭SQLiteDatabase
     */
    public void close() {
        if (mDBOpenHelper != null) {
            mDBOpenHelper.close();
            mDBOpenHelper = null;
        }
    }

}


2.业务类(调用Dao):

/**
 * 用户业务类
 */
public class UserBiz {
    private DaoManager mDaoManager;
    private static UserBiz instance;

    private UserBiz(Context context) {
        mDaoManager = DaoManager.getInstance(context);
    }

    public static UserBiz getInstance(Context context) {
        if (instance == null) {
            instance = new UserBiz(context);
        }
        return instance;
    }

    /**
     * 批量更新/插入
     *
     * @param users 用户列表
     */
    public void insertOrUpdate(List<User> users) {
        mDaoManager.getReadableDatabase().getUserDao().insertOrReplaceInTx(users);
    }

    /**
     * 更新/插入
     *
     * @param user 用户信息
     */
    public void insertOrUpdate(User user) {
        mDaoManager.getReadableDatabase().getUserDao().insertOrReplaceInTx(user);
    }

    /**
     * 查询所有用户
     *
     * @return 用户列表
     */
    public List<User> findAll() {
        return mDaoManager.getReadableDatabase().getUserDao().loadAll();
    }

    /**
     * 根据id查询用户
     *
     * @param id 用户id
     */
    public User findById(String id) {
        UserDao dao = mDaoManager.getReadableDatabase().getUserDao();
        return dao.queryBuilder().where(UserDao.Properties.Id.eq(id)).unique();
    }

    /**
     * 根据用户名模糊查找用户
     *
     * @param name 用户名
     * @return
     */
    public List<User> search(String name) {
        UserDao dao = mDaoManager.getReadableDatabase().getUserDao();
        return dao.queryBuilder().where(UserDao.Properties.Name.like("%" + name + "%")).list();
    }

    /**
     * 删除用户
     *
     * @param id 用户id
     */
    public void delete(long id) {
        UserDao dao = mDaoManager.getReadableDatabase().getUserDao();
        dao.queryBuilder().where(UserDao.Properties.Id.eq(id)).buildDelete().executeDeleteWithoutDetachingEntities();
    }

}







猜你喜欢

转载自blog.csdn.net/a526001650a/article/details/78675245