• GreenDao使用踩过的坑


    本来想用litePal,看了郭大婶的说明,真的是好用!

    后来发现网上说比较流行的还是 GREENDAO,且效率不错!

    不用管那么多了,直接用吧.

    ----------------------------------------------------------------------------------

    看了一天的 GREENDAO,还是没有敢动手,那就动起来!

    ----------------------------------------------------------------------------------

    1.先导入包,直接按官网来

    -------------------------

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

    导入结束,高高兴兴的准备在application 中加入 daoMaster daoSession

    private DaoMaster.DevOpenHelper mHelper;
     private SQLiteDatabase db;
     private DaoMaster mDaoMaster;
     private DaoSession mDaoSession;

    这里还有个小插曲:不要笑我笨!

    我根本找不到   application 类在哪???

    后来,一个大兄弟告诉我,那需要你自己写个 应用类,,继承application ,大概长这样:

    import android.app.Application;
    
    /**
     * Created by Think on 2017/12/21.
     */
    
    public class BaseApp extends Application {
    
        @Override
        public void onCreate() {
            super.onCreate();
        }
    }

    建立完app后还要在 AndroidManifest.xml 中加入  name='BaseApp'

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.ssqhan.mydbtest">
    
        <application
            android:name="BaseApp"
            .............................
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>

    好吧,快写上内容:(官网是这样要求的)

    // do this once, for example in your Application class           这不,,要求写到应用程序中
    helper = new DaoMaster.DevOpenHelper(this, "notes-db", null);
    db = helper.getWritableDatabase();
    daoMaster = new DaoMaster(db);
    daoSession = daoMaster.newSession();
    // do this in your activities/fragments to get hold of a DAO
    noteDao = daoSession.getNoteDao();
    //那我们就这样写了
    //----------------------------------------------
    import
    android.app.Application; /** * Created by Think on 2017/12/21. */ public class BaseApp extends Application { private DaoMaster.DevOpenHelper mHelper; private SQLiteDatabase db; private DaoMaster mDaoMaster; private DaoSession mDaoSession; // do this once, for example in your Application class mHelper= new DaoMaster.DevOpenHelper(this, "notes-db", null); db = helper.getWritableDatabase(); mDaoMaster= new DaoMaster(db); mDaoSession=mDaoMaster.newSession(); // do this in your activities/fragments to get hold of a DAO noteDao = daoSession.getNoteDao(); @Override public void onCreate() { super.onCreate(); } }

    可是会发现, DAOMaster  是红色的 且出现:  cannot resolve symbol 'daoMaster'

    why???????????

    ----------------------------------------------------------------------------------------------------

    2.正确姿势就该这样:

      (1)先建一个实体这样:(直接COPY 官网上的)

    @Entity
    public class User {
        @Id
        private Long id;
     
        private String name;
     
        @Transient
        private int tempUsageCount; // not persisted
     
       // getters and setters for id and user ...
    }

    什么,又是一片红:    一通  'alt+enter'  解决问题

    (2) 这样就自动生成三个文件

         我当时现现了另一个神级的错误:  三个文件最上面出现 package;   并且标红

       解决方法:直接删除  package

         (后来发现,删除是不对的,没有能正确的生成包名是因为  User  实体的位置放置不对,所以生成的  DaoMaster,DaoSession,UserDao 的包名都不正确)

          又发现:userDao里的 User又标红   'alt+enter' 直接 import  User就可以了!

          现在才刚刚开始!

    -------------------------------------------------------------------------------------------------------

    3.写入全局应用程序中

       终于不再看到 标红的 字样了..真的有点崩溃了!

       再来看看:

    public class BaseApp extends Application {
    
        private DaoMaster.DevOpenHelper mHelper;
        private SQLiteDatabase db;
        private DaoMaster mDaoMaster;
        private DaoSession mDaoSession;
           
     
        @Override
        public void onCreate() {
            super.onCreate();
    
            mHelper = new DaoMaster.DevOpenHelper(this, "notes-db", null);
            db = mHelper.getWritableDatabase();
            mDaoMaster = new DaoMaster(db);
            mDaoSession = mDaoMaster.newSession();
            // do this in your activities/fragments to get hold of a DAO   既然要在 activities 里,那这里就不用了
            //noteDao = mDaoSession.getNoteDao();
            
        }
    }

    好了.没有标红,我的个小心脏啊..真的有点受不了了!

    好吧,还是让代码看来起更优雅一点(借用大侠的代码,地址:http://www.jianshu.com/p/4986100eff90):

    public class BaseApp extends Application {
    
        private DaoMaster.DevOpenHelper mHelper;
        private SQLiteDatabase db;
        private DaoMaster mDaoMaster;
        private DaoSession mDaoSession;
        public static  BaseApp instances;
     
        @Override
        public void onCreate() {
            super.onCreate();
            instances = this;
            setDatabase();        
        }
    
        public static BaseApp getInstances(){
             return instances;
        }
    
    /**
     * 设置greenDao
     */
        private void setDatabase() {
            // 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
            // 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。
            // 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
            // 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
            mHelper = new DaoMaster.DevOpenHelper(this, "notes-db", null);
            db = mHelper.getWritableDatabase();
            // 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。 
            mDaoMaster = new DaoMaster(db); 
            mDaoSession = mDaoMaster.newSession();
         }
        public DaoSession getDaoSession() {
             return mDaoSession;
        }
        public SQLiteDatabase getDb() {
             return db;
        }
    }
    

    上面说了,那句话要在 activity 里,那就打开主activity.

    -------------------------------------------------------------------------------------

    4. 主activity中加入实体操作

        该怎么写呢?  以下这样,出错了,看标红:

        

       那又该如何做????   脑袋中直冒金星!!!

       *****************************************************************************

      经过多方测试,发现我的User 实体放的位置不对!应该放到 JAVA下面的 COM.example.***下面,再 build project这样就不会有问题了。

      正确的姿势应该这样:

    package com.example.ssqhan.mydbtest;
    
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.TextView;
    
    import org.greenrobot.greendao.query.QueryBuilder;
    
    import java.util.List;
    
    public class MainActivity extends AppCompatActivity {
        MenuDao mMenuDao;
       TextView tv;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
            creatTable();
            tv=findViewById(R.id.tv);
            tv.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    QueryBuilder<Menu> queryMenu = mUserDao.queryBuilder();
                    queryMenu.where(MenuDao.Properties.Id.eq(1));
                    List<Menu> list = queryMenu.list();
                    tv.setText((list.get(0)).getName());
                }
            });
        }
        public void creatTable(){
           mMenuDao = BaseApp.getInstances().getDaoSession().getMenuDao();
           Menu menu = new Menu((long)1,"MenuItem");
           mMenuDao.insert(menu);
        }
    }

    上面的代码,,点击运行,答案出来了。。。tv的text 变成了  MenuItem(我把User实体换成了Menu)  别的都一样!

  • 相关阅读:
    Redis学习-开始
    MongoDb学习1
    Git删除tag
    简单实现Windows服务 TopShelf
    autofac 注入普通服务和WCF服务
    MVC过滤器之 OnActionExcuted
    jquery的$.extend()、$.fn和$.fn.extend()
    quartz_jobs.xml标准配置
    常用工具类11-上传类
    常用工具类10-上传水印类
  • 原文地址:https://www.cnblogs.com/ssqhan/p/8082690.html
Copyright © 2020-2023  润新知