GreenDao 3.2版本入门 以及实例讲解

来源:互联网 发布:有没有真的网络兼职 编辑:程序博客网 时间:2024/06/08 05:18

一: 依赖


app//build.gradle  :


apply plugin: 'org.greenrobot.greendao'


android{

greendao {    schemaVersion 1    daoPackage 'com.zgl.greentest.gen'    targetGenDir 'src/main/java'}


}






dependencies{

compile 'org.greenrobot:greendao-generator:3.2.2'compile 'org.greenrobot:greendao:3.2.2'


}



project// build.gradle:


buildscript {    repositories {        mavenCentral()    }    dependencies {        classpath 'com.android.tools.build:gradle:2.3.1'        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'        // NOTE: Do not place your application dependencies here; they belong        // in the individual module build.gradle files    }}



二 在项目包下创建实体类(我是在db包里面写的OnlinePlayListBean)


@Entity@Keeppublic class OnlinePlayListBean {    @Id    private long playListId;    @Property(nameInDb = "_data")    private String localUrl;    @Property(nameInDb = "name")    private String listName;    @Property(nameInDb = "date_added")    private long addDate;    @Property(nameInDb = "date_modified")    private long modifiedDate;    public OnlinePlayListBean(long playListId, String listName, String localUrl, long addDate, long modifiedDate) {        this.playListId = playListId;        this.listName = listName;        this.localUrl = localUrl;        this.addDate = addDate;        this.modifiedDate = modifiedDate;    }    //primary    public long getPlayListId() {        return playListId;    }    public void setPlayListId(long playListId) {        this.playListId = playListId;    }    public String getListName() {        return listName;    }    public void setListName(String listName) {        this.listName = listName;    }    public String getLocalUrl() {        return localUrl;    }    public void setLocalUrl(String localUrl) {        this.localUrl = localUrl;    }    public long getAddDate() {        return addDate;    }    public void setAddDate(long addDate) {        this.addDate = addDate;    }    public long getModifiedDate() {        return modifiedDate;    }    public void setModifiedDate(long modifiedDate) {        this.modifiedDate = modifiedDate;    }}


  1. @Entity表示这个实体类会在数据库中生成对应的表,
  2. @Id表示该字段是id,注意该字段的数据类型为包装类型Long
  3. @Property则表示该属性将作为表的一个字段,其中nameInDb看名字就知道这个属性在数据库中对应的数据名称。
运行将项目进行编译,编译成功之后系统会帮助我们生成相应的构造方法和get/set方法,并且还会在我们的包下生成DaoMaster和DaoSession。那么这里常用的注解除了这几个之外,还有一个较常用的就是@Transient,该注解表示这个属性将不会作为数据表中的一个字段。就是这么简单。另外还有一些比如@NotNull表示该字段不可以为空,@Unique表示该字段唯一。这里的注解还是挺多的.




 


GreenDao的初始化:

public class GreenDaoManager {    private DaoMaster mDaoMaster;    private DaoSession mDaoSession;    private static GreenDaoManager mInstance; //单例    private GreenDaoManager(){        if (mInstance == null) {            DaoMaster.DevOpenHelper devOpenHelper = new                    DaoMaster.DevOpenHelper(App.getContext(), "user1-db", null);//此处为自己需要处理的表            Log.d("green dao manager???", "GreenDaoManager:  app context?"+App.getContext());             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;    }}


在App的配置


public class App extends Application {    private static Context mContext;       @Override    public void onCreate() {        super.onCreate();        mContext = getApplicationContext();        //greenDao全局配置,只希望有一个数据库操作对象        GreenDaoManager.getInstance();        // Set up Crashlytics, disabled for debug builds        Crashlytics crashlyticsKit = new Crashlytics.Builder()                .core(new CrashlyticsCore.Builder().disabled(BuildConfig.DEBUG).build())                .build();        Fabric.with(this, crashlyticsKit);        //Set up dynamic shortcuts        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N_MR1) {            new DynamicShortcutManager(this).initDynamicShortcuts();        }    }    public static Context getContext() {        return mContext;    }    }
好了, 我们配置的差不多了 ,现在可以使用了:  可以在一个工具类里面写
//返回数据库操作对象public static OnlinePlayListBeanDao getOnlinePlayListBeanDao() {    return GreenDaoManager.getInstance().getSession().getOnlinePlayListBeanDao();}



以下是本人在项目和文献中使用过的一些方法 比如:


    //id对应的信息    public static void getOnlinePlayListBeanById() {        OnlinePlayListBean OnlinePlayListBean = getOnlinePlayListBeanDao().load(1l);        Log.i("tag", "结果:" + OnlinePlayListBean.getPlayListId() + "," + OnlinePlayListBean.getLocalUrl() + ","                + OnlinePlayListBean.getListName() + "," + OnlinePlayListBean.getAddDate() + ","                + OnlinePlayListBean.getModifiedDate());    }    //way : add  a  bean  directly  by watch out  the  primary key  not duplicated    public static void insertdata() {        //插入数据    long1:id ,long2:add_date , long3:modify_date        OnlinePlayListBean insertData = new OnlinePlayListBean(2050, "要插入的表名", "存储位置", 20170428, 20170429);        getOnlinePlayListBeanDao().insert(insertData);    }    //way: add  a bean directly   identified   by the  exist  primary key    public static void updatadata() {        //更改数据        int updatePostion = 0;        List<OnlinePlayListBean> OnlinePlayListBeanss = getOnlinePlayListBeanDao().loadAll();        OnlinePlayListBean OnlinePlayListBean = new OnlinePlayListBean(OnlinePlayListBeanss.get(updatePostion).getPlayListId(), "更改后的数据用户", "存储位置", 20170428, 20170429);        getOnlinePlayListBeanDao().update(OnlinePlayListBean);    }    //query all   by  for  loop    public static List querydata() {        //查询数据详细        List<OnlinePlayListBean> onlinePlayListBeans = getOnlinePlayListBeanDao().loadAll();        Log.i("tag", "当前数量:" + onlinePlayListBeans.size());        for (int i = 0; i < onlinePlayListBeans.size(); i++) {            Log.i("tag", "结果:" + onlinePlayListBeans.get(i).getPlayListId() + "," + onlinePlayListBeans.get(i).getListName() + ","                    + onlinePlayListBeans.get(i).getLocalUrl() + "," + onlinePlayListBeans.get(i).getAddDate() + ","                    + onlinePlayListBeans.get(i).getModifiedDate() + ";");        }        return  onlinePlayListBeans;    }    //listname来查询    public static void querydataBy() {////查询条件        Query<OnlinePlayListBean> nQuery = getOnlinePlayListBeanDao().queryBuilder()//                .where(OnlinePlayListBeanDao.Properties.Name.eq("OnlinePlayListBean1"))//.where(OnlinePlayListBeanDao.Properties.Id.notEq(999))                .orderAsc(OnlinePlayListBeanDao.Properties.ListName)//.limit(5)//orderDesc                .build();        List<OnlinePlayListBean> OnlinePlayListBeans = nQuery.list();        Log.i("tag", "当前数量:" + OnlinePlayListBeans.size());        for (int i = 0; i < OnlinePlayListBeans.size(); i++) {            Log.i("tag", "结果:" + OnlinePlayListBeans.get(i).getPlayListId() + "," + OnlinePlayListBeans.get(i).getListName() + ","                    + OnlinePlayListBeans.get(i).getLocalUrl() + "," + OnlinePlayListBeans.get(i).getModifiedDate() + ","                    + OnlinePlayListBeans.get(i).getAddDate() + ";");        }//        QueryBuilder qb = OnlinePlayListBeanDao.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 static List<OnlinePlayListBean> queryN(String where, String... params) {        return getOnlinePlayListBeanDao().queryRaw(where, params);    }    /**     * 根据用户信息,插件或修改信息     *     * @param OnlinePlayListBean 用户信息     * @return 插件或修改的用户id     */    public static long saveN(OnlinePlayListBean OnlinePlayListBean) {        return getOnlinePlayListBeanDao().insertOrReplace(OnlinePlayListBean);    }    /**     * 批量插入或修改用户信息     *     * @param list 用户信息列表  根据id 修正表     */    public static void saveNLists(final List<OnlinePlayListBean> list) {        if (list == null || list.isEmpty()) {            return;        }        getOnlinePlayListBeanDao().getSession().runInTx(new Runnable() {            @Override            public void run() {                for (int i = 0; i < list.size(); i++) {                    OnlinePlayListBean OnlinePlayListBean = list.get(i);                    getOnlinePlayListBeanDao().insertOrReplace(OnlinePlayListBean);                }            }        });    }    /**     * 删除所有数据     */    public static void deleteAllNote() {        getOnlinePlayListBeanDao().deleteAll();    }    /**     * 根据用户类,删除信息     * <p>     * 删除传入的实际参数bean对象     *     * @param OnlinePlayListBean 用户信息类     */    public static void deleteNote(OnlinePlayListBean OnlinePlayListBean) {        getOnlinePlayListBeanDao().delete(OnlinePlayListBean);    }
按id是否为某个数字时候查询:  unique() 返回一个或者0个对象 ,  uniqueOrThrow 返回一个对象否则抛出异常
 list() 返回多个对象
OnlinePlayListBean defalutOnlinePlayListBean = OnlinePlayListBeanDaoUtils.getOnlinePlayListBeanDao().queryBuilder()        .where(OnlinePlayListBeanDao.Properties.PlayListId.eq(446623648)).unique();


添加数据 以Bean的形式

OnlinePlayListBean insertData = new OnlinePlayListBean(playlistId, charSequence.toString(), "pco", playlistId, playlistId);OnlinePlayListBeanDaoUtils.getOnlinePlayListBeanDao().insert(insertData);
GreenDao  常见错误 解析:
1.  Caused by: java.lang.ClassNotFoundException: Didn't find class  xxx  on path: DexPathList
相关类没有混淆: 混淆时候 把相关包 按以下格式    其实class genre 是父级包
-keep public class genre.**{*;}
2.    
Error:Execution failed for task ':platform:greendao'.
> Can't replace field in /Users/dsx/Documents/XXX/platform/src/main/java/com/XXX/platform/bean/OrderXXX.java:43 with generated version.//董铂然 博客园
                      If you would like to keep it, it should be explicitly marked with @Keep annotation.
                      Otherwise please mark it with @Generated annotation
没有使用@keep 注解或者@Generated注解   视乎你有没有更改greendao 实体类 而选择注解关键字
3.

android.database.sqlite.SQLiteException: table has no column named (code 1),

其实是修改了在创建表的内容,你只要升级数据库版本或者卸载当前的应用,然后在运行加载,就不会报这个错误了。

0 0