[Android]GreenDao(1)--项目配置

项目配置

  • grdle配置

    在Android Studio的gradle配上

    compile ‘de.greenrobot:greendao:1.3.7’

    compile ‘de.greenrobot:greendao-generator:1.3.1’

  • 项目配置

注意,src-gen是我们新建一个文件夹,用来放GreenDao生成的文件

未完成该步骤之前,src-gen是空文件夹,我们需要新建一个包,在该包下新建一个Java文件,做初始化工作。

如图所示,我创建了名为’com.usst.chensl.introducdemo.db’的包,和名为’ExampleDaoGenerator’的Java文件。

ExampleDaoGenerator文件如下

package com.usst.chensl.introducdemo.db;

import de.greenrobot.daogenerator.DaoGenerator;
import de.greenrobot.daogenerator.Entity;
import de.greenrobot.daogenerator.Schema;

/**
 * 初始化工作
 * Created by ChenSL on 2015/8/14.
 */
public class ExampleDaoGenerator {

    private static void addTaskDetail(Schema schema) {
        //指定实体类
        Entity entity = schema.addEntity("User");
        //添加id属性
        entity.addIdProperty();
        //添加列userId,指定非空,默认可为空
        entity.addStringProperty("userId").notNull();
        //添加列username
        entity.addStringProperty("username");
        //添加列age
        entity.addIntProperty("age");
        //添加列phone
        entity.addStringProperty("phone");
    }

