binbinyang---greendao 3.0的配置以及简单的增删改查

来源:互联网 发布:unity3d 代码添加组件 编辑:程序博客网 时间:2024/05/23 20:10

 最近需要开始一个新的项目了,考虑到既然是新项目了,那么一些常用的框架肯定也要用当下最火的!这次的新项目中涉及到了本地数据存储,很早前有个项目的本地数据库框架用的是ActiveAndroid,github找了下这个框架,发现已经两年多已经没有更新了。然后就想到了一直没有时间去涉及到的greenDAO,github一搜索,哦呦?star有5000+,并且依然保持着很高的更新频率,并且性能远远的高于activeAndroid(见下图),果断选用。


    刚开始想偷偷懒,大致浏览了下greenDAO官网后就开始百度一些相关教程(毕竟看中文的速度快啊!!!)。找教程中也看到了很多质量很高的文章,但是看上去都有点怪怪的,感觉和官网的最新版本介绍的完全不是一个东西,主要是在导包以及生成代码的方式。最后发现是因为greenDAO2和3的构建和生成代码的方式变化了不少,所以最后还是老老实实的回去看官文了,废话了这么多,下面开始正题!!


【一】greenDAO3基本介绍

    greenDAO3开始使用注解的方式定义实体类(entity),并且是通过安装gradle插件来生成代码。之前的版本则是通过建立一个独立的java工程来存放生成的文件。


【二】导入相关的包

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. compile 'org.greenrobot:greendao:3.0.1'  
  2. compile 'org.greenrobot:greendao-generator:3.0.0'  
  
  这一步很简单,在gradle的dependencies中导入最新版本的依赖就可以了


【三】配置gradle

    这一步非常关键,这是整个grennDAO3改变的核心所在了。先加入如下代码

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. apply plugin: 'org.greenrobot.greendao'  
  2.   
  3. buildscript {  
  4.     repositories {  
  5.         mavenCentral()  
  6.     }  
  7.     dependencies {  
  8.         classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'  
  9.     }  
  10. }  
    在gradle的根模块中加入上述代码后,sync project的时候,gradle会自动去maven仓库下载一个gradle的插件,当然了,这个插件就是为greenDAO服务的,用来生成数据库相关的代码。

    简单的介绍下通过gradle插件生成数据库代码的步骤:每次在make project之前,它会扫描项目中所有的@Entity文件(greenDAO中数据库的实体类),根据实体类生成DaoSession、DaoMaster以及所有实体类的dao类,生成的文件默认目录为:build/generated/source/greendao,若不想修改生成的路径,可以将此路径设置为资源目录。我们也可以自定义这个路径,下面就来介绍如何在gradle中配置greenDAO的相关属性:

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. greendao {  
  2.     schemaVersion 1  
  3.     daoPackage 'com.wyk.greendaodemo.greendao.gen'  
  4.     targetGenDir 'src/main/java'  
  5. }  
    在gradle的根模块中加入上述代码,就完成了我们的基本配置了。

    schemaVersion---->指定数据库schema版本号,迁移等操作会用到

    daoPackage-------->通过gradle插件生成的数据库相关文件的包名,默认为你的entity所在的包名

    targetGenDir-------->这就是我们上面说到的自定义生成数据库文件的目录了,可以将生成的文件放到我们的java目录中,而不是build中,这样就不用额外的设置资源目录了

    贴上完整代码图:

  


【四】编写entity类

    通过greenDAO3注解的语法来定义我们的一个测试数据库实体类:

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. import org.greenrobot.greendao.annotation.Entity;  
  2. import org.greenrobot.greendao.annotation.Id;  
  3. import org.greenrobot.greendao.annotation.Transient;  
  4.   
  5. @Entity  
  6. public class User {  
  7.     @Id  
  8.     private Long id;  
  9.     private String name;  
  10.     @Transient  
  11.     private int tempUsageCount; // not persisted  
  12. }  
@Entity:将我们的java普通类变为一个能够被greenDAO识别的数据库类型的实体类

@Id:通过这个注解标记的字段必须是Long类型的,这个字段在数据库中表示它就是主键,并且它默认就是自增的

@Transient:表明这个字段不会被写入数据库,只是作为一个普通的java类字段,用来临时存储数据的,不会被持久化

