一直在使用Android自带的数据库SqliteDatabase,在使用的时候需要编写的内容比较多 ,现在大家都在使用greenDao,因此现在的项目中,使用greenDao,可能由于第一次,会有各种问题,但是,只是简单写个Demo,很难学习的比较深。
dependencies { classpath 'org.greenrobot:greendao-gradle-plugin:3.2.1' }
dependencies { compile 'org.greenrobot:greendao:3.2.0' compile 'org.greenrobot:greendao-generator:3.2.0' }
apply plugin: ‘org.greenrobot.greendao’
以及
greendao {
schemaVersion 1 //数据库版本号
daoPackage 'com.jian.greendao.gen'//这个是生成代码保存的包名
targetGenDir 'src/main/java'//保存到java代码路径
}
全部代码如下:
apply plugin: 'com.android.application'
apply plugin: 'org.greenrobot.greendao'
android {
......
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
}
greendao {
schemaVersion 1
daoPackage 'com.jian.greendao.gen'//这个是生成代码保存的包名
targetGenDir 'src/main/java'//保存到java代码路径
}
}
dependencies {
...
compile 'org.greenrobot:greendao:3.2.0'
compile 'org.greenrobot:greendao-generator:3.2.0'
}
同步后就可以使用greenDao.
UserBean
@Entity
public class User {
@Id(autoincrement = true)
private Long id;
private String name;
private String sex;
private int age;
private int salary;
}
@Entity 这个标志告诉greenDao,这个是我需要生成的表
@Id(autoincrement=true)是自动生成的id,注意:Long,不是long
然后点击Build->Make Project(Ctrl + F9) ,将会自动为我们生成需要的类和代码
生成的UserBean
@Entity
public class User {
@Id(autoincrement = true)
private Long id;
private String name;
private String sex;
private int age;
private int salary;
@Generated(hash = 1815379757)
public User(Long id, String name, String sex, int age, int salary) {
this.id = id;
this.name = name;
this.sex = sex;
this.age = age;
this.salary = salary;
}
@Generated(hash = 1203313951)
public User() {
}
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
...
public int getSalary() {
return this.salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
}
自动生成的类
创建App类,继承Application
public class App extends Application {
public static final boolean ENCRYPTED = true;
private DaoSession daoSession;
@Override
public void onCreate() {
super.onCreate();
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, ENCRYPTED ? "users-db-encrypted" : "users-db");
//注意这里是getWritableDb()
Database db = helper.getWritableDb();
daoSession = new DaoMaster(db).newSession();
}
public DaoSession getDaoSession() {
return daoSession;
}
}
tip:别忘记将创建的App添加到manifest中。
<application
android:name=".App"
....
android:theme="@style/AppTheme">
application>
这个类起到防止重复创建数据库的操作,当然也可以使用单例模式来实现。
public class GreenDaoHelper {
private static DaoMaster.DevOpenHelper devOpenHelper;
private static SQLiteDatabase database;
private static DaoMaster daoMaster;
private static DaoSession daoSession;
/** * 初始化greenDao * 建议放在Application 中进行 */
public static void initDatabase(){
// 通过 DaoMaster 的内部类 DevOpenHelper,你可以得到一个便利的 SQLiteOpenHelper 对象。
// 可能你已经注意到了,你并不需要去编写「CREATE TABLE」这样的 SQL 语句,因为 greenDAO 已经帮你做了。
// 注意:默认的 DaoMaster.DevOpenHelper 会在数据库升级时,删除所有的表,意味着这将导致数据的丢失。
// 所以,在正式的项目中,你还应该做一层封装,来实现数据库的安全升级。
devOpenHelper = new DaoMaster.DevOpenHelper(AppContext.getInstance(),"cache-db",null);//数据库名
database = devOpenHelper.getWritableDatabase();
// 注意:该数据库连接属于 DaoMaster,所以多个 Session 指的是相同的数据库连接。
daoMaster = new DaoMaster(database);
daoSession = daoMaster.newSession();
}
public static DaoSession getDaoSession() {
return daoSession;
}
public static SQLiteDatabase getDb() {
return database;
}
}
private UserDao mUserDao = GreenDaoHelper.getDaoSession().getUserDao();
public void insertData(){
//数据库的增删改查我们都将通过UserDao来进行,插入操作如下:
mUserDao.insert(new User(null,"david",23,"male"));//id传null 即自增。==> 这里是Long类型而不是long
}
//查询id等于3的所有行并删除
User user = mUserDao.queryBuilder().where(UserDao.Properties.Id.eq(3)).build().unique();
if (user == null) ToastUtils.show(getView(), "用户不存在!");
else mUserDao.deleteByKey(user.getId());
//查询id小于5的集合并删除
List userList = (List) mUserDao.queryBuilder().where(UserDao.Properties.Id.le(5)).build().list();
for (User user : userList) {
mUserDao.delete(user);
}
//删除所有数据
mUserDao.deleteAll();
//修改id为2的行
User user = new User((long) 2, "Nancy", 23, "female");
mUserDao.update(user);
//查询id>= 3 且like ("%david%")
User user = mUserDao.queryBuilder()
.where(UserDao.Properties.Id.ge(3), UserDao.Properties.UserName.like("%david%")).build().unique();
if (user == null) {
ToastUtils.show(getView(), "用户不存在!");
} else {
user.setUserName("王五");
mUserDao.update(user);
}
//查出所有数据
List users = mUserDao.loadAll();
//查出所有数据
List users = mUserDao.list();
//查询id为1~4之间的数,查出前2个
List users = mUserDao.queryBuilder()
.where(UserDao.Properties.Id.between(1, 4)).limit(2).build().list();
@Entity 用于标识这是一个需要Greendao帮我们生成代码的bean
@Id 标明主键,括号里可以指定是否自增
@Property 用于设置属性在数据库中的列名(默认不写就是保持一致)
@NotNull 非空
@Transient 标识这个字段是自定义的不会创建到数据库表里
@Unique 添加唯一约束
@ToOne 是将自己的一个属性与另一个表建立关联(外键)
@ToMany的属性referencedJoinProperty,类似于外键约束。
@JoinProperty 对于更复杂的关系,可以使用这个注解标明目标属性的源属性。
以上就是greenDao的简单使用,下一篇将记录项目中的使用及版本更新。
Android greenDao3.0的开发实战,包括版本升级(二)
参考文章:
1.最详细GreenDao3.2的基本使用
2.greenDAO3 入门(配置,基本操作,数据库升级)