    public static void main(String[] args) throws Exception {
        //第一个参数是数据库版本号,第二个参数是所在包名
        Schema schema = new Schema(1, "com.usst.chensl.introductdemo.db");
        addDetail(schema);

        try {
            //第二个参数是我们前面新建的空文件夹sec-gen,这里采用相对路径的写法
            //‘..‘代表工程前一个目录,接着是工程名/app(AndroidStudio生成)/src-gen(自己建的)
            new DaoGenerator().generateAll(schema, "../IntroducDemo/app/src-gen");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

Entity可以看作是一张表,它使用构造器模式来设计,可以指定某一列的各种数据库属性,例如非空,自增,升降序,主键等。

注意:必须要使用run main()这种方法,在AndroidStudio下直接对该文件右键即可选择run main(),之前LZ试过在onCreate()里跑结果报错

下面来看看初始化出来的东西:

  • user实体类,注释已经说明是GreenDao自动生成的。其实就跟自己建实体类一样,不过现在是代码自动生成

    package com.usst.chensl.introductdemo.db;
    
    // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT. Enable "keep" sections if you want to edit.
    /**
     * Entity mapped to table USER.
     */
    public class User {
    
        private Long id;
        private String userId;
        private String username;
        private String age;
        private String phone;
    
        public User() {
        }
    
        public User(Long id) {
            this.id = id;
        }
    
        public User(Long id, String userId, String username, String age, String phone) {
            this.id = id;
            this.userId = userId;
            this.username = username;
            this.age = age;
            this.phone = phone;
        }
    
        public Long getId() {
            return id;
        }
    
        public void setId(Long id) {
            this.id = id;
        }
    
        public String getUserId() {
            return userId;
        }
    
        public void setUserId(String userId) {
            this.userId = userId;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public String getAge() {
            return age;
        }
    
        public void setAge(String age) {
            this.age = age;
        }
    
        public String getPhone() {
            return phone;
        }
    
        public void setPhone(String phone) {
            this.phone = phone;
        }
    
    }
    
  • userDao,如果自己实现过简单的ORM框架的话,很容易就看出这个是对sql语句的包装,有createTable()dropTable,readEntity,updateKeyAfterInsert,这些望文生义的方法
    package com.usst.chensl.introductdemo.db;
    
    import android.database.Cursor;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteStatement;
    
    import de.greenrobot.dao.AbstractDao;
    import de.greenrobot.dao.Property;
    import de.greenrobot.dao.internal.DaoConfig;
    
    import com.usst.chensl.introductdemo.db.User;
    
    // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
    /**
     * DAO for table USER.
    */
    public class UserDao extends AbstractDao<User, Long> {
    
        public static final String TABLENAME = "USER";
    
        /**
         * Properties of entity User.<br/>
         * Can be used for QueryBuilder and for referencing column names.
        */
        public static class Properties {
            //参数分别是(列数,类型,Java实体类的变量名,是否主键,数据库列名)
            //因为上面有entity.addIdProperty(),所以自动生成了主键‘_id‘
            public final static Property Id = new Property(0, Long.class, "id", true, "_id");
            public final static Property UserId = new Property(1, String.class, "userId", false, "USER_ID");
            public final static Property Username = new Property(2, String.class, "username", false, "USERNAME");
            public final static Property Age = new Property(3, String.class, "age", false, "AGE");
            public final static Property Phone = new Property(4, String.class, "phone", false, "PHONE");
        };
    
        public UserDao(DaoConfig config) {
            super(config);
        }
    
        public UserDao(DaoConfig config, DaoSession daoSession) {
            super(config, daoSession);
        }
    
        /** Creates the underlying database table. */
        public static void createTable(SQLiteDatabase db, boolean ifNotExists) {
            String constraint = ifNotExists? "IF NOT EXISTS ": "";
            db.execSQL("CREATE TABLE " + constraint + "‘USER‘ (" + //
                    "‘_id‘ INTEGER PRIMARY KEY ," + // 0: id
                    "‘USER_ID‘ TEXT," + // 1: userId
                    "‘USERNAME‘ TEXT," + // 2: username
                    "‘AGE‘ TEXT," + // 3: age
                    "‘PHONE‘ TEXT);"); // 4: phone
        }
    
        /** Drops the underlying database table. */
        public static void dropTable(SQLiteDatabase db, boolean ifExists) {
            String sql = "DROP TABLE " + (ifExists ? "IF EXISTS " : "") + "‘USER‘";
            db.execSQL(sql);
        }
    
        /** @inheritdoc */
        @Override
        protected void bindValues(SQLiteStatement stmt, User entity) {
            stmt.clearBindings();
    
            Long id = entity.getId();
            if (id != null) {
                stmt.bindLong(1, id);
            }
    
            String userId = entity.getUserId();
            if (userId != null) {
                stmt.bindString(2, userId);
            }
    
            String username = entity.getUsername();
            if (username != null) {
                stmt.bindString(3, username);
            }
    
            String age = entity.getAge();
            if (age != null) {
                stmt.bindString(4, age);
            }
    
            String phone = entity.getPhone();
            if (phone != null) {
                stmt.bindString(5, phone);
            }
        }
    
        /** @inheritdoc */
        @Override
        public Long readKey(Cursor cursor, int offset) {
            return cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0);
        }    
    
        /** @inheritdoc */
        @Override
        public User readEntity(Cursor cursor, int offset) {
            User entity = new User( //
                cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0), // id
                cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1), // userId
                cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2), // username
                cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3), // age
                cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4) // phone
            );
            return entity;
        }
    
        /** @inheritdoc */
        @Override
        public void readEntity(Cursor cursor, User entity, int offset) {
            entity.setId(cursor.isNull(offset + 0) ? null : cursor.getLong(offset + 0));
            entity.setUserId(cursor.isNull(offset + 1) ? null : cursor.getString(offset + 1));
            entity.setUsername(cursor.isNull(offset + 2) ? null : cursor.getString(offset + 2));
            entity.setAge(cursor.isNull(offset + 3) ? null : cursor.getString(offset + 3));
            entity.setPhone(cursor.isNull(offset + 4) ? null : cursor.getString(offset + 4));
         }
    
        /** @inheritdoc */
        @Override
        protected Long updateKeyAfterInsert(User entity, long rowId) {
            entity.setId(rowId);
            return rowId;
        }
    
        /** @inheritdoc */
        @Override
        public Long getKey(User entity) {
            if(entity != null) {
                return entity.getId();
            } else {
                return null;
            }
        }
    
        /** @inheritdoc */
        @Override
        protected boolean isEntityUpdateable() {
            return true;
        }
    
    }
    
  • DaoSession,数据库Session
    package com.usst.chensl.introductdemo.db;
    
    import android.database.sqlite.SQLiteDatabase;
    
    import java.util.Map;
    
    import de.greenrobot.dao.AbstractDao;
    import de.greenrobot.dao.AbstractDaoSession;
    import de.greenrobot.dao.identityscope.IdentityScopeType;
    import de.greenrobot.dao.internal.DaoConfig;
    
    import com.usst.chensl.introductdemo.db.User;
    
    import com.usst.chensl.introductdemo.db.UserDao;
    
    // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
    
    /**
     * {@inheritDoc}
     *
     * @see de.greenrobot.dao.AbstractDaoSession
     */
    public class DaoSession extends AbstractDaoSession {
    
        private final DaoConfig userDaoConfig;
    
        private final UserDao userDao;
    
        public DaoSession(SQLiteDatabase db, IdentityScopeType type, Map<Class<? extends AbstractDao<?, ?>>, DaoConfig>
                daoConfigMap) {
            super(db);
    
            userDaoConfig = daoConfigMap.get(UserDao.class).clone();
            userDaoConfig.initIdentityScope(type);
    
            userDao = new UserDao(userDaoConfig, this);
    
            registerDao(User.class, userDao);
        }
    
        public void clear() {
            userDaoConfig.getIdentityScope().clear();
        }
    
        public UserDao getUserDao() {
            return userDao;
        }
    
    }
    
  • DaoMaster,对SQLiteDatabase的封装,包含了UserDao
    package com.usst.chensl.introductdemo.db;
    
    import android.content.Context;
    import android.database.sqlite.SQLiteDatabase;
    import android.database.sqlite.SQLiteDatabase.CursorFactory;
    import android.database.sqlite.SQLiteOpenHelper;
    import android.util.Log;
    import de.greenrobot.dao.AbstractDaoMaster;
    import de.greenrobot.dao.identityscope.IdentityScopeType;
    
    import com.usst.chensl.introductdemo.db.UserDao;
    
    // THIS CODE IS GENERATED BY greenDAO, DO NOT EDIT.
    /**
     * Master of DAO (schema version 1): knows all DAOs.
    */
    public class DaoMaster extends AbstractDaoMaster {
        public static final int SCHEMA_VERSION = 1;
    
        /** Creates underlying database table using DAOs. */
        public static void createAllTables(SQLiteDatabase db, boolean ifNotExists) {
            UserDao.createTable(db, ifNotExists);
        }
    
        /** Drops underlying database table using DAOs. */
        public static void dropAllTables(SQLiteDatabase db, boolean ifExists) {
            UserDao.dropTable(db, ifExists);
        }
    
        //抽象类
        public static abstract class OpenHelper extends SQLiteOpenHelper {
    
            public OpenHelper(Context context, String name, CursorFactory factory) {
                super(context, name, factory, SCHEMA_VERSION);
            }
    
            @Override
            public void onCreate(SQLiteDatabase db) {
                Log.i("greenDAO", "Creating tables for schema version " + SCHEMA_VERSION);
                createAllTables(db, false);
            }
        }
    
        //真正实现类
        /** WARNING: Drops all table on Upgrade! Use only during development. */
        public static class DevOpenHelper extends OpenHelper {
    
            public DevOpenHelper(Context context, String name, CursorFactory factory) {
                super(context, name, factory);
            }
    
            @Override
            public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
                Log.i("greenDAO", "Upgrading schema from version " + oldVersion + " to " + newVersion + " by dropping all tables");
                dropAllTables(db, true);
                onCreate(db);
            }
        }
    
        public DaoMaster(SQLiteDatabase db) {
            super(db, SCHEMA_VERSION);
            registerDaoClass(UserDao.class);
        }
    
        public DaoSession newSession() {
            return new DaoSession(db, IdentityScopeType.Session, daoConfigMap);
        }
    
        public DaoSession newSession(IdentityScopeType type) {
            return new DaoSession(db, type, daoConfigMap);
        }
    
    }
    

