GreeDAO-Simple-Generate,基于de.greenrobot:greendao-generator项目,运用少量java注解简化Greendao的生成难度。
这是我的第一个开源项目,源码托管在github,项目已经发布到maven中心,欢迎大家改进。

引入

    dependencies {
	    compile 'com.github.ichenkaihua:greendao-generate:0.0.4'
	}
    repositories {
	     mavenCentral()
	}

注解生成GreenDao

package com.dreamliner.ckh.greendao;
	
	import com.github.ichenkaihua.greendao.annotation.EntityInject;
	import com.github.ichenkaihua.greendao.annotation.GenerateConfig;
	import com.github.ichenkaihua.greendao.annotation.SchemaConfig;
	import com.github.ichenkaihua.greendao.pojo.GenerateInfo;
	import com.github.ichenkaihua.greendao.pojo.SchemaInfo;
	import com.github.ichenkaihua.greendao.service.GenerateService;
	
	import de.greenrobot.daogenerator.Entity;
	import de.greenrobot.daogenerator.Schema;
	
	//GenerateConfig.outDir: 输出文件夹路径,必须存在这个路径,为避免出错,建议路径分隔符用 /
	//这个路径可以是绝对路径,/home/chenkaihua/workspace/QueryScore/src/main/java
	//也可以是相对路径,比如在同一个workspace的android项目名为 MyAndroidProject,则可以写成 ../MyAndroidProject/src
	//特别注意的是,如果是android studio项目,应该这样写 app/src/main/java
	// GenerateConfig.SchemaConfig.defaultJavaPackage 生成的entity的所在包,如果没有包名或包名不完全,则greendao会自动创建
	//GenerateConfig.SchemaConfig.defaultJavaPackageDao 生成的dao类所在包,如果没有包名或包名不完全,则greendao会自动创建
	@GenerateConfig(outDir = "/home/chenkaihua/workspace/QueryScore/src/main/java",
           schemaConfig = @SchemaConfig(defaultJavaPackage = "com.dreamlienr.queryscore.entity", 
          defaultJavaPackageDao = "com.dreamlienr.queryscore.dao"))
	public class Main {
	
		// 通过EntityInject注解,可以定义Entity的名字
		public void createUserEntity(@EntityInject("User") Entity user) {
			user.addIdProperty();
			user.addStringProperty("name");
			user.setSkipGeneration(true);
	
		}
	
		// 还可以定义Entity其他属性
		void createStudentEntity(
				@EntityInject(value = "Student", implementsSerializable = true, tableName = "MY_STUDENT") Entity student) {
			student.addIdProperty();
			student.addStringProperty("name");
	
		}
	
		// 可以注入多个Entity
		private void createMulitEntity(@EntityInject("Order") Entity order,
				@EntityInject("Photo") Entity photo) {
			order.addIdProperty();
			order.addStringProperty("name");
			photo.addIdProperty();
			photo.addStringProperty("path");
		}
	
		// 当然,你也可以注入de.greenrobot.daogenerator.Schema。
		// 也可以注入 GenerateInfo,GenerateInfo对象就是@GenerateConfig的注解信息
		// 还可以注入SchemaInfo ,SchemaInfo就是@SchemaConfig的信息
		void createMuiltEntityBySchema(Schema schema, GenerateInfo generateInfo,
				SchemaInfo schemaInfo) {
	
			System.out.println("Generate Info :" + generateInfo);
			System.out.println("Schema Info :" + schemaInfo);
			Entity dog = schema.addEntity("Dog");
			dog.addIdProperty();
			dog.addStringProperty("name");
	
			Entity cat = schema.addEntity("Cat");
			cat.addIdProperty();
			cat.addStringProperty("name");
	
		}
	
		// Main方法
		public static void main(String[] args) {
			// 传入带有类注解的Main.class类,GreenDao-Simple-Generate将会扫描类注解,配置输出路径,输出包名
			// 然后扫描这个类下的所有(public protected甚至private)方法
			// 如果方法参数有Schema、GenerateInfo、SchemaInfo、@EntityInject注解,则系统会注入相应对象
			// 最后调用这个方法
			new GenerateService(Main.class).generate();
		}
	
	}


	// Main方法
	public static void main(String[] args) {
		// 传入带有类注解的Main.class类,GreenDao-Simple-Generate将会扫描类注解,配置输出路径,输出包名
		// 然后扫描这个类下的所有(public protected甚至private)方法
		// 如果方法参数有Schema、GenerateInfo、SchemaInfo、@EntityInject注解,则系统会注入相应对象
		// 最后调用这个方法
		new GenerateService(Main.class).generate();
	}

注解详情

GreeDAO-Simple-Generate定义了三个注解:

  • @GenerateConfig:类注解,用于定义输出配置。属性有:
    • outDir:定义输出目录-String类型,必填项。
    • outDirTest: 定义测试文件输出目录,String类型。
    • outDirEntity: 定义Entityjava源文件输出目录,String类型。
    • schemaConfig:配置数据库信息,com.github.ichenkaihua.greendao.annotation.SchemaConfig类型,必填项。
  • @SchemaConfig:配置数据库信息,属性有:
    • version: 定义版本,int类型,默认值为1
    • enableKeepSectionsByDefault:是否默认保存keep区的代码,boolean型,默认为true
    • enableActiveEntitiesByDefault:目前不知道作用,String类型。
    • defaultJavaPackage:默认的java包名,String类型,必填项。
    • defaultJavaPackageTest:默认输出测试文件的包名。
    • defaultJavaPackageDao: 默认输出daojava类的包名。
  • @EntityInject:方法参数注解,注解一个entity,被注解的类型必须是de.greenrobot.daogenerator.Entity类型或者其子类。属性有:
    • value:entity的java类名,String类型,必填项。
    • implementsSerializable:是否让entity实现java.io.Serializable接口,boolean类型,默认为false
    • tableName,表名,如果不填,则表名为java类名的大写字母,驼峰用_分开。String类型。

自动注入类型

处理上面的注解注入,GreeDAO-Simple-Generate支持对一下类型自动注入,即不需要用注解显示注入的类型:

  • de.greenrobot.daogenerator.Schema:对应greendao-genetede.greenrobot.daogenerator.Schema
  • com.github.ichenkaihua.greendao.pojo.GenerateInfo:对应@GenerateConfig注解属性。
  • com.github.ichenkaihua.greendao.pojo.SchemaInfo:对应@SchemaConfig属性。

生成greendao代码

public static void main(String[] args) {			
			new GenerateService(Main.class).generate();
		}

构造GenerateService时需要传入一个使用了@GenerateConfig注解的class。如果传入的class没有注解@GenerateConfig,则会报错。最后调用generate()方法即可生成android端greendao代码。