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

apply plugin: 'org.greenrobot.greendao'
buildTypes {release {minifyEnabled false
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}greendao{schemaVersion 1daoPackage '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();
    }}

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

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

GreenDao:3.2.0用法相关推荐

  1. zbb20180930 java,nio,netty Netty5.0用法

    Netty5.0用法 Maven坐标       <dependencies>            <!-- https://mvnrepository.com/artifact/ ...

  2. do{}while(0)用法

    do..while(0)的用法 真是的,我用C++还是太少了.这个宏以前明明见过的,但其存在的意义突然就想不起来了.刚才问了下axx大才又"知道"了一次.赶紧记下来. 这样的宏见过 ...

  3. 安卓GreenDao框架一些进阶用法整理(转)

    大致分为以下几个方面: 一些查询指令整理 使用SQL语句进行特殊查询 检测表字段是否存在 数据库升级 数据库表字段赋初始值 一.查询指令整理 1.链式执行的指令 return mDaoSession. ...

  4. Python之max(num, key=lambda x:x[0])用法的详细解析

    1.max(num, key=lambda x:x[0])语法介绍如下: key=lambda 元素: 元素[字段索引] print(max(C, key=lambda x: x[0])) x:x[] ...

  5. javascript:void(0);用法及常见问题解析

    void 操作符用法格式: javascript:void (expression) 下面的代码创建了一个超级链接,当用户以后不会发生任何事.当用户链接时,void(0) 计算为 0,但 Javasc ...

  6. Android Studio配置GreenDAO 3.2.0和使用方法

    我相信,在平时的开发过程中,大家一定会或多或少地接触到SQLite.然而在使用它时,我们往往需要做许多额外的工作,像编写SQL语句与解析查询结果等.所以,适用于Android ORM框架也就孕育而生了 ...

  7. char data[0]用法总结

    struct MyData {     int nLen;     char data[0]; };         开始没有理解红色部分的内容,上网搜索下,发现用处很大,记录下来.          ...

  8. js中 javascript:void(0) 用法详解

    javascript:void(0)表示不做任何动作.如: 复制代码代码如下: <a href="javascript:void(0);" οnclick="ale ...

  9. idea2019配置gradle详解_Constraint Layout 2.0 用法详解

    Constraint Layout 是最受欢迎的 Jetpack 库之一,它的 2.0 正式版本也发布啦 (目前最新版本 2.1.0-alpha1)!也许您已熟悉了 Constraint Layout ...

最新文章

  1. 【Win7下Android native code的编译和调试】
  2. 2021中科院院士候选名单出炉:清华胡事民、南大周志华等人在列
  3. 跨链Cosmos(9)异构跨链交易流程
  4. Java阶段性测试--第二三大题参考代码
  5. 使用airdrop进行文件共享
  6. Memcached总结
  7. 工业级光纤收发器一般能正常使用多长时间?
  8. 如何做规划?分享2种思维和4个方法
  9. 程序员过端午的正确姿势,一般人看不懂
  10. 《Java程序员职场全攻略:从小工到专家》连载十:这条路大家都是怎么走的
  11. 元胞自动机概念与实例
  12. PTAM特征点法跟踪和建图 SLAM FAST Patch
  13. 出口商贸易融资工具:汇出汇款融资
  14. day09渗透简单测试流程以及PKI实验
  15. java判断字符串是否是中文_Java检查字符串是否包含中文字符
  16. 火车头采集html文档没内容,火车头采集器:编辑任务中常见问题
  17. 《软件工程实践》第五次作业-WordCount进阶需求 (结对第二次)
  18. 认识计算机综合题,第一章 认识计算机试题.doc
  19. 用vs20008生成MFC项目,测试wince
  20. Proteus C51仿真学习板0——KeilProteus

热门文章

  1. 基于汉明软译码和球型译码的通信链路误码率matlab仿真
  2. 【离散数学】第一章 笔记(完)
  3. java long 几个字节_java中long类型占多少字节
  4. shopee跨境电商是真的吗?2022年Shopee如何选品?
  5. Win10系统打开CAD2014卡住现象解决方案
  6. win7遭攻击了,出现cao.txt naicha.txt
  7. python 日语转罗马音工具 pykakasi模块使用
  8. 多媒体设计计算机音乐创作原创音乐,多媒体设计计算机音乐创作原创音乐[计算机辅助音乐创作教学,改善课堂教学效果].doc...
  9. 45.古代某工地需要搬运砖块,已知男人每人每次搬3块,女人每人每次搬2块,小孩两人每次抬一块,现有45人一次正好搬完全部砖块,请问男人、女人、小孩各几人?
  10. 【每日一题】——跳跃游戏