• GreenDao使用解析


    GreenDao是一个轻量级的数据库框架,相比Xutils 等他的速度和效率会更快更好

    这里展示GreenDao 的使用方法

    ①建立

    compile 'org.greenrobot:greendao:3.2.0'
    

      基于Android Studio 的集成非常简单,你需要现在Build Gradle里依赖此GreenDao库

    除此之外,你还需要在Build Gradle里使用插件的形式声明

    //使用greendao
    apply plugin: 'org.greenrobot.greendao'
    

      还应该在build.gradle里配置dao 的package和targetGenDir 和 version,此配置应是在android{ }内声明

     

      //greendao配置
        greendao {
            //版本号,升级时可配置
            schemaVersion 1
            daoPackage 'arcturis.greendao'
            targetGenDir 'src/main/java'
    
        }
    

      补充一句,数据库的使用是需要SD卡的读写权限的所以别忘了添加权限

        <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
        <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    

      tips!还需要再工程的build.gradle里声明,此处位于dependencies{ }内

            //GreenDao3依赖
            classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'

    ②代码自动生成机制

    GreenDao 的数据基类生成方式和xutils不一样,Xutils你需要手动去写bean类,然后和他的一些get Set方法,虽然Green也需要你去写,但是他更多亮点的东西是自动生成这些相关方法,包括他的数据库声明以及控制文件

    比如我们需要一个列表购物的清单文件这个商品我们需要保存于数据库中

    类似于这个是开始的bean基类

    @Entity
    public class Shop {
        //表示为购物车列表
        public static final int TYPE_CART = 0x01;
        //表示为收藏列表
        public static final int TYPE_LOVE = 0x02;
    
        //不能用int
        @Id(autoincrement = true)
        private Long id;
    
        //商品名称 Unique 该属性值必须在数据库中是唯一值
        @Unique
        private String name;
    
        //商品价格 Property 可以自定义字段名,注意外键不能使用该属性
        @Property(nameInDb = "price")
    
        private String price;
        //已售数量
        private int sell_num;
        //图标url
        private String image_url;
        //商家地址
        private String address;
        //商品列表类型
        private int type;
    }
    

      这里就是一个基本的bean基类,我们需要注解,这样GreenDao才会知道这个是我们的bean基类,才会有后面的自动生成代码的部分,然后我们看下各个注解的意思

    @Entity 这个是一个Bean基类Entity
    @Id(autoincrement = true) ID 可以设置是否自增涨,开启自增长之后就算初始化你传入null也没有关系,类型为Long型
    @Unique 由此标识标识在数据库中此字段为唯一

    @Property:设置一个非默认关系映射所对应的列名,默认是使用字段名,例如:@Property(nameInDb = "name")

    之后点击编译按钮,然后如果各项设置均准确设置成功,GreenDao就会帮助我们生成以下文件

     

    就是标红的三个文件

    DaoMaster

    DaoSession

    ShopDao(这个名字是根据我们定义的bean类类名字来定义的)

    然后我们就可以在Application里进行初始化工作

       private void steupDataBase(){
            DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this,"shop.db",null);
    
            //获取可写DataBase
            SQLiteDatabase db = helper.getWritableDatabase();
            //获取数据库对象
            DaoMaster daoMaster = new DaoMaster(db);
            //获取Dao对象管理者
            daoSession = daoMaster.newSession();
        }
    

      

    DaoMaster:

    使用 greenDAO 的入口点。DaoMaster 负责管理数据库对象(SQLiteDatabase)和 DAO 类(对象),我们可以通过它内部类 OpenHelper 和 DevOpenHelper SQLiteOpenHelper 创建不同模式的 SQLite 数据库。

    DaoSession :

    管理指定模式下的所有 DAO 对象,DaoSession提供了一些通用的持久性方法比如插入、负载、更新、更新和删除实体。

    XxxDAO :

    每个实体类 greenDAO  多会生成一个与之对应DAO对象,如:User 实体,则会生成一个一个UserDao 类

    这样我们就将GreenDao建立完成

    还需要获取daoSession的实例

       private static DaoSession  daoSession;
    
        public static DaoSession getDaoinstan(){
            return daoSession;
        }
    

      使用静态方法获取DaoSession的实例,就可以进行数据库的增删改查操作。

    ③如何将GreenDao生成在特定的CD卡位置

    有时候我们需要将GreenDao声称在特定的位置,这个时候我们怎么做,GreenDao也给我们提供了定制的机会,按照以下类写即可

    此类继承自contextWrapper需重写getDatabasePath方法

    public class GreenDaoContext extends ContextWrapper {
    
        private Context mContext;
    
        public GreenDaoContext(){
            super(MyApplication.getContext());
            this.mContext = MyApplication.getContext();
        }
    
        @Override
        public File getDatabasePath(String dbName) {
    
            String dbBasePath = AppPathUtils.getDbCacheBaseDir(mContext);
    
            File dbDir = new File(dbBasePath);
            if(!dbDir.exists()){
                dbDir.mkdirs();
            }
    
            StringBuffer buffer = new StringBuffer();
            buffer.append(dbBasePath);
            buffer.append(File.separator);
            buffer.append(dbName);
    
            String dbPath = buffer.toString();
    
            File dbFile = new File(dbPath);
    
            if(!dbFile.exists()){
    
                try {
                    dbFile.createNewFile();// 创建文件
    
                } catch (IOException e) {
                    e.printStackTrace();
                }
                return dbFile;
            }else{
                return super.getDatabasePath(dbName);
            }
        }
    
    
        /***
         * 重载这个方法,是用来打开SD卡上的数据库的,android 2.3及以下会调用这个方法。
         * @param name
         * @param mode
         * @param factory
         * @return
         */
        @Override
        public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory) {
            SQLiteDatabase result =SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), factory);
            return result;
        }
    
        /**
         *  Android 4.0调用此方法获取数据库
         * @param name
         * @param mode
         * @param factory
         * @param errorHandler
         * @return
         */
        @Override
        public SQLiteDatabase openOrCreateDatabase(String name, int mode, SQLiteDatabase.CursorFactory factory, DatabaseErrorHandler errorHandler) {
            SQLiteDatabase result = SQLiteDatabase.openOrCreateDatabase(getDatabasePath(name), factory);
            return result;
        }

    然后再application里初始化的时候改变一个地方的传入值即可

       DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(new GreenDaoContext(),"shop.db",null);
    
            //获取可写DataBase
            SQLiteDatabase db = helper.getWritableDatabase();
            //获取数据库对象
            DaoMaster daoMaster = new DaoMaster(db);
            //获取Dao对象管理者
            daoSession = daoMaster.newSession();




  • 相关阅读:
    java一个字符串中出现次数最多的字符以及次数
    按要求分解字符串,输入两个数M,N;M代表输入的M串字符串,N代表输出的每串字符串的位数,不够补0。例如:输入2,8, “abc” ,“123456789”,则输出为“abc00000”,“12345678“,”90000000”
    Java 替换空格
    Java中equals()和“==”区别
    ramfs和tmpfs的区别
    C语言中的nan和inf使用
    Abp中SwaggerUI的多个接口文档配置说明
    Abp中SwaggerUI的接口说明文档配置
    Abp中SwaggerUI的接口文档添加上传文件参数类型
    Abp中自定义Exception的HttpStatusCode
  • 原文地址:https://www.cnblogs.com/fengfenghuifei/p/8917261.html
Copyright © 2020-2023  润新知