Android开发中的本地数据存储是一个非常关键的问题。不同的应用程序可能需要存储各种类型的数据,包括设置、用户配置、用户信息、本地缓存等等。而Greendao是一个优秀的Android ORM库,提供了简单易用的API和高效的性能,使得我们可以轻松地实现本地数据存储。本文将详细介绍如何使用Greendao进行Android本地数据存储。
一、快速入门
Greendao是一个轻量级的ORM框架,提供了一个实体类和一个DAO类。我们只需要定义好实体类,然后通过DAO类访问数据库即可。下面是一个快速入门的示例:
@Entity
public class User {
@Id(autoincrement = true)
private Long id;
private String name;
// getters and setters...
}
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(context, "my-db");
Database db = helper.getWritableDb();
DaoSession daoSession = new DaoMaster(db).newSession();
UserDao userDao = daoSession.getUserDao();
User user = new User();
user.setName("Tom");
userDao.insert(user);
上面这段代码用到了Greendao的几个重要概念:
- 实体类(Entity Class):定义了数据库表的结构,即表名和各个字段。
- DAO(Data Access Object):提供了对数据库的CRUD操作。
- DaoMaster:控制数据库的创建和升级。
- DaoSession:提供了对具体实体类DAO操作的入口。
- Database:持有数据库对象。
上面这个例子就实现了向用户表中插入一条数据的功能,非常简单。接下来我们将对上面的示例进行详细解读,并介绍如何进行查询操作。
二、实体类(Entity Class)
在Greendao中,实体类对应着一个数据库表。我们可以使用注解进行定义和配置,它们的作用如下:
- @Entity:表明这是一个实体类。
- @Id:指定一个Long类型的主键字段,并且可以使用autoincrement属性开启自增长功能。
- @Property:指定一个非主键的字段名称,对应数据库表中的列名。
- @Unique:指定一个字段为唯一索引。
- @NotNull:指定一个字段不允许为空。
- @Transient:指定一个字段不映射到数据库中。
- @Generated:标识由greendao自动生成的字段。
下面是一个完整的实体类示例:
@Entity
public class User {
@Id(autoincrement = true)
private Long id;
@Property(nameInDb = "user_name")
private String name;
@Unique
private String email;
private int age;
@Transient
private String temp;
@Generated
private byte[] picture;
// getters and setters...
}
上面这个实体类定义了一个User表,包含了id、name、email和age等4个字段。其中id为自增长的主键,name字段对应数据库中的user_name列名,并且不允许为空;email字段为唯一索引;age字段不需要额外配置;temp字段不映射到数据库中;picture字段为greendao自动生成的字段。
三、DAO(Data Access Object)
DAO表示数据访问对象,通常包括数据的增加、删除、修改和查询等操作。在Greendao中,每个实体类拥有一个自己的DAO,我们可以通过这个DAO对该实体类进行数据的增删改查等操作。下面是一段简单的示例:
// insert
User user = new User();
user.setName("Tom");
user.setEmail("tom@example.com");
user.setAge(20);
userDao.insert(user);
// update
user.setName("Jerry");
userDao.update(user);
// delete
userDao.deleteByKey(user.getId());
// query
Query query = userDao.queryBuilder()
.where(UserDao.Properties.Age.eq(20))
.orderAsc(UserDao.Properties.Name)
.limit(10)
.build();
List<User> userList = query.list();
如上所示,简单地使用插入、更新、删除与查询方法即可完成相应的操作。需要注意的是,查询方法返回了一个Query对象,该对象是一个链式调用的Builder,它能够灵活地构建复杂查询语句。
四、高级查询
Greendao支持多种查询方式,包括列表查询、唯一查询、聚合查询、原始SQL查询等。接下来我们会逐一介绍这些查询方式。
1. 列表查询
列表查询是最常用的查询方式,它可以返回指定条件下的所有结果。查询条件通常使用查询构建器QueryBuilder来指定,查询结果使用list()方法返回一个List对象,每个元素是一个实体对象。
QueryBuilder<User> queryBuilder = userDao.queryBuilder();
queryBuilder.where(UserDao.Properties.Name.eq("Tom"));
List<User> userList = queryBuilder.list();
2. 唯一查询
唯一查询是针对仅返回一个结果的场景,它将返回一个实体对象。查询条件与列表查询相同,差别在于调用了unique()方法而不是list()方法。
QueryBuilder<User> queryBuilder = userDao.queryBuilder();
queryBuilder.where(UserDao.Properties.Name.eq("Tom"));
User user = queryBuilder.unique();
3. 聚合查询
聚合查询是指查询出满足某种条件的所有结果,并且对这些结果进行某种计算操作(如求和、平均值、最大值、最小值等),返回计算结果。查询条件与列表查询相同,使用count()、sum()、mean()、max()、min()等方法计算相应的结果。
QueryBuilder<User> queryBuilder = userDao.queryBuilder();
queryBuilder.where(UserDao.Properties.Age.gt(20));
long count = queryBuilder.count();
int sumAge = queryBuilder.where(UserDao.Properties.Age.gt(20)).sum(UserDao.Properties.Age).intValue();
float avgAge = queryBuilder.where(UserDao.Properties.Age.gt(20)).average(UserDao.Properties.Age);
int maxAge = queryBuilder.where(UserDao.Properties.Age.gt(20)).max(UserDao.Properties.Age).intValue();
int minAge = queryBuilder.where(UserDao.Properties.Age.gt(20)).min(UserDao.Properties.Age).intValue();
4. 原始SQL查询
如果以上三种查询方式不能满足需求,你可以通过原始SQL来实现自定义查询。Greendao支持使用QueryBuilder.RawBuilder来构建原始SQL查询,并且返回结果也能够转换为实体对象。下面是一个使用原始SQL查询的示例:
QueryBuilder<User> queryBuilder = userDao.queryBuilder();
QueryBuilder.RawBuilder rawBuilder = queryBuilder.buildRaw("SELECT * FROM user WHERE age > ?", "20");
List<User> userList = queryBuilder.list();
五、创建数据库
在前面的示例中,我们使用了DaoMaster.DevOpenHelper来创建和升级数据库。这个类继承自SQLiteOpenHelper类,它会在需要时自动创建和升级数据库。当然,如果你希望自己处理数据库的创建和升级,也是可以的。下面是一个自定义DevOpenHelper的示例:
public class MyDatabaseOpenHelper extends DaoMaster.OpenHelper {
public MyDatabaseOpenHelper(Context context, String name) {
super(context, name);
}
@Override
public void onCreate(Database db) {
super.onCreate(db);
// Do something when created
}
@Override
public void onUpgrade(Database db, int oldVersion, int newVersion) {
super.onUpgrade(db, oldVersion, newVersion);
// Do something when upgraded
}
}
调用MyDatabaseOpenHelper时,传入数据库名称即可创建和升级数据库。
MyDatabaseOpenHelper helper = new MyDatabaseOpenHelper(context, "my-db");
Database db = helper.getWritableDb();
DaoSession daoSession = new DaoMaster(db).newSession();
UserDao userDao = daoSession.getUserDao();
六、总结
Greendao是一款稳定高效的Android ORM库,它提供了简单易用的API和高效的性能,使得我们可以轻松地实现本地数据存储。在本文中,我们详细介绍了Greendao的实体类、DAO、高级查询等方面的使用方法,并提供了代码示例。希望这篇文章能够帮助您在Android应用程序开发中解决本地数据存储的问题。