接下来让我们点击as中Build菜单栏中的Make Project,make完成之后会发现我们的User类中突然多了好多代码,这就是greenDAO自动为你生成的了,代码如下

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. import org.greenrobot.greendao.annotation.Entity;  
  2. import org.greenrobot.greendao.annotation.Id;  
  3. import org.greenrobot.greendao.annotation.Transient;  
  4. import org.greenrobot.greendao.annotation.Generated;  
  5.   
  6. @Entity  
  7. public class User {  
  8.     @Id  
  9.     private Long id;  
  10.     private String name;  
  11.     @Transient  
  12.     private int tempUsageCount; // not persisted  
  13.     public String getName() {  
  14.         return this.name;  
  15.     }  
  16.     public void setName(String name) {  
  17.         this.name = name;  
  18.     }  
  19.     public Long getId() {  
  20.         return this.id;  
  21.     }  
  22.     public void setId(Long id) {  
  23.         this.id = id;  
  24.     }  
  25.     @Generated(hash = 873297011)  
  26.     public User(Long id, String name) {  
  27.         this.id = id;  
  28.         this.name = name;  
  29.     }  
  30.     @Generated(hash = 586692638)  
  31.     public User() {  
  32.     }  
  33. }  
    上述生成的代码中包含了构造方法以及每个属性的getter setter方法。除了这个变化,还会发现在我们之前设置的targetGenDir这个目录中多了三个文件,之后所有相关的数据库操作都依靠这三个文件了。



