在gradle中进行如下配置
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'org.greenrobot:greendao-gradle-plugin:3.0.0'
}
}
apply plugin: 'org.greenrobot.greendao'
dependencies {
compile 'org.greenrobot:greendao:3.0.1'
}
greenDAO特性
对象/关系映射(ORM)
greenDAO的本质是提供一个面向对象的接口数据存储在关系数据库SQLite。 数据模型定义,greenDAO将创建Java数据对象(实体)和DAOs( 数据访问对象 )。 这将节省你很多无聊的代码,只是来回移动数据。 除此之外,greenDAO报价 一些先进的ORM特性 像一个会话缓存,立即加载和活跃的实体。
性能
orm我们知道,greenDAO是最快的。 关于性能greenDAO不做任何妥协。 数据库用于存储大量的数据,因此速度很重要。 使用greenDAO,大多数实体可以插入、更新和加载速度 每秒几千实体 。
我们有信心在greenDAO性能和邀请你来比较greenDAO orm。 我们 开源的基准 完全透明。 下面的图表比较了3个最流行的Android greenDAO ORM解决方案,OrmLite,ActiveAndroid(根据基于GitHub的流行明星和Appbrain的统计数据)。 greenDAO插入和更新实体快2倍左右,并加载实体比ORMLite快4倍左右。 典型的应用程序加载速度是最相关的。
除了greenDAO的高性能核心功能,如一个会话缓存和智能立即加载技术给额外的性能提升。
加密支持
您可以使用与标准greenDAO SQLite,嵌入在Android,或与SQLCipher您可以使用它。 有看吗 数据库加密文档获取详细信息。
很小的library
greenDAO核心库的规模小于100 k,所以添加greenDAO不伤害你的APK大小。
活跃的实体
如果你愿意的话,实体可以“活跃”:积极解决实体关系透明(你只是调用getter),更新,删除和更新方法方便访问持久化功能。
Protocol buffers支持
greenDAO让你坚持 协议缓冲区(protobuf) 直接对象到数据库中。 如果你跟你的服务器通过protobuf,你不需要另一个映射。 常规实体的所有持久化操作可用于protobuf对象。 我们相信这是greenDAO的一个独特的特征。
代码生成
greenDAO将生成Java数据对象(实体)和DAO对象。 DAO对象是根据实体允许最好的映射。
未来计划:生成适配器,也许CRUD活动。
开源
在G greenDAO的源代码是完全可用 itHub 。 源分布还包含一个JUnit测试套件,它使用greenDAO的所有功能,因此对greenDAO学习的极好途径。
在项目中如何使用GreenDao进行操作。
-
先新建一个Java类型的Module,选择File -> New -> New Module ,类型选择Java Library ,当然库名、包名和类名随便啦。我这里起的名字如下:库名–greendaogenerator,包名-com.lanou3g.greenrobot,类名-ExpDaoGrnerator;
-
-
-
-
3.添加这个Java Module的GreenDao依赖,打开Java库下面的build.gradle文件,添加如下依赖:
compile ‘de.greenrobot:greendao-generator:2.0.0’
-
4.打开Java文件,写入如下内容:
package com.lanou3g.greenrobot;
import de.greenrobot.daogenerator.DaoGenerator;
import de.greenrobot.daogenerator.Entity;
import de.greenrobot.daogenerator.Schema;
public class ExpDaoGenerator {
public static void main(String[] args) {
Schema schema = new Schema(1000, "com.lanou3g.greendaodemo.entity.greendao");
addNote(schema);
try {
new DaoGenerator().generateAll(schema, "./AppExample/src/main/java");
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 添加将要创建的实体类的信息,会根据类名生成数据库的表,属性名生成数据库的字段
* 当然如果想建多张表,可以创建多个Entity对象
*
* @param schema
*/
private static void addNote(Schema schema) {
Entity entity = schema.addEntity("PersonEntity");
entity.addIdProperty().autoincrement().primaryKey();
entity.addStringProperty("name");
entity.addIntProperty("age");
entity.addStringProperty("sex");
}
}
- 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
- 34
- 35
- 36
- 37
- 38
- 39
- 40
-
在java文件上面右键,选择Run’ExpDaoGenerator main()’,运行后,会在Android Module下面的相应包下生成一系列的java类文件,如下图:
-
-
-
-
至此,Java程序的作用就结束了,可以退休了,下面是在Android Module中的使用方式了
-
-
5.打开Android Module,默认名字叫app,我这里改成了AppExample,打开这里面的build.gradle文件,添加依赖如下:
compile ‘de.greenrobot:greendao:2.0.0’
-
跟刚才Java那个不一样是吧,看出区别来了吧;
-
6.进行数据库中对应表的操作,需要进行一系列的初始化,看代码:
public class MainActivity extends AppCompatActivity {
/** 省略一些控件的声明 */
private SQLiteDatabase db;
private DaoMaster mDaoMaster;
private DaoSession mDaoSession;
private PersonEntityDao personDao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initDatabase();
}
private void initDatabase() {
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this,"daodemo.db",null);
db = helper.getWritableDatabase();
mDaoMaster = new DaoMaster(db);
mDaoSession = mDaoMaster.newSession();
PersonEntityDao personDao = mDaoSession.getPersonEntityDao();
personDao.deleteAll();
List personList = new ArrayList<>();
for (int i = 0; i < 20; i++) {
PersonEntity person = new PersonEntity((long) i,"孙悟空"+i,20+i,"男");
personDao.insert(person);
personList.add(person);
}
personDao.deleteByKey(3l);
personDao.update(new PersonEntity(5l,"贝吉塔",100,"男"));
List queryList = personDao.queryBuilder().list();
for (PersonEntity personEntity : queryList) {
Log.d("TAGGG",personEntity.getName());
}
}
private void initView() {
/** 初始化控件的,没什么用,省略了 */
}
}
- 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
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
下面看一下数据库内的内容:
可以看到id为3的那一条数据被删除掉了,id为5的那一条数据被修改了;
再看一下Logcat输出内容:
-
可以看到,数据成功的查找出来了;
-
-
7.很多界面都这么写数据库肯定会很麻烦嘛,所以需要使用单例.我就简单写一个了,见笑啦,代码如下
-
public class DaoSingleton {
private static final String DATABASE_NAME = "daodemo.db";
private volatile static DaoSingleton instance;
private SQLiteDatabase db;
private DaoMaster daoMaster;
private DaoSession daoSession;
private Context context;
private DaoMaster.DevOpenHelper helper;
private PersonEntityDao personDao;
private DaoSingleton() {
context = BaseApplication.getContext();
}
public static DaoSingleton getInstance() {
if (instance == null) {
synchronized (DaoSingleton.class){
if (instance == null) {
instance = new DaoSingleton();
}
}
}
return instance;
}
public DaoMaster.DevOpenHelper getHelper() {
if (helper == null) {
helper = new DaoMaster.DevOpenHelper(context,DATABASE_NAME,null);
}
return helper;
}
private SQLiteDatabase getDb(){
if (db == null) {
db = getHelper().getWritableDatabase();
}
return db;
}
private DaoMaster getDaoMaster() {
if (daoMaster == null) {
daoMaster = new DaoMaster(getDb());
}
return daoMaster;
}
public DaoSession getDaoSession() {
if (daoSession == null) {
daoSession = getDaoMaster().newSession();
}
return daoSession;
}
public PersonEntityDao getPersonDao() {
if (personDao == null) {
personDao = getDaoSession().getPersonEntityDao();
}
return personDao;
}
}
- 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
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
里面用到的Context使用的是Application的,防止单例类长时间持有其他Activity的Context,影响性能;使用的话,直接在代码中调用
PersonEntityDao personDao = DaoSingleton.getInstance().getPersonDao()
来获取对象;