目录

Android开发之greenDAO学习笔记

GreenDao 优点:

  • 性能高,号称Android最快的关系型数据库

  • 内存占用小

  • 库文件比较小,小于100K,编译时间低,而且可以避免65K方法限制

  • 支持数据库加密 greendao支持SQLCipher进行数据库加密 有关SQLCipher可以参考这篇博客Android数据存储之Sqlite采用SQLCipher数据库加密实战

  • 简洁易用的API

GreenDao主要类介绍:

DaoMaster:该类是使用greenDao的主要入口。DaoMaster负责控制数据库对象和管理指定数据库的DAO类。DaoMaster提供了静态的方法去创建数据库表或者删除它们。他的内部类OpenHelper、DevOpenHelper是SQLiteOpenHelper的实现类,它们在SQLite数据库中负责创建数据库。

**DaoSession:**DaoSeesion对象负责为指定的数据库管理所有的可用的DAO对象,你可以通过getter方法获取到DaoSeession的实例。DaoSession也针对实体bean提供了增删改查等api接口,DaoSession也保持了对标识范围的跟踪。

**DAOs:**数据获取(DAOs)持久化的对象并查询实体。 对于每个实体,greenDAO为它生成一个DAO类。 它具有比DaoSession更多的持久化方法,例如:count,loadAll和insertInTx。

**Entities:**持久化对象,通常,实体是使用标准Java属性(如POJO或JavaBean)表示数据库行的对象。

集成:

1、you need to add the greenDao Gradle plugin to your project’s build.gradle

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
apply from:"config.gradle"

buildscript {
    ...
    dependencies {
       ...
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1'
    }
}

...

2、you need to add the greenDao library to your module’s build.gradle

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao'

android {
...

}
  //greendao配置
    greendao {
        //版本号,升级时可配置
        schemaVersion 1                             
    }
dependencies {
    compile 'org.greenrobot:greendao:3.2.0'
}

3、core initialization

1
2
3
4
5
6
7
// 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();

greenDao注解学习笔记:

@Entity:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
@Entity(
        // If you have more than one schema, you can tell greenDAO
        // to which schema an entity belongs (pick any string as a name).
        schema = "myschema",

        // Flag to make an entity "active": Active entities have update,
        // delete, and refresh methods.
        active = true,

        // Specifies the name of the table in the database.
        // By default, the name is based on the entities class name.
        nameInDb = "AWESOME_USERS",

        // Define indexes spanning multiple columns here.
        indexes = {
                @Index(value = "name DESC", unique = true)
        },

        // Flag if the DAO should create the database table (default is true).
        // Set this to false, if you have multiple entities mapping to one table,
        // or the table creation is done outside of greenDAO.
        createInDb = false,

        // Whether an all properties constructor should be generated.
        // A no-args constructor is always required.
        generateConstructors = true,

        // Whether getters and setters for properties should be generated if missing.
        generateGettersSetters = true
)
public class User {
  ...
}

@Entity注解标记一个java类将作为greenDAO的持久化实体。

schema:指定数据库,如果你有多个数据库时可以为表指定对应的数据库。

active:标记一个实体是否时激活的,激活状态下的实体bean将获得更新,删除,刷新方法。

nameInDb:指定表在数据库中的表名,默认为实体类的类名。

indexes:定义索引,可以跨越多个列

createInDb:标记是否创建数据库表

generateConstructors:标记是否所有的属性的构造方法都被生成

generateGettersSetters:标记如果属性的setters和getters方法缺少时是否自动生成。

基本属性:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
@Entity
public class User {
    @Id(autoincrement = true)
    private Long id;

    @Property(nameInDb = "USERNAME")
    private String name;

    @NotNull
    private int repos;

    @Transient
    private int tempUsageCount;

    ...
}

@Id:主键 Long型,可以通过@Id(autoincrement = true)设置自增长

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

@NotNull:设置数据库表当前列不能为空

@Transient:添加次标记之后不会生成数据库表的列

@Index**:**使用@Index作为一个属性来创建一个索引,通过name设置索引别名,也可以通过unique给索引添加约束

@Unique**:**向数据库列添加了一个唯一的约束

**@ToOne:**定义与另一个实体(一个实体对象)的关系

**@ToMany:**定义与多个实体对象的关系