DbMaster的最终目的是获取DbSession,通过DbSession对数据库进行操作。

下一篇说GreenDao具体使用,敬请期待~

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-05 01:01:54

[Android]GreenDao(1)--项目配置的相关文章

Android greenDao的简单配置和使用

最近自学做东西的时候用到了一个收藏的功能,然后我想把东西存放到SQLite当中,然而自己传值的时候都是用到的实体类,所以存起来也比较麻烦,所以从网上找到一个greenDao的开源框架非常火,不仅效率高,而且内存也占用的小,非常方便. 这里我就简单介绍一下如何配置,至于其他的增.删.改.查了,网上都很多,需要用到的小伙伴们自己去查吧!! 首先我们得明白,greenDao是一个Java代码模版的快速生成器,里面封装好了我们实体类的各种操作.所以 1.我们要用eclipse或者Myeclipse建一个

Android Studio下项目构建的Gradle配置及打包应用变体

Gradle简介 ??Gradle是一个自动化构建工具,采用Groovy的Domain Specific Language(领域特定语言)来描述和控制构建逻辑.具有语法简洁.可读性强.配置灵活等特点.基于Intellij IDEA社区版本开发的Android Studio天生支持Gradle构建程序.Groovy是一种基于JVM的敏捷开发语言,结合了Phthon.Ruby和Smalltalk的许多强大特性.同时,Groovy代码既能够与java代码很好地结合,也能够用于扩展现有的代码. Grad

