Поиск…


Вступление

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 над соответствующими полями класса сущности, однако для составного первичного ключа мы делаем следующее:

  1. Добавьте аннотацию @Index внутри аннотации @Index на уровне @Entity . Свойство value содержит список разделенных запятыми полей, составляющих ключ. Используйте unique свойство, как показано для обеспечения уникальности ключа.

  2. 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);


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow