androidAndroid 数据库

数据库GreenDao的使用、升级、以及相关常用注释说明

2018-04-04  本文已影响127人  Amy_LuLu__

文章来源:GreenDao:3.2.0用法

目录

一、使用GreenDao的流程

  1. 添加GreenDao依赖
  2. 配置greendao的generator生成文件
  3. 使用GreenDao生成bean类
    3.1 创建实体类
    3.2 生成dao文件
  4. 创建GreenDaoManager来进行统一管理,并初始化
    4.1 创建GreenDaoManager
    4.2 在Application中进行初始化GreenDao
  5. 使用GreenDao来进行数据操作CRUD

二、GreenDao升级
三、GreenDao注释

一、使用GreenDao的流程

1.添加GreenDao依赖

GreenDao github地址

// In your root build.gradle file:
buildscript {
    repositories {
        jcenter()
        mavenCentral() // add repository
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.3.3'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2' // add plugin
    }
}
 
// In your app projects build.gradle file:
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao' // apply plugin
 
dependencies {
    compile 'org.greenrobot:greendao:3.2.2' // add library
}

2. 配置greendao的generator生成文件

// In your app projects build.gradle file:
android {
    //...
    greendao {
        schemaVersion 1 //数据库版本号
        daoPackage 'com.db.greendao.gen' //自动生成的工具类的包名,一般为app包名+生成文件的文件夹名
        targetGenDir 'src/main/java' //生成文件路径  
    }
    //...
}

3. 使用GreenDao生成bean类

3.1 创建实体类
@Entity
public class Person {
    @Id
    private Long id;
    private String name;
    private int age;
    private String sex;
}
3.2 生成dao文件

按ctrl+F9,或者在工具栏build下面的Make Project对项目进行重新构建。
生成文件。

而Person类变样了
变成了

package gap.com.mydemo;

import org.greenrobot.greendao.annotation.Entity;
import org.greenrobot.greendao.annotation.Id;
import org.greenrobot.greendao.annotation.Generated;

/**
 * @version $version$
 * @package $package$
 * @description $desc$
 * @user gzl
 * @date $date$
 * @time $time$
 * @email 973780371@qq.com
 * @phone 18067970513
 */
@Entity
public class Person {
    @Id
    private Long id;
    private String name;
    private int age;
    private String sex;
    @Generated(hash = 2139037974)
    public Person(Long id, String name, int age, String sex) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    @Generated(hash = 1024547259)
    public Person() {
    }
    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;
    }
    public String getSex() {
        return this.sex;
    }
    public void setSex(String sex) {
        this.sex = sex;
    }
}

targetGenDir 'src/main/java' //生成文件路径 就是用于指定经过处理的Person类放置的位置。

4. 创建GreenDaoManager来进行统一管理,并初始化

4.1 创建GreenDaoManager

初始化需要实例化GreenDao所需要的几个关键对象,DaoMaster,DaoSession。
创建GreenDaoManager类,在构造函数中进行初始化**

public class GreenDaoManager {
    private DaoMaster mDaoMaster;
    private DaoSession mDaoSession;
    private static volatile GreenDaoManager mInstance = null;

    private GreenDaoManager(Context context) {
        if (mInstance == null) {
            DaoMaster.DevOpenHelper devOpenHelper = new
                    DaoMaster.DevOpenHelper(context, "message.db"); //数据库名
            mDaoMaster = new DaoMaster(devOpenHelper.getWritableDatabase());
            mDaoSession = mDaoMaster.newSession();
        }
    }

    public static GreenDaoManager getInstance() {
        return mInstance;
    }

    public static void initGreenDaoManager(Context context) {
        if (mInstance == null) {
            synchronized (GreenDaoManager.class) {
                if (mInstance == null) {
                    mInstance = new GreenDaoManager(context);
                }
            }
        }
    }

    public DaoMaster getMaster() {
        return mDaoMaster;
    }

    public DaoSession getSession() {
        return mDaoSession;
    }

    public DaoSession getNewSession() {
        mDaoSession = mDaoMaster.newSession();
        return mDaoSession;
    }
}
4.2 在Application中进行初始化GreenDao
GreenDaoManager.initGreenDaoManager(this);

5. 使用GreenDao来进行数据操作CRUD

首先封装一个方法,方便后面的CRUD操作。

    private PersonDao getPersonDao() {
        return GreenDaoManager.getInstance().getSession().getPersonDao();
    }

CRUD方法参考下面:

public class MainActivity extends AppCompatActivity {
    //@Transient,该注解表示这个属性将不会作为数据表中的一个字段
    //@NotNull表示该字段不可以为空,@Unique表示该字段唯一

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

//        updatadata();
//        insertdata();
//        querydata();
          //删除数据
//        getUserDao().deleteByKey(2l);//long类型
//        querydata();
//        querydataBy();

