【问题标题】:得到错误错误:不确定如何将游标转换为此方法的返回类型
【发布时间】:2022-01-23 13:01:19
【问题描述】:

我需要一些帮助来解决以下错误

错误:查询有问题:准备好的语句有 已敲定 列出 getall();

错误:不确定如何将 Cursor 转换为此方法的返回类型 (java.util.List)。 列出 getall();

错误:@Query 的值中必须恰好有 1 个查询或 @DatabaseView List getCartProduct(String priceUnitId);

我的代码是:

package com.hashmac.store.dao;

import androidx.room.Dao;
import androidx.room.Delete;
import androidx.room.Insert;
import androidx.room.Query;

import java.util.List;

@Dao
public interface CartDao {

    @Insert
    void insertNew(CartOffline cartOffline);

    @Query("")
    List<CartOffline> getall();

    @Query("")
    List<CartOffline> getCartProduct(String priceUnitId);

    @Query("")
    void updateObj(long quantity, String priceunitid);


    @Query("")
    void deleteObjbyPid(String priceunitid);

    @Delete
    void deleteObj(CartOffline cartOffline);

    @Query("")
    int getProductCount(String pId);

    @Query("")
    void deleteAll();
    /*@Query("UPDATE CartOffline SET quantity = :quantity")
    void updetCart()*/

}

【问题讨论】:

    标签: java android android-studio dao


    【解决方案1】:

    错误:不确定如何将 Cursor 转换为此方法的返回类型 (java.util.List)。列出 getall();

    这意味着您正在尝试直接在数据库中查询 CartOffline 对象而不提供TypeConverter。 Room 只能将复杂数据转换为 SQLite primitive type,即 TEXT(如果您提供 TypeConverter)。

    更多信息:Referencing complex data using Room

    您必须创建一个类,其中包含将 DAO 查询返回的类型(或作为参数)转换为 SQLite 原始等效项的方法,反之亦然,因此 Room 知道如何将 Cursor 转换为 DAO 查询的返回/参数类型。

    例如,您的 getCartProduct() 查询返回 List,因此您可能希望将其解析为 JSON 字符串,该字符串将存储为 SQLite TEXT(您也可以以不同方式解析它并将其存储为 BLOB)。为此,您可以使用 Moshi 或 GS​​ON 等 JSON 库。

    (抱歉,如果代码中有任何拼写错误,但我前段时间切换到 Kotlin,我的 Java 越来越生锈了。)

     public static class Converters {
       @TypeConverter
       public List<CartOffline> fromJSON(String json) {
    
         //here goes code to parse a JSON String into a List<CartOffline>
         //using your JSON library of choice
       
         return listOfCartOffline;
       }
    
       @TypeConverter
       public String fromListOfCartOffline(List<CartOffline> listOfCartOffline) {
    
         //here goes code to parse List<CartOffline> into a JSON string
         //using your JSON library of choice
       
         return json;
       }
      }
    

    通过使用@TypeConverter 注释这些方法,Room 自动知道如何将您的对象转换为 SQLite 类型。对于 DAO 方法返回或作为参数的每个非原始类型,您都需要一个转换器对。如果您的查询只返回诸如字符串、整数或它们的集合(如列表)之类的原语,则不需要@TypeConverter。

    【讨论】:

    • 你能指导我如何解决这个问题
    • @pro_hussain 添加了有关要遵循的步骤的更多信息,但您应该阅读我在答案中链接的 Room 文档并很好地掌握库 - 否则您将不断遇到错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 2020-03-28
    • 1970-01-01
    • 2019-04-23
    • 2019-12-12
    • 2018-03-08
    • 1970-01-01
    相关资源
    最近更新 更多