Android
GreenDAO
Поиск…
Вступление
GreenDAO - это библиотека объектно-реляционного сопоставления, которая помогает разработчикам использовать базы данных SQLite для постоянного локального хранилища.
Вспомогательные методы для запросов SELECT, INSERT, DELETE, UPDATE
В этом примере показан вспомогательный класс, содержащий полезные методы при выполнении запросов для данных. Каждый метод использует Java Generic для того, чтобы быть очень гибким.
public <T> List<T> selectElements(AbstractDao<T, ?> dao) {
if (dao == null) {
return null;
}
QueryBuilder<T> qb = dao.queryBuilder();
return qb.list();
}
public <T> void insertElements(AbstractDao<T, ?> absDao, List<T> items) {
if (items == null || items.size() == 0 || absDao == null) {
return;
}
absDao.insertOrReplaceInTx(items);
}
public <T> T insertElement(AbstractDao<T, ?> absDao, T item) {
if (item == null || absDao == null) {
return null;
}
absDao.insertOrReplaceInTx(item);
return item;
}
public <T> void updateElements(AbstractDao<T, ?> absDao, List<T> items) {
if (items == null || items.size() == 0 || absDao == null) {
return;
}
absDao.updateInTx(items);
}
public <T> T selectElementByCondition(AbstractDao<T, ?> absDao,
WhereCondition... conditions) {
if (absDao == null) {
return null;
}
QueryBuilder<T> qb = absDao.queryBuilder();
for (WhereCondition condition : conditions) {
qb = qb.where(condition);
}
List<T> items = qb.list();
return items != null && items.size() > 0 ? items.get(0) : null;
}
public <T> List<T> selectElementsByCondition(AbstractDao<T, ?> absDao,
WhereCondition... conditions) {
if (absDao == null) {
return null;
}
QueryBuilder<T> qb = absDao.queryBuilder();
for (WhereCondition condition : conditions) {
qb = qb.where(condition);
}
List<T> items = qb.list();
return items != null ? items : null;
}
public <T> List<T> selectElementsByConditionAndSort(AbstractDao<T, ?> absDao,
Property sortProperty,
String sortStrategy,
WhereCondition... conditions) {
if (absDao == null) {
return null;
}
QueryBuilder<T> qb = absDao.queryBuilder();
for (WhereCondition condition : conditions) {
qb = qb.where(condition);
}
qb.orderCustom(sortProperty, sortStrategy);
List<T> items = qb.list();
return items != null ? items : null;
}
public <T> List<T> selectElementsByConditionAndSortWithNullHandling(AbstractDao<T, ?> absDao,
Property sortProperty,
boolean handleNulls,
String sortStrategy,
WhereCondition... conditions) {
if (!handleNulls) {
return selectElementsByConditionAndSort(absDao, sortProperty, sortStrategy, conditions);
}
if (absDao == null) {
return null;
}
QueryBuilder<T> qb = absDao.queryBuilder();
for (WhereCondition condition : conditions) {
qb = qb.where(condition);
}
qb.orderRaw("(CASE WHEN " + "T." + sortProperty.columnName + " IS NULL then 1 ELSE 0 END)," + "T." + sortProperty.columnName + " " + sortStrategy);
List<T> items = qb.list();
return items != null ? items : null;
}
public <T, V extends Class> List<T> selectByJoin(AbstractDao<T, ?> absDao,
V className,
Property property, WhereCondition whereCondition) {
QueryBuilder<T> qb = absDao.queryBuilder();
qb.join(className, property).where(whereCondition);
return qb.list();
}
public <T> void deleteElementsByCondition(AbstractDao<T, ?> absDao,
WhereCondition... conditions) {
if (absDao == null) {
return;
}
QueryBuilder<T> qb = absDao.queryBuilder();
for (WhereCondition condition : conditions) {
qb = qb.where(condition);
}
List<T> list = qb.list();
absDao.deleteInTx(list);
}
public <T> T deleteElement(DaoSession session, AbstractDao<T, ?> absDao, T object) {
if (absDao == null) {
return null;
}
absDao.delete(object);
session.clear();
return object;
}
public <T, V extends Class> void deleteByJoin(AbstractDao<T, ?> absDao,
V className,
Property property, WhereCondition whereCondition) {
QueryBuilder<T> qb = absDao.queryBuilder();
qb.join(className, property).where(whereCondition);
qb.buildDelete().executeDeleteWithoutDetachingEntities();
}
public <T> void deleteAllFromTable(AbstractDao<T, ?> absDao) {
if (absDao == null) {
return;
}
absDao.deleteAll();
}
public <T> long countElements(AbstractDao<T, ?> absDao) {
if (absDao == null) {
return 0;
}
return absDao.count();
}
Создание объекта с помощью GreenDAO 3.X, который имеет составной первичный ключ
При создании модели для таблицы с составным первичным ключом требуется дополнительная работа над объектом для модели Entity для соблюдения этих ограничений.
В следующем примере таблица SQL и Entity демонстрируют структуру для хранения обзора, оставленного клиентом для элемента в интернет-магазине. В этом примере мы хотим, item_id
столбцы customer_id
и item_id
составным первичным ключом, позволяя использовать только один просмотр между конкретным клиентом и элементом.
Таблица SQL
CREATE TABLE review (
customer_id STRING NOT NULL,
item_id STRING NOT NULL,
star_rating INTEGER NOT NULL,
content STRING,
PRIMARY KEY (customer_id, item_id)
);
Обычно мы будем использовать аннотации @Id
и @Unique
над соответствующими полями класса сущности, однако для составного первичного ключа мы делаем следующее:
Добавьте аннотацию
@Index
внутри аннотации@Index
на уровне@Entity
. Свойство value содержит список разделенных запятыми полей, составляющих ключ. Используйтеunique
свойство, как показано для обеспечения уникальности ключа.GreenDAO требует, чтобы каждый объект Entity имел
long
илиLong
объект в качестве первичного ключа. Нам все равно нужно добавить это в класс Entity, однако нам не нужно его использовать или беспокоиться об этом, влияющем на нашу реализацию. В приведенном ниже примере он называетсяlocalID
сущность
@Entity(indexes = { @Index(value = "customer_id,item_id", unique = true)})
public class Review {
@Id(autoincrement = true)
private Long localID;
private String customer_id;
private String item_id;
@NotNull
private Integer star_rating;
private String content;
public Review() {}
}
Начало работы с GreenDao v3.X
После добавления зависимости библиотеки GreenDao и плагина Gradle нам нужно сначала создать объект сущности.
сущность
Сущность - это простой старый Java-объект (POJO), который моделирует некоторые данные в базе данных. GreenDao будет использовать этот класс для создания таблицы в базе данных SQLite и автоматически генерировать вспомогательные классы, которые мы можем использовать для доступа и хранения данных без необходимости писать SQL-запросы.
@Entity
public class Users {
@Id(autoincrement = true)
private Long id;
private String firstname;
private String lastname;
@Unique
private String email;
// Getters and setters for the fields...
}
Одноразовая настройка GreenDao
Каждый раз, когда запускается приложение, GreenDao необходимо инициализировать. GreenDao предлагает сохранить этот код в классе Application или где-то он будет запускаться только один раз.
DaoMaster.DevOpenHelper helper = new DaoMaster.DevOpenHelper(this, "mydatabase", null);
db = helper.getWritableDatabase();
DaoMaster daoMaster = new DaoMaster(db);
DaoSession daoSession = daoMaster.newSession();
Классы помощников GreenDao
После создания объекта сущности GreenDao автоматически создает вспомогательные классы, используемые для взаимодействия с базой данных. Они называются аналогично имени созданного объекта сущности, за которым следует Dao
и извлекаются из объекта daoSession
.
UsersDao usersDao = daoSession.getUsersDao();
Теперь можно выполнить множество типичных действий с базой данных с помощью этого объекта Dao с объектом сущности.
запрос
String email = "[email protected]";
String firstname = "John";
// Single user query WHERE email matches "[email protected]"
Users user = userDao.queryBuilder()
.where(UsersDao.Properties.Email.eq(email)).build().unique();
// Multiple user query WHERE firstname = "John"
List<Users> user = userDao.queryBuilder()
.where(UsersDao.Properties.Firstname.eq(firstname)).build().list();
Вставить
Users newUser = new User("John","Doe","[email protected]");
usersDao.insert(newUser);
Обновить
// Modify a previously retrieved user object and update
user.setLastname("Dole");
usersDao.update(user);
удалять
// Delete a previously retrieved user object
usersDao.delete(user);