欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

GreenDao 自动生成数据库

程序员文章站 2024-03-21 23:05:58
...

依赖:  详情请转到github

//根gradle
classpath 'org.greenrobot:greendao-gradle-plugin:3.2.2'
//app gradle
apply plugin: 'org.greenrobot.greendao'
greendao {
    schemaVersion 1 //数据库版本号
    daoPackage '包名.database' //设置时生成代码的目录
    targetGenDir 'src/main/java' //设置DaoMaster、DaoSession、Dao目录
}
dependencies {
    compile 'org.greenrobot:greendao:3.2.2'
}

GreenDao简介:

        GreenDao是一个将对象映射到SQLite数据库中的轻量且快速的ORM(Object Relational Mapping)
对象关系映射数据库框架,本文将讲解如何集成GreenDao3.0环境,如何使用GreenDao自动生成代码及
注解的使用。
GreenDao GitHub

GreenDao3.0优势:

GreenDao相较于ORMLite等其他数据库框架有以下优势:

1. 一个精简的库

2. 性能最大化

3. 内存开销最小化

4. 易于使用的 APIs

5. 对 Android 进行高度优化

而GreenDao3.0的版本主要使用注解方式定义实体类,通过gradle插件生成相应的代码。

用法:

@Entity(
        schema = "myschema",
        active = true,
        nameInDb = "AWESOME_USERS",
        createInDb = true
)

 

@Entity:用于标识当前实体需要GreenDao生成代码。
schema:项目中存在多个Schema时,表明当前实体属于哪个Schema。
active:标记实体是否处于活动状态,活动状态才支持更新删除刷新等操作。
nameInDb:存储在数据库中的表名,不写默认与类名一致。
createInDb:标记创建数据库表,若有多个实体关联此表可设为false避免重复创建,默认
为true。

 

属性注解:

@Id :主键Long型,可以通过@Id(autoincrement = true)设置自增长。
@Property:设置一个非默认关系映射所对应的列名,默认是的使用字段名例如@Property
        (nameInDb="name")。
@NotNul:设置数据库表当前列不能为空。
@OrderBy:指定排序。
@Transient:添加此标记之后不会生成数据库表的列。
@Generated:为build之后GreenDao自动生成的注解,为防止重复,每一块代码生成后
会加个hash作为标记。
------------
@ToMany:定义与多个实体对象一对多的关联,referencedJoinProperty为外键约束。

Query
主键:

load(Long key)
loadAll()

查询:

Query query = employeeDao.queryBuilder()
                .where(**.Properties.**.eq(**), 
**.Properties.**.ge(**))
.build();

子线程查询:

private void queryThread() {
    final Query query = **Dao.queryBuilder().build();
        new Thread(){
            @Override
            public void run()
            List list = query.forCurrentThread().list();
        }
    }.start();
}

我的github

https://github.com/tongchexinfeitao/GreenDao

greenDao参考链接:

https://blog.csdn.net/njweiyukun/article/details/51893092

grrenDao多表联查:

https://www.jianshu.com/p/dbec25bd575f

 

代码:

public class DaoManager {
    private static volatile DaoManager instance;
    private final DaoSession daoSession;

    private DaoManager(Context context) {
        daoSession = DaoMaster.newDevSession(context, "person.db");
    }

    public static DaoManager getInstance(Context context) {
        if (instance == null) {
            synchronized (DaoManager.class) {
                if (null == instance) {
                    instance = new DaoManager(context);
                }
            }
        }
        return instance;
    }

    public DaoSession getDaoSession() {
        return daoSession;
    }
}
public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";
    @BindView(R.id.btn_query)
    Button btnQuery;
    @BindView(R.id.btn_add)
    Button btnAdd;
    @BindView(R.id.btn_update)
    Button btnUpdate;
    @BindView(R.id.btn_delete)
    Button btnDelete;
    private DaoSession daoSession;
    private PersonDao dao;
    private int index;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.bind(this);
        daoSession = DaoManager.getInstance(this).getDaoSession();
        dao = daoSession.getPersonDao();
    }

    @OnClick({R.id.btn_query, R.id.btn_add, R.id.btn_update, R.id.btn_delete})
    public void onViewClicked(View view) {
        switch (view.getId()) {
            case R.id.btn_query:
                List<Person> list = dao.queryBuilder()
                        .where(PersonDao.Properties.Age.lt(500))
                        .orderDesc(PersonDao.Properties.Age)
                        .build()
                        .list();   // 全查的时候.list
                for (Person person : list) {
                    Log.d(TAG, "onViewClicked: " + person.toString());
                }
                break;
            case R.id.btn_add:
                index++;
                Person person = new Person(null, "name" + index, index * 10);
                dao.insert(person);
                Toast.makeText(this, "插入成功", Toast.LENGTH_SHORT).show();
                break;
            case R.id.btn_update:
                List<Person> list1 = dao.queryBuilder()
                        .where(PersonDao.Properties.Age.lt(500))
                        .orderDesc(PersonDao.Properties.Age)
                        .build()
                        .list();     // 更改的时候,先查询,在对对象进行更改
                for (Person person1 : list1) {
                    if (person1.getAge() == 20) {
                        person1.setAge(100);
                        dao.update(person1);
                    }
                }
                break;
            case R.id.btn_delete:
                Person person1 = dao.queryBuilder()
                        .where(PersonDao.Properties.Id.eq(2))
                        .build()
                        .unique();    // 查询唯一的一条数据
                if (person1 != null) {
                    dao.delete(person1);
                }
                break;
        }
    }
}
@Entity(nameInDb = "person_table")
public class Person {
    @Id(autoincrement = true)
    private Long id;
    @Property(nameInDb = "name")
    private String mingzi;
    private int age;
    @Transient
    private String idCard;

    @Override
    public String toString() {
        return "Person{" +
                "id=" + id +
                ", mingzi='" + mingzi + '\'' +
                ", age=" + age +
                ", idCard='" + idCard + '\'' +
                '}';
    }

    @Generated(hash = 244725397)
    public Person(Long id, String mingzi, int age) {
        this.id = id;
        this.mingzi = mingzi;
        this.age = age;
    }

    @Generated(hash = 1024547259)
    public Person() {
    }

    public Long getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getMingzi() {
        return this.mingzi;
    }

    public void setMingzi(String mingzi) {
        this.mingzi = mingzi;
    }

    public int getAge() {
        return this.age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}