您的位置:

使用Greendao进行Android本地数据存储

使用Greendao进行Android本地数据存储

更新:

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应用程序开发中解决本地数据存储的问题。

使用Greendao进行Android本地数据存储

Android开发中的本地数据存储是一个非常关键的问题。不同的应用程序可能需要存储各种类型的数据,包括设置、用户配置、用户信息、本地缓存等等。而Greendao是一个优秀的Android ORM库,提

2023-12-08
高效管理Android应用数据的框架

对于许多Android应用而言,数据管理是非常重要的一部分,以确保应用能够正常运行并提供必要的用户服务。为了实现高效的数据管理,许多开发人员将寻找适当的框架来帮助他们。接下来,我们将介绍一些帮助开发人

2023-12-08
使用Realm轻松实现Android本地数据存储

随着移动互联网的快速发展,手机APP正成为人们日常生活中必不可少的一部分。而在APP的开发过程中,数据存储是一个非常核心的部分。为了让数据的读取和操作更加轻松高效,开发人员需要一个可靠的本地数据存储框

2023-12-08
使用SharedPreferences存储Android应用

一、SharedPreferences的概念 SharedPreferences是Android系统中用于存储少量数据的一种方式。它主要通过键值对的形式来存储数据,具有简单、快速、高效的特点。Shar

2023-12-08
打造高效稳定的Android系统:Framework开发实战

Android作为目前移动设备上占有率最高的操作系统之一,其Framework开发的重要性不言而喻。好的Framework设计可以大幅提升应用性能、稳定性并方便开发者进行功能扩展,反之则可能带来诸多问

2023-12-08
Android数据存储:SQLite数据库的使用教程

2023-05-14
Android Realm数据存储框架的详细介绍

2023-05-18
使用Android Room实现数据持久化存储

2023-05-14
阿里云笔记的功能与使用详解

2023-05-21
Android存储权限详解

2023-05-18
android缓存htmljs,Android缓存 Xama

本文目录一览: 1、android 怎样获取webview的缓存 2、android不清缓存js不生效,js调用不到是为什么?求大神帮忙 3、Android的webview里怎么用HttpRespon

2023-12-08
Android文件存储方案详解:内部存储、外部存储、SQLi

在Android开发中,文件读写是一项基本操作,为了支持文件的读写操作,Android系统提供了多种文件存储方式,如内部存储、外部存储和SQLite数据库等。本文将详细介绍这些文件存储方式的特点、使用

2023-12-08
Android DA存储路径详解

2023-05-14
提升Android开发效率的必备工具和技巧

2023-05-14
使用Android Studio进行网络流量捕捉

2023-05-14
印象笔记记录java学习(Java成长笔记)

2022-11-12
Android Studio中如何使用Github实现版本控

2023-05-14
使用Android Studio Logcat进行应用程序调

2023-05-14
Android MMKV轻量级存储方案实现

一、MMKV介绍 MMKV是一个高效、轻量级、易用的移动端Key-Value存储框架,适用于在移动端快速存储和读取少量数据(如用户配置信息、本地缓存数据等)。在Android上,MMKV底层使用了mm

2023-12-08
学习Android Room数据库操作指南

在 Android 应用程序中,数据存储是无法避免的。你需要在你的应用程序中存储和管理用户数据。Android 为开发者提供了不同类型的存储选项,包括 Shared Preferences、文件存储、

2023-12-08