室内持久性库不能使用like子句

时间:2018-05-03 05:50:33

标签: android android-sqlite android-room android-architecture-components

我在我的项目中使用房间持久性库。我试图在查询中使用'like'子句但我无法使用。我已经尝试了编译时间(Query)和运行时查询(Raw Query)。它既没有给出任何异常,也没有提供任何输出。

我尝试了以下方法,但没有一种方法有效: -

  1. 编译时间查询 -

    @Query("select * from recipe where type_of_diet like '%vegetarian%' ")
    public abstract DataSource.Factory<Integer, RecipeListPojo> 
    getRecipeListVeg();
    
  2. RawQuery -

    @RawQuery(observedEntities = RecipeListPojo.class)
    public abstract DataSource.Factory<Integer,RecipeListPojo> 
    getAllRecipesList(SupportSQLiteQuery sqLiteQuery);
    
    String query="select * from recipe  where type_of_diet like '%vegetarian%' ";
    SimpleSQLiteQuery simpleSQLiteQuery = new SimpleSQLiteQuery(query);
    recipeDao.getAllRecipesList(simpleSQLiteQuery);
    
  3. compileSdkVersion 27

    使用的图书馆 -     实现“android.arch.persistence.room:runtime:1.1.0-beta3”     annotationProcessor“android.arch.persistence.room:compiler:1.1.0-beta3”

    请告诉我如何运行这些类型的查询。

3 个答案:

答案 0 :(得分:3)

房间1.1.1 + RxJava2 + Kotlin运行正常:

@Query("SELECT * FROM user WHERE name LIKE '%' || :name || '%' ")
fun getUsers(name: String): Single<List<UserEntity>>

带有参数:

let dataid = infosStructured.filter(elm => {
  console.log(elm.identifiant);
  console.log("matching value", elm.identifiant == this.dataService.getcurrentId()); // I get a true value
  elm.identifiant == this.dataService.getcurrentId();
});
console.log(dataid); // empty

答案 1 :(得分:0)

语法对您的查询不正确。根据{{​​3}},查询类似于

@Query("SELECT * FROM user WHERE user_name LIKE :name AND last_name LIKE :last")
public abstract List<User> findUsersByNameAndLastName(String name, String last);

此处argumentskey written with LIKE :必须匹配。

阅读documentation,这在kotlin中可能会清除这种逻辑。

答案 2 :(得分:0)

您必须在符号“%”之前附加字符串的前缀和后缀,例如:

字符串参数=“%” + mMyString +“%”;

然后声明您的DAO方法,例如:

@Query(“ SELECT * FROM track_table WHERE title LIKE:param” +“ OR artist LIKE:param” +“ OR album like:param”)     List search(String param);

希望这会有所帮助。