Есть ли способ создать общий класс dao для библиотеки сохранения состояния комнаты

Я использую Библиотека сохраняемости комнаты, и я пытаюсь избежать шаблонного кода, создав общий класс DAO, например этот

@Dao
public interface PendingTaskDao<V>  {

    @Query("SELECT * FROM :tableName")
    Maybe<List<V>> getAllEntitiesFrom(String tableName);
}

Но компилятор жалуется на <table or subquery> expected got : tableName. Есть ли способ создать Generic DAO, или библиотека должна работать таким образом, чтобы предотвратить SQL-инъекция?

Вероятно, вы можете создать свою собственную реализацию, но то, что вы хотите, не поддерживается из коробки.

M. Prokhorov 11.04.2018 13:45

Спасибо, очевидно, что надо много копировать пасту: D

MeLine 11.04.2018 13:49

Когда это возникает, первый вопрос, который вы должны задать себе: «Зачем мне фактически нужно так много одинаковых запросов». Для приложений не рекомендуется материализовать весь набор данных таблицы в своей памяти, вы, вероятно, где-то допустили ошибку дизайна.

M. Prokhorov 11.04.2018 13:52

На самом деле вы правы, у меня будет всего два: D, но DAO будут такими же, за исключением имен классов.

MeLine 11.04.2018 14:01
0
4
1 327
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

библиотека должна работать таким образом, чтобы предотвратить SQL-инъекцию, да, ты прав.

Из документы@Query:

This query is verified at compile time by Room to ensure that it compiles fine against the database.

Итак, чтобы запрос компилировался правильно, вы должны указать tableName не в качестве параметра, а непосредственно в запросе, жестко запрограммированном

Хотя вы не можете создать общий DAO для всех операций для всех сущностей, вы можете, по крайней мере, создать BaseDao для унификации операций insert, insertAll, update, updateAll, delete и deleteAll.

/**
 * Created by Yousuf Sohail on 10/7/18.
 */
interface BaseDao<T> {

    /**
     * Insert an object or array of objects in the database.
     *
     * @param obj the objects to be inserted.
     */
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insert(vararg obj: T): LongArray

    /**
     * Update an object or array of objects from the database.
     *
     * @param obj the object to be updated
     */
    @Update
    fun update(vararg obj: T)

    /**
     * Delete an object or array of objects from the database
     *
     * @param obj the object to be deleted
     */
    @Delete
    fun delete(vararg obj: T)
}

select и selectAll перейдут к определенным Даосам сущностей.

Другие вопросы по теме