Я использую Библиотека сохраняемости комнаты, и я пытаюсь избежать шаблонного кода, создав общий класс 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-инъекция?
Спасибо, очевидно, что надо много копировать пасту: D
Когда это возникает, первый вопрос, который вы должны задать себе: «Зачем мне фактически нужно так много одинаковых запросов». Для приложений не рекомендуется материализовать весь набор данных таблицы в своей памяти, вы, вероятно, где-то допустили ошибку дизайна.
На самом деле вы правы, у меня будет всего два: D, но DAO будут такими же, за исключением имен классов.
библиотека должна работать таким образом, чтобы предотвратить 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
перейдут к определенным Даосам сущностей.
Вероятно, вы можете создать свою собственную реализацию, но то, что вы хотите, не поддерживается из коробки.