简介
greenDao是一个使用于android的ORM框架,现在主流的ORM框架有OrmLite,SugarORM,Active Android,Realm以及GreenDAO.greenDao的性能远远高于同类的ORM框架,具体的测试结果官网有。
示例代码
https://github.com/7449/AndroidDevelop/tree/master/greenDao
3.0示例代码
https://github.com/7449/AndroidDevelop/tree/master/greendao_3.0
读写第三方数据表,示例代码
https://github.com/7449/AndroidDevelop/tree/master/greenDaoExternal
有时候数据表会由后台分发而不是自动生成,所以这里简单介绍下怎么使用greendao操作这种情况下的数据表
需要注意以下几点
1:android数据库操作都是在databases文件夹下,所以要把需要动的数据库复制到databases文件夹下
/**
* assets目录下的db转移到databases
*/
public void copyDBToDatabases() {
try {
String outFileName = DB_PATH + DB_NAME;
File file = new File(DB_PATH);
if (!file.mkdirs()) {
file.mkdirs();
}
File dataFile = new File(outFileName);
if (dataFile.exists()) {
dataFile.delete();
}
InputStream myInput;
myInput = getApplicationContext().getAssets().open(DB_NAME);
OutputStream myOutput = new FileOutputStream(outFileName);
byte[] buffer = new byte[1024];
int length;
while ((length = myInput.read(buffer)) > 0) {
myOutput.write(buffer, 0, length);
}
myOutput.flush();
myOutput.close();
myInput.close();
} catch (IOException e) {
Log.i(TAG, "error--->" + e.toString());
e.printStackTrace();
}
}
2:geenDao自动生成的时候table 默认为TABLENAME,默认id生成时"_id",这些生成的字段必须要和数据表中的字段一致,可以用 nameInDb="" 指定字段name和tableName
@Entity(nameInDb = "blacklist")
public class ExternalBean {
@Property(nameInDb = "id")
private Integer id;
@Property(nameInDb = "email")
private String email;
@Generated(hash = 1314000312)
public ExternalBean(Integer id, String email) {
this.id = id;
this.email = email;
}
@Generated(hash = 981826822)
public ExternalBean() {
}
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
public String getEmail() {
return this.email;
}
public void setEmail(String email) {
this.email = email;
}
}
3.x更新
项目build.gradle添加
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.0'
app下的build.gradle添加
apply plugin: 'org.greenrobot.greendao'
compile 'org.greenrobot:greendao:3.2.0'
//修改生成类的位置
greendao {
targetGenDir 'src/main/java/' //生成源文件的目录,默认是build目录中的(build/generated/source/greendao)
// daoPackage //生成的DAO,DaoMaster和DaoSession的包名。默认是实体的包名
// schemaVersion //当前数据库结构的版本
// generateTests //设置是否自动生成单元测
// targetGenDirTest //生成的单元测试的根目录
}
然后自定义UserBean类
@Entity
public class UserBean {
@Id
private Long id;
private String name;
private int age;
@Generated(hash = 1032023074)
public UserBean(Long id, String name, int age) {
this.id = id;
this.name = name;
this.age = age;
}
@Generated(hash = 1203313951)
public UserBean() {
}
}
注解:
@Entity 定义实体
@nameInDb 在数据库中的名字,如不写则为实体中类名
@indexes 索引
@createInDb 是否创建表,默认为true,false时不创建
@schema 指定架构名称为实体
@active 无论是更新生成都刷新
@Id
@NotNull 不为null
@Unique 唯一约束
@ToMany 一对多
@OrderBy 排序
@ToOne 一对一
@Transient 不存储在数据库中
@generated 由greendao产生的构造函数或方法
重新rebuild 一下项目,就可以看到greenDao自动生成的数据库相关类,比2.X时确实好用多了,之后用法还和以前一样