        getuserById();


    }

    private void getuserById() {
        User user =getUserDao().load(1l);
        Log.i("tag", "结果:" + user.getId() + "," + user.getName() + "," + user.getAge() + "," + user.getIsBoy() + ";");


    }

    private void insertdata() {
        //插入数据
        User insertData = new User(null, "插入数据", 24, false);
        getUserDao().insert(insertData);
    }

    private void updatadata() {
        //更改数据
        List<User> userss = getUserDao().loadAll();
        User user = new User(userss.get(0).getId(), "更改后的数据用户", 22, true);
        getUserDao().update(user);

    }

    private void querydata() {
        //查询数据详细
        List<User> users = getUserDao().loadAll();
        Log.i("tag", "当前数量:" + users.size());
        for (int i = 0; i < users.size(); i++) {
            Log.i("tag", "结果:" + users.get(i).getId() + "," + users.get(i).getName() + "," + users.get(i).getAge() + "," + users.get(i).getIsBoy() + ";");
        }

    }

    private void querydataBy() {////查询条件
        Query<User> nQuery = getUserDao().queryBuilder()
//                .where(UserDao.Properties.Name.eq("user1"))//.where(UserDao.Properties.Id.notEq(999))
                .orderAsc(UserDao.Properties.Age)//.limit(5)//orderDesc
                .build();
        List<User> users = nQuery.list();
        Log.i("tag", "当前数量:" + users.size());
        for (int i = 0; i < users.size(); i++) {
            Log.i("tag", "结果:" + users.get(i).getId() + "," + users.get(i).getName() + "," + users.get(i).getAge() + "," + users.get(i).getIsBoy() + ";");
        }

//        QueryBuilder qb = userDao.queryBuilder();
//        qb.where(Properties.FirstName.eq("Joe"),
//                qb.or(Properties.YearOfBirth.gt(1970),
//                        qb.and(Properties.YearOfBirth.eq(1970), Properties.MonthOfBirth.ge(10))));
//        List youngJoes = qb.list();
    }


    /**
     * 根据查询条件,返回数据列表
     * @param where        条件
     * @param params       参数
     * @return             数据列表
     */
    public List<User> queryN(String where, String... params){
        return getUserDao().queryRaw(where, params);
    }

    /**
     * 根据用户信息,插件或修改信息
     * @param user              用户信息
     * @return 插件或修改的用户id
     */
    public long saveN(User user){
        return getUserDao().insertOrReplace(user);
    }

    /**
     * 批量插入或修改用户信息
     * @param list      用户信息列表
     */
    public void saveNLists(final List<User> list){
        if(list == null || list.isEmpty()){
            return;
        }
        getUserDao().getSession().runInTx(new Runnable() {
            @Override
            public void run() {
                for(int i=0; i<list.size(); i++){
                    User user = list.get(i);
                    getUserDao().insertOrReplace(user);
                }
            }
        });

    }

    /**
     * 删除所有数据
     */
    public void deleteAllNote(){
        getUserDao().deleteAll();
    }

    /**
     * 根据用户类,删除信息
     * @param user    用户信息类
     */
    public void deleteNote(User user){
        getUserDao().delete(user);
    }
    private UserDao getUserDao() {
        return GreenDaoManager.getInstance().getSession().getUserDao();
    }

}

二、GreenDao升级

第一步:改版本号

greendao{
    schemaVersion 5
    daoPackage 'xxxxxxxxxx'
    targetGenDir 'src/main/java'
}

第二步:修改实体类为自己需要的类型
重现编译项目运行即可。
这样修改,之前的数据库会被删除,重新创建。

三、GreenDao注释

常用注解

@Entity
public class User {
    @Id(autoincrement = true)
    private Long id;
  
    @Property(nameInDb = "USERNAME")
    private String name;
  
    @NotNull
    private int repos;
  
    @Transient
    private int tempUsageCount;
  
    ...
}

@Entity 用于标识这是一个需要Greendao帮我们生成代码的bean
@Id 标明主键,括号里可以指定是否自增
@Property 用于设置属性在数据库中的列名(默认不写就是保持一致)
@NotNull 非空
@Transient 标识这个字段是自定义的不会创建到数据库表里
@Unique 添加唯一约束

关系注解

@Entity
public class Order {
    @Id private Long id;
  
    private long customerId;
  
    @ToOne(joinProperty = "customerId")
    private Customer customer;
}
  
@Entity
public class Customer {
    @Id private Long id;
}

@ToOne 是将自己的一个属性与另一个表建立关联

@Entity
public class User {
    @Id private Long id;
  
    @ToMany(referencedJoinProperty = "ownerId")
    private List<Site> ownedSites;
}
  
@Entity
public class Site {
    @Id private Long id;
    private long ownerId;
}

// ----------------------------
 
@Entity
public class User {
    @Id private Long id;
    @Unique private String authorTag;
  
    @ToMany(joinProperties = {
            @JoinProperty(name = "authorTag", referencedName = "ownerTag")
    })
    private List<Site> ownedSites;
}
  
@Entity
public class Site {
    @Id private Long id;
    @NotNull private String ownerTag;
}

@ToMany的属性referencedJoinProperty,类似于外键约束。
@JoinProperty 对于更复杂的关系,可以使用这个注解标明目标属性的源属性。

上一篇 下一篇

猜你喜欢

热点阅读