【五】增删改查操作

    铺垫了这么多,终于能见到我们数据库的核心功能了~

    1.第一步肯定是初始化数据库

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(MyApplication.getContext(), "notes-db"null);  
  2. DaoMaster daoMaster = new DaoMaster(devOpenHelper.getWritableDatabase());  
  3. DaoSession daoSession = daoMaster.newSession();  
  4. UserDao userDao = daoSession.getUserDao();  
    “notes-db”是我们自定的数据库名字,应为我们之前创建了一个Entity叫做User,所以greenDAO自定帮我们生成的UserDao,拿到了这个UserDao,我们就可以操作User这张表了。

    一个DaoMaster就代表着一个数据库的连接;DaoSession可以让我们使用一些Entity的基本操作和获取Dao操作类,DaoSession可以创建多个,每一个都是属于同一个数据库连接的。

    2.插入数据

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. User user = new User(null"wyk");  
  2. userDao.insert(user);  
    非常简单,实例化一个User对象,然后调用userDao的insert方法就可以了。将User对象的id设置为null的时候,数据库会自动为其分配自增的id。

    3.查找数据

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. List<User> userList = userDao.queryBuilder()  
  2.        .where(UserDao.Properties.Id.notEq(999))  
  3.        .orderAsc(UserDao.Properties.Id)  
  4.        .limit(5)  
  5.        .build().list();  

    通过userDao的queryBuilder()方法,生成一个查找构造器,可以给构造器添加where条件判断、按照某某字段排序以及查询的条数等基本的数据库操作。list()方法表示查询的结果为一个集合.

    4.修改数据

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. User findUser = userDao.queryBuilder().where(UserDao.Properties.Name.eq("wyk")).build().unique();  
  2. if(findUser != null) {  
  3.     findUser.setName(newName);  
  4.     userDao.update(findUser);  
  5.     Toast.makeText(MyApplication.getContext(), "修改成功", Toast.LENGTH_SHORT).show();  
  6. else {  
  7.     Toast.makeText(MyApplication.getContext(), "用户不存在", Toast.LENGTH_SHORT).show();  
  8. }  
    修改数据的第一步是把需要修改的条目给查询出来,然后修改该条目,最后调用userDao的update方法即可。unique()表示查询结果为一条数据,若数据不存在,findUser为null。

    5.删除数据

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. User findUser = userDao.queryBuilder().where(UserDao.Properties.Name.eq("wyk")).build().unique();  
  2. if(findUser != null){  
  3.     userDao.deleteByKey(findUser.getId());  
  4. }  
    删除数据和更新数据基本相似,先查询出需要删除的条目,然后调用userDao的deleteByKey将该条目的主键传入即可删除。

【结尾】greenDAO还有很多高级的功能,比如说给表设置一对一、一对多、多对多的关系以及复用查询语句等等等太多功能,本片文章仅仅做一个入门教学,其余的功能小伙伴们可以去官网教程中自行查阅咯~最后贴上整个demo的主要代码


build.gradle

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. apply plugin: 'com.android.application'  
  2. apply plugin: 'org.greenrobot.greendao'  
  3.   
  4. buildscript {  
  5.     repositories {  
  6.         mavenCentral()  
  7.     }  
  8.     dependencies {  
  9.         classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'  
  10.     }  
  11. }  
  12.   
  13. greendao {  
  14.     schemaVersion 1  
  15.     daoPackage 'com.wyk.greendaodemo.greendao.gen'  
  16.     targetGenDir 'src/main/java'  
  17. }  
  18.   
  19. android {  
  20.     compileSdkVersion 23  
  21.     buildToolsVersion "23.0.1"  
  22.   
  23.     defaultConfig {  
  24.         applicationId "com.wyk.greendaodemo"  
  25.         minSdkVersion 14  
  26.         targetSdkVersion 23  
  27.         versionCode 1  
  28.         versionName "1.0"  
  29.     }  
  30.     buildTypes {  
  31.         release {  
  32.             minifyEnabled false  
  33.             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'  
  34.         }  
  35.     }  
  36. }  
  37.   
  38. dependencies {  
  39.     compile fileTree(dir: 'libs', include: ['*.jar'])  
  40.     testCompile 'junit:junit:4.12'  
  41.     compile 'com.android.support:appcompat-v7:23.0.1'  
  42.     compile 'org.greenrobot:greendao:3.0.1'  
  43.     compile 'org.greenrobot:greendao-generator:3.0.0'  
  44. }  


User.java

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. package com.wyk.greendaodemo.greendao.entity;  
  2.   
  3. import org.greenrobot.greendao.annotation.Entity;  
  4. import org.greenrobot.greendao.annotation.Id;  
  5. import org.greenrobot.greendao.annotation.Transient;  
  6. import org.greenrobot.greendao.annotation.Generated;  
  7.   
  8. @Entity  
  9. public class User {  
  10.     @Id  
  11.     private Long id;  
  12.     private String name;  
  13.     @Transient  
  14.     private int tempUsageCount; // not persisted  
  15.     public String getName() {  
  16.         return this.name;  
  17.     }  
  18.     public void setName(String name) {  
  19.         this.name = name;  
  20.     }  
  21.     public Long getId() {  
  22.         return this.id;  
  23.     }  
  24.     public void setId(Long id) {  
  25.         this.id = id;  
  26.     }  
  27.     @Generated(hash = 873297011)  
  28.     public User(Long id, String name) {  
  29.         this.id = id;  
  30.         this.name = name;  
  31.     }  
  32.     @Generated(hash = 586692638)  
  33.     public User() {  
  34.     }  
  35. }  


MainActivity.java

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. package com.wyk.greendaodemo;  
  2.   
  3. import android.app.Activity;  
  4. import android.os.Bundle;  
  5. import android.view.View;  
  6. import android.widget.Button;  
  7. import android.widget.EditText;  
  8. import android.widget.ListView;  
  9. import android.widget.Toast;  
  10.   
  11. import com.wyk.greendaodemo.greendao.GreenDaoManager;  
  12. import com.wyk.greendaodemo.greendao.entity.User;  
  13. import com.wyk.greendaodemo.greendao.gen.UserDao;  
  14.   
  15. import java.util.ArrayList;  
  16. import java.util.List;  
  17.   
  18. public class MainActivity extends Activity implements View.OnClickListener {  
  19.     private EditText mNameET;  
  20.     private Button mAddBtn;  
  21.     private ListView mUserLV;  
  22.   
  23.     private UserAdapter mUserAdapter;  
  24.     private List<User> mUserList = new ArrayList<>();  
  25.   
  26.     @Override  
  27.     protected void onCreate(Bundle savedInstanceState) {  
  28.         super.onCreate(savedInstanceState);  
  29.         setContentView(R.layout.activity_main);  
  30.         initView();  
  31.         initData();  
  32.     }  
  33.   
  34.     private void initView() {  
  35.         mNameET = (EditText) findViewById(R.id.et_name);  
  36.         mAddBtn = (Button) findViewById(R.id.btn_add);  
  37.         mUserLV = (ListView) findViewById(R.id.lv_user);  
  38.   
  39.         mAddBtn.setOnClickListener(this);  
  40.     }  
  41.   
  42.     private void initData() {  
  43.         mUserList = GreenDaoManager.getInstance().getSession().getUserDao().queryBuilder().build().list();  
  44.         mUserAdapter = new UserAdapter(this, mUserList);  
  45.         mUserLV.setAdapter(mUserAdapter);  
  46.     }  
  47.   
  48.     /** 
  49.      * 根据名字更新某条数据的名字 
  50.      * @param prevName  原名字 
  51.      * @param newName  新名字 
  52.      */  
  53.     private void updateUser(String prevName,String newName){  
  54.         User findUser = GreenDaoManager.getInstance().getSession().getUserDao().queryBuilder()  
  55.                 .where(UserDao.Properties.Name.eq(prevName)).build().unique();  
  56.         if(findUser != null) {  
  57.             findUser.setName(newName);  
  58.             GreenDaoManager.getInstance().getSession().getUserDao().update(findUser);  
  59.             Toast.makeText(MyApplication.getContext(), "修改成功", Toast.LENGTH_SHORT).show();  
  60.         } else {  
  61.             Toast.makeText(MyApplication.getContext(), "用户不存在", Toast.LENGTH_SHORT).show();  
  62.         }  
  63.     }  
  64.   
  65.     /** 
  66.      * 根据名字删除某用户 
  67.      * @param name 
  68.      */  
  69.     private void deleteUser(String name){  
  70.         UserDao userDao = GreenDaoManager.getInstance().getSession().getUserDao();  
  71.         User findUser = userDao.queryBuilder().where(UserDao.Properties.Name.eq(name)).build().unique();  
  72.         if(findUser != null){  
  73.             userDao.deleteByKey(findUser.getId());  
  74.         }  
  75.     }  
  76.   
  77.     /** 
  78.      * 本地数据里添加一个User 
  79.      * @param id  id 
  80.      * @param name  名字 
  81.      */  
  82.     private void insertUser(Long id, String name) {  
  83.         UserDao userDao = GreenDaoManager.getInstance().getSession().getUserDao();  
  84.         User user = new User(id, name);  
  85.         userDao.insert(user);  
  86.         mNameET.setText("");  
  87.   
  88.         mUserList.clear();  
  89.         mUserList.addAll(userDao.queryBuilder().build().list());  
  90.         mUserAdapter.notifyDataSetChanged();  
  91.     }  
  92.   
  93.     @Override  
  94.     public void onClick(View v) {  
  95.         int viewId = v.getId();  
  96.         switch (viewId){  
  97.             case R.id.btn_add:  
  98.                 insertUser(null, mNameET.getText().toString());  
  99.                 break;  
  100.             default:  
  101.                 break;  
  102.         }  
  103.     }  
  104. }  


activity_main.xml

[html] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     xmlns:tools="http://schemas.android.com/tools"  
  4.     android:layout_width="match_parent"  
  5.     android:layout_height="match_parent"  
  6.     android:orientation="vertical"  
  7.     tools:context="com.wyk.greendaodemo.MainActivity">  
  8.   
  9.     <EditText  
  10.         android:id="@+id/et_name"  
  11.         android:layout_width="match_parent"  
  12.         android:layout_height="wrap_content" />  
  13.   
  14.     <Button  
  15.         android:id="@+id/btn_add"  
  16.         android:layout_width="wrap_content"  
  17.         android:layout_height="wrap_content"  
  18.         android:text="add one" />  
  19.   
  20.   
  21.     <ListView  
  22.         android:id="@+id/lv_user"  
  23.         android:layout_width="match_parent"  
  24.         android:layout_height="match_parent"/>  
  25. </LinearLayout>  


GreenDaoManager.java(greenDao管理类)

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. package com.wyk.greendaodemo.greendao;  
  2.   
  3. import com.wyk.greendaodemo.MyApplication;  
  4. import com.wyk.greendaodemo.greendao.gen.DaoMaster;  
  5. import com.wyk.greendaodemo.greendao.gen.DaoSession;  
  6.   
  7. /** 
  8.  * Created by wyk on 2016/7/12. 
  9.  */  
  10. public class GreenDaoManager {  
  11.     private static GreenDaoManager mInstance;  
  12.     private DaoMaster mDaoMaster;  
  13.     private DaoSession mDaoSession;  
  14.   
  15.   
  16.     public GreenDaoManager() {  
  17.         DaoMaster.DevOpenHelper devOpenHelper = new DaoMaster.DevOpenHelper(MyApplication.getContext(), "notes-db"null);  
  18.         DaoMaster mDaoMaster = new DaoMaster(devOpenHelper.getWritableDatabase());  
  19.         mDaoSession = mDaoMaster.newSession();  
  20.     }  
  21.   
  22.     public static GreenDaoManager getInstance() {  
  23.         if (mInstance == null) {  
  24.             mInstance = new GreenDaoManager();  
  25.         }  
  26.         return mInstance;  
  27.     }  
  28.   
  29.     public DaoMaster getMaster() {  
  30.         return mDaoMaster;  
  31.     }  
  32.   
  33.     public DaoSession getSession() {  
  34.         return mDaoSession;  
  35.     }  
  36.   
  37.     public DaoSession getNewSession() {  
  38.         mDaoSession = mDaoMaster.newSession();  
  39.         return mDaoSession;  
  40.     }  
  41. }  


MyApplication.java

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. package com.wyk.greendaodemo;  
  2.   
  3. import android.app.Application;  
  4. import android.content.Context;  
  5.   
  6. import com.wyk.greendaodemo.greendao.GreenDaoManager;  
  7.   
  8. /** 
  9.  * Created by wyk on 2016/7/12. 
  10.  */  
  11. public class MyApplication extends Application {  
  12.     private static Context mContext;  
  13.   
  14.     @Override  
  15.     public void onCreate() {  
  16.         super.onCreate();  
  17.         mContext = getApplicationContext();  
  18.         GreenDaoManager.getInstance();  
  19.     }  
  20.   
  21.     public static Context getContext() {  
  22.         return mContext;  
  23.     }  
  24. }  

UserAdapter.java

[java] view plain copy
 print?在CODE上查看代码片派生到我的代码片
  1. package com.wyk.greendaodemo;  
  2.   
  3. import android.content.Context;  
  4. import android.view.LayoutInflater;  
  5. import android.view.View;  
  6. import android.view.ViewGroup;  
  7. import android.widget.BaseAdapter;  
  8. import android.widget.TextView;  
  9.   
  10. import com.wyk.greendaodemo.greendao.entity.User;  
  11.   
  12. import java.util.List;  
  13.   
  14. /** 
  15.  * Created by wyk on 2016/7/12. 
  16.  */  
  17. public class UserAdapter extends BaseAdapter {  
  18.     private List<User> mUserList;  
  19.     private Context mContext;  
  20.   
  21.     public UserAdapter(Context mContext, List<User> mUserList) {  
  22.         this.mUserList = mUserList;  
  23.         this.mContext = mContext;  
  24.     }  
  25.   
  26.     @Override  
  27.     public int getCount() {  
  28.         return mUserList == null ? 0 : mUserList.size();  
  29.     }  
  30.   
  31.     @Override  
  32.     public Object getItem(int position) {  
  33.         return position;  
  34.     }  
  35.   
  36.     @Override  
  37.     public long getItemId(int position) {  
  38.         return position;  
  39.     }  
  40.   
  41.     @Override  
  42.     public View getView(int position, View convertView, ViewGroup parent) {  
  43.         ViewHolder viewHolder = null;  
  44.         if (convertView == null) {  
  45.             convertView = LayoutInflater.from(mContext).inflate(R.layout.item_user, null);  
  46.             viewHolder = new ViewHolder();  
  47.             viewHolder.tv_id = (TextView) convertView.findViewById(R.id.tv_id);  
  48.             viewHolder.tv_name = (TextView) convertView.findViewById(R.id.tv_name);  
  49.             convertView.setTag(viewHolder);  
  50.         } else {  
  51.             viewHolder = (ViewHolder) convertView.getTag();  
  52.         }  
  53.   
  54.         User user = mUserList.get(position);  
  55.         viewHolder.tv_id.setText(String.valueOf(user.getId()));  
  56.         viewHolder.tv_name.setText(user.getName());  
  57.   
  58.         return convertView;  
  59.     }  
  60.   
  61.     class ViewHolder {  
  62.         TextView tv_id;  
  63.         TextView tv_name;  
  64.     }  
  65. }  
 

项目结构


0 0
原创粉丝点击