Android Gradle Pluin指南(三)——依赖关系、android库和多项目配置

原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Dependencies-Android-Libraries-and-Multi-project-setup 4.Dependencies,Android Libraries and Multi-project setup(依赖关系,Android库和多项目设置) Gradle项目可以依赖于其它组件.这些组件可以是外部二进制包,或者是其它的Gradle项

Android Gradle Plugin指南(三)——依赖关系、android库和多项目配置

原文地址:http://tools.android.com/tech-docs/new-build-system/user-guide#TOC-Dependencies-Android-Libraries-and-Multi-project-setup 4.Dependencies.Android Libraries and Multi-project setup(依赖关系,Android库和多项目设置) Gradle项目能够依赖于其他组件.这些组件能够是外部二进制包,或者是其他的Gradle项

OSG for Android新手教程系列(二)——项目配置

在上一篇教程中,主要介绍了如何把OSG源代码编译成为能够在Android项目下使用的函数库.在这一篇教程中,我将针对如何在自己的Android项目中配置OSG函数库进行详细讲解. 现阶段网上关于OSGfor Android的配置方式教程有很多,但是大部分在实际使用起来都会或多或少的出现一些问题,无法完全照搬,需要一定的修改.而且,对于配置中的那些变量的具体含义,也很少有人能够进行仔细的讲解.这非常不利于新手的学习和理解,往往会造成出现bug后面对满屏幕的错误log完全一脸茫然的情况. 所以我将在

Android Studio 下项目的依赖配置

Android Studio 下项目的依赖配置 背景 项目需要用到一个github上的开源库swipelistview,原来在eclipse环境下配置过相关的依赖(导入jar包或者是lib依赖),但是在Android Studio下还是没有操作过.上网查了一下相关的资料,在stackoverflow上找到了答案.根据上面的介绍,结合实际情况,完成了依赖配置. stackoverflow答案地址 有两种方式来进行依赖配置. 1. 使用aar包(这个不太清楚原理和效果,简单查了一下和maven相关,

一起学Google Daydream VR开发,快速入门开发基础教程一:Android端开发环境配置一

原文因涉及翻墙信息,被强制删除,此文为补发! 准备工作 进入Google Daydream开发者官网,开启准备工作,官网地址:https://vr.google.com/daydream/developers/ -------------------------------------------------------------------------------------------------------------------- Google Daydream开发者网址: https

ReactNative项目配置要点

这篇文章存在问题, 仅供参考, 完整配置参见: http://www.jianshu.com/p/7a6639d67783 今天尝试运行ReactNative的Example项目, 在配置项目时候, 需要注意几点事项. 1. npm install缓慢 npm install运行很慢, 无法忍受, 更换缓存服务器可以加快速度. npm install -g cnpm --registry=http://registry.npm.taobao.org 参考: http://blog.csdn.ne

Mac下Android studio 之NDK配置教程

Mac下Android studio 之NDK配置教程(一) 1.概述 最近项目全线转移到Mac下使用使用Android studio开发.遇到关键代码封装到 ***native***层,此时在win下的NDK配置步骤全部失效. 为此,花费了大量时间用来查阅资料,在此,记录下来,分享给大家供以后配置中作为参考. 2.环境 本人使用的开发配置 是:MAC OS 10.10 +androioid studio 1.2+android-ndk-r10e-darwin-x86_64+git .其他配置类