GreenDao:3.2.0用法

原创 2016年11月05日 23:37:47

第一步:在app的Build.gradle中添加如下配置:

apply plugin: 'org.greenrobot.greendao'
buildTypes {
    release {
        minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

greendao{
    schemaVersion 1
    daoPackage 'com.admom.mygreendaotest'
    targetGenDir 'src/main/java'
}
//schemaVersion: 数据库schema版本,也可以理解为数据库版本号
//daoPackage:设置DaoMaster、DaoSession、Dao包名
//targetGenDir:设置DaoMaster、DaoSession、Dao目录
//targetGenDirTest:设置生成单元测试目录
//generateTests:设置自动生成单元测试用例

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    androidTestCompile('com.android.support.test.espresso:espresso-core:2.2.2', {
        exclude group: 'com.android.support', module: 'support-annotations'
    })
    compile 'com.android.support:appcompat-v7:24.2.1'
    testCompile 'junit:junit:4.12'

    compile 'org.greenrobot:greendao:3.2.0'
}

在工程的Build.gradle中添加如下配置:

buildscript {
    repositories {
        jcenter()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:2.2.0'
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.0'
    }
}
写实体类

@Entity
public class User { @Id(autoincrement = true) private Long id; private String name; private int age; private boolean isBoy; 点击Build后make project后GreenDao会自动帮你生成get/set方法如下:

@Entity
public class User {
    @Id(autoincrement = true)
    private Long id;
    private String name;
    private int age;
    private boolean isBoy;
    @Generated(hash = 1724489812)
    public User(Long id, String name, int age, boolean isBoy) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.isBoy = isBoy;
    }
    @Generated(hash = 586692638)
    public User() {
    }
    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 boolean getIsBoy() {
        return this.isBoy;
    }
    public void setIsBoy(boolean isBoy) {
        this.isBoy = isBoy;
    }

}

接下来就是封装

GreenDaoManager
这个自己的工具类调用方法:设置为单例模式,方便后续操作

public class GreenDaoManager {

    private DaoMaster mDaoMaster;
    private DaoSession mDaoSession;
    private static GreenDaoManager mInstance; //单例

    private GreenDaoManager(){
        if (mInstance == null) {
            DaoMaster.DevOpenHelper devOpenHelper = new
                    DaoMaster.DevOpenHelper(MyApplication.getContext(), "user1-db", null);//此处为自己需要处理的表
            mDaoMaster = new DaoMaster(devOpenHelper.getWritableDatabase());
            mDaoSession = mDaoMaster.newSession();
        }
    }

    public static GreenDaoManager getInstance() {
        if (mInstance == null) {
            synchronized (GreenDaoManager.class) {//保证异步处理安全操作

                if (mInstance == null) {
                    mInstance = new GreenDaoManager();
                }
            }
        }
        return mInstance;
    }

    public DaoMaster getMaster() {
        return mDaoMaster;
    }
    public DaoSession getSession() {
        return mDaoSession;
    }
    public DaoSession getNewSession() {
        mDaoSession = mDaoMaster.newSession();
        return mDaoSession;
    }
}

Application中配置好:

public class MyApplication extends Application {

    private static Context mContext;
    @Override
    public void onCreate() {
        super.onCreate();
        mContext = getApplicationContext();
        //greenDao全局配置,只希望有一个数据库操作对象
        GreenDaoManager.getInstance();
    }
    public static Context getContext() {
        return mContext;
    }
}
这时就可以在自己的代码中进行使用了,我将GreenDao一些常用方法置下:

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();
    }

}

一般的简单数据库升级,如下操作即可:

首先在module的gradle文件中修改版本号:
greendao{
    schemaVersion 5
    daoPackage 'xxxxxxxxxx'
    targetGenDir 'src/main/java'
}


2 修改实体类为自己需要的类型,重现编译项目运行即可。

这样修改,之前的数据库会被删除,重新创建。


下面为一些常用的注解使用方式:

@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 对于更复杂的关系,可以使用这个注解标明目标属性的源属性。






版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Scorpio_gao/article/details/53048699

Plugin with id 'org.greenrobot.greendao' not found.怎么办?

Plugin with id 'org.greenrobot.greendao' not found.是因为没有在Project的build.gradle中配置classpath 'org.green...
  • suyimin2010
  • suyimin2010
  • 2018-03-23 08:35:35
  • 187

关于报错:Failed to resolve: 'de.greenrobot:eventbus:2.4.0' 'de.greenrobot:greendao:2.1.0'等问题的解决办法

de.greenrobot:***需要mavenCentral 的支持,我们需要将mavenCentral() 添加到 repositories 中。具体解决办法是在工程的gradle文件中添加红...
  • SZuoDao
  • SZuoDao
  • 2016-02-17 00:25:17
  • 2987

Android GreenDao3.2.0如何使用?

1.配置module 的 首部配置下面一行: apply plugin: 'org.greenrobot.greendao' greendao指定生成的文件目录 2.配置p...
  • qq_31482717
  • qq_31482717
  • 2017-03-25 13:43:05
  • 167

GreenDao3.0基本配置

粘贴板: classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1' apply plugin: 'org.greenrobot.gre...
  • qq_39085422
  • qq_39085422
  • 2017-11-23 08:28:56
  • 10155

关于GreenDao的使用

1、添加依赖(目前是最新版本) compile'org.greenrobot:greendao:3.2.0' compile'org.greenrobot:greendao-generator:...
  • qq_38313155
  • qq_38313155
  • 2017-06-29 19:42:04
  • 165

GreenDao3.2使用详解(增,删,改,查,升级)

首先看一下效果图: 项目结构如下图所示: 第一步:在build中添加配置如下: projet 目录下的build.gradle dependencies { c...
  • wzgbgz
  • wzgbgz
  • 2018-01-23 16:15:21
  • 1342

java.lang.NoClassDefFoundError: org.greenrobot.greendao.database.DatabaseOpenHelper$EncryptedHelper

12-01 15:36:56.671 31868-31868/? A/art: art/runtime/thread.cc:1336] No pending exception expected: j...
  • xiaoyi848699
  • xiaoyi848699
  • 2017-12-01 15:54:35
  • 416

Android greenDAO数据库配置教程

一、环境配置1、在Android Studio中,在.src/mian目录下新建一个java-gen文件夹,和java文件夹同级。用于存放greenDAO生成的DaoMaster、DaoSession...
  • u011459799
  • u011459799
  • 2016-10-08 15:55:34
  • 1601

Android框架之路——GreenDao3.2.2的使用

一、简介 GreenDAO是一个开源的安卓ORM框架,能够使SQLite数据库的开发再次变得有趣。它减轻开发人员处理低级数据库需求,同时节省开发时间。 SQLite是一个令人敬畏的内嵌的关系数据库...
  • bskfnvjtlyzmv867
  • bskfnvjtlyzmv867
  • 2017-05-06 11:38:32
  • 10537

Android Studio 简单使用 GreenDao3.0

Android Studio 简单使用 GreenDao3.0 据说现在很流行GreenDao框架,所以也抽空了解一下,可恨啊,刚看到的时候在百度上查询的就是GreenDao,然后很不幸的去走老版本的...
  • qq_27899045
  • qq_27899045
  • 2016-10-12 15:28:28
  • 3917
收藏助手
不良信息举报
您举报文章:GreenDao:3.2.0用法
举报原因:
原因补充:

(最多只允许输入30个字)