GeenDao

Android原生的api不方便之处
1.需要手动拼写sql
2.要自己写操作库的代码
3.不能自动的把数据库中的数据映射成对象
4.没有实现级联查询
GreenDao的好处
1.可以快速的开发数据库

       了解GreenDao
       1.GreenDao是一个android的开源框架
       2.ORM(Object relation mapping)将数据库中的数据映射成数据库的对象,所有的开发语言都是  面向对象的操作而数据库的基于关系型的,java操作的都是对象,这样操作对象就可以过了
       
  主流的开源框架
        1.OrmLite
            通过配置注解的操作,使用简单,也可以实现ORM机制i,性能差
        2.SugarORM
            也可以实现ORM
        3.LItePai
             可以实现多表的级联查询和数据库的升级降解
        4.GreenDao
              性能好

DaoMaster : 使用greenDAO的切入点。DaoMaster保存数据库对象(SQLiteDatabase)并管理特定模式的DAO类(而不是对象)。它有静态方法来创建表或删除它们。它的内部类OpenHelper和DevOpenHelper是SQLiteOpenHelper实现,它们在SQLite数据库中创建模式。

DaoSession:管理特定模式的所有可用DAO对象,您可以使用其中一个getter方法获取该对象。DaoSession还提供了一些通用的持久性方法,如实体的插入,加载,更新,刷新和删除。最后,DaoSession对象还跟踪身份范围。有关更多详细信息,请查看

Dao:数据访问对象(DAO)持久存在并查询实体。对于每个实体,greenDAO生成DAO。它具有比DaoSession更多的持久性方法,例如:count,loadAll和insertInTx。

(1)@Entity 实体标识
@nameInDb 在数据库中的名字,如不写则为实体中类名
@indexes 索引
@createInDb 是否创建表,默认为true,false时不创建
@schema 指定架构名称为实体
@active 无论是更新生成都刷新
(2)@Id 每条数据对应的位置,必写项
(3)@Property(nameInDb = “”) 表示该属性将作为表的一个字段,其中nameInDb属性值是在数据库 中对应的字段名称,可以自定义字段名,例如可以定一个跟实体对象字段不一样的字段名
(4)@NotNull 不为null
(5)@Unique 唯一约束 该属性值必须在数据库中是唯一值
(6)@ToMany 一对多
(7)@OrderBy 排序
(8)@ToOne 一对一 关系表
(9)@Transient 不保存于数据库
(10)@generated 由greendao产生的构造函数或方法

GreenDao基本使用步骤

1.添加依赖

   在build.gradle里添加依赖
    compile 'org.greenrobot:greendao:3.2.2' // add library
    compile 'org.greenrobot:greendao-generator:3.2.2     

2.在工程的bulid.gradle里面添加

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
    }
}

3.对greendao的generator生成文件配置

 添加在头部
apply plugin: 'org.greenrobot.greendao'

    greendao {
        schemaVersion 1  //版本
        daoPackage '生成文件包名' // 一般为app包名+生成文件的文件夹名
        targetGenDir 'src/main/java' //生成文件路径
    }

4.创建实体的Dao文件
id不要忘了加自增

@Entity
public class User {
    @Id(autoincrement = true)
    private Long id;
    @Property(nameInDb = "NAME")
    private String name;
}

创建完成之后再User类中按Ctrl+F9刷新会出现以下文件

5.通过Application调用自动生成的三个类的数据库的操作

private static App app;
private DaoMaster.OpenHelper data;
private SQLiteDatabase database;
private DaoMaster daoMaster;
private DaoSession daoSession;

不要忘了咋清单文件里面初始化

@Override
public void onCreate() {
    super.onCreate();
    app = this;
    setDataBase();
}


public static App getInstance(){
    return app;
}

private void setDataBase() {

    // 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
    // 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO已经帮你做了。
    // 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
    // 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
    data = new DaoMaster.DevOpenHelper(this, "data", null);
    database = data.getWritableDatabase();
    daoMaster = new DaoMaster(database);
    daoSession = daoMaster.newSession();
}


public SQLiteDatabase getDatabase() {
    return database;
}

public DaoSession getDaoSession() {
    return daoSession;
}

6.在Activity中调用Application中的方法做删改查

    text = findViewById(R.id.text);
    number = findViewById(R.id.number);
    userDao = App.getInstance().getDaoSession().getUserDao();
}

public void insert(View view) {
    User user = new User(null, "李世强");
    userDao.insert(user);
    Toast.makeText(this, "添加成功", Toast.LENGTH_SHORT).show();
}

public void delete(View view) {
    String trim = number.getText().toString().trim();
    int i = Integer.parseInt(trim);
    User user = new User((long)i, "李世强");
    userDao.deleteByKey(user.getId());
    Toast.makeText(this, "删除成功", Toast.LENGTH_SHORT).show();
}

public void update(View view) {
    String trim = number.getText().toString().trim();
    int i = Integer.parseInt(trim);
    User user = new User((long)i , "李世强0.0");
    userDao.update(user);
    Toast.makeText(this, "xuigai成功", Toast.LENGTH_SHORT).show();
}

public void select(View view) {
    List users = userDao.loadAll();
    String temp = "";
    for(int i = 0 ; i < users.size()  ; i++){
        temp += ","+users.get(i).getName();
        temp += users.get(i).getId();
    }
    text.setText(temp);
}

你可能感兴趣的:(个人参考,android)