GreenDao操作数据库性能非常好。
我们简单介绍GreenDao3.2.0使用(估计GreenDao以后版本更新,使用规则不会改变),跟之前相比,简单很多。
第一步
对Android Studio 中的工程目录下的build.gradle文件和模块目录下的build.gradle文件进行设置
先设置工程下的build.gradle文件
再设置模块下的build.gradle文件
第二步
创建实体类
@Entity
public class User {
@Id(autoincrement = true)
private long id;
private String name;
private String sex;
private int age;
private int salary;
}
同步一下工程,之前在build.gradle文件中配置的内容会自动生成一些类供我们使用
见图片所示:
第三步
创建GreenDaoManager,提供单例用于操作数据库
public class GreenDaoManager {
private DaoMaster mDaoMaster;
private DaoSession mDaoSession;
private static GreenDaoManager mInstance;//单例
private GreenDaoManager() {
if (mInstance == null) {
//此处openhelper为自动生成开发所使用,发布版本需自定义,重写SQLiteOpenHelper即可
DaoMaster.DevOpenHelper devOpenHelper = new
DaoMaster.DevOpenHelper(MyApp.getContext(), "app_database", null);
mDaoMaster = new DaoMaster(devOpenHelper.getWritableDatabase());
mDaoSession = mDaoMaster.newSession();
}
}
public static GreenDaoManager getInstance() {
if (mInstance == null) {
synchronized (GreenDaoManager.class) {//保证异步处理安全操作
if (mInstance == null) {
mInstance = new GreenDaoManager();
}
}
}
return mInstance;
}
public DaoMaster getMaster() {
return mDaoMaster;
}
public DaoSession getSession() {
return mDaoSession;
}
public DaoSession getNewSession() {
mDaoSession = mDaoMaster.newSession();
return mDaoSession;
}
}
第四步
使用GreenDao进行增删改查
public class MainActivity extends AppCompatActivity {
//操作数据库对象
private UserDao mUserDao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//使用GreenDaoManager进行赋值
mUserDao = getUserDao();
}
private UserDao getUserDao(){
return GreenDaoManager.getInstance().getSession().getUserDao();
}
public void greenDao(View view) {
User user = null;
switch (view.getId()){
case R.id.insert:
for (int i = 1; i < 10; i++) {
user = new User();
user.setId(i);
user.setAge(12+i*i*5);
user.setName("狗蛋");
user.setSalary(10000);
user.setSex("男");
long insert = mUserDao.insert(user);
Log.d("flag", "----------------->greenDao: insert: " + insert);
}
break;
case R.id.delete:
//删除特定位置数据
mUserDao.deleteByKey(1l);
break;
case R.id.update:
//查询id是1位置的数据
user = mUserDao.load(1l);
//对其进行修改
user.setName("苏小小");
mUserDao.update(user);
String name = mUserDao.load(1l).getName();
Log.d("flag", "----------------->greenDao: update name " +name);
break;
case R.id.query:
QueryBuilder<User> builder = mUserDao.queryBuilder();
Query<User> query = builder
.where(UserDao.Properties.Name.eq("狗蛋"),UserDao.Properties.Age.between(10,100))
.build();
List<User> list = query.list();
Log.d("flag", "----------------->greenDao: size " +list.size());
break;
default:
Toast.makeText(this, "请问你想对我做什么?", Toast.LENGTH_SHORT).show();
break;
}
}
}
GreenDao注解
@Entity
public class User {
@Id(autoincrement = true)
private Long id;
@Property(nameInDb = "USERNAME")
private String name;
@NotNull
private int age;
@Transient
private int tempUsageCount;
...
}
@Entity 用于标识这是一个需要Greendao帮我们生成代码的bean
@Id 标明主键,括号里可以指定是否自增
@Property 用于设置属性在数据库中的列名(默认不写就是保持一致)
@NotNull 非空
@Transient 标识这个字段是自定义的不会创建到数据库表里
@Unique 添加唯一约束
关系注解:(慢慢理解)
@Entity
public class Order {
@Id private Long id;
private long customerId;
@ToOne(joinProperty = "customerId")
private Customer customer;
}
@ToOne 是将自己的一个属性与另一个表建立关联
@Entity
public class User {
@Id private Long id;
@ToMany(referencedJoinProperty = "ownerId")
private List<Site> ownedSites;
}
@Entity
public class Site {
@Id private Long id;
private long ownerId;
}
// ----------------------------
@Entity
public class User {
@Id private Long id;
@Unique private String authorTag;
@ToMany(joinProperties = {
@JoinProperty(name = "authorTag", referencedName = "ownerTag")
})
private List<Site> ownedSites;
}
@Entity
public class Site {
@Id private Long id;
@NotNull private String ownerTag;
}
// ----------------------------
@ToMany的属性referencedJoinProperty,类似于外键约束。
@JoinProperty 对于更复杂的关系,可以使用这个注解标明目标属性的源属性。