查询房间中对象的类型转换列表

时间:2018-10-09 20:15:41

标签: android sqlite android-room

我有一张看起来像下面的桌子

import requests

names = ['telesoftas', 'devbridge_lt'] 

for name in names:
    html = requests.get(' https://rekvizitai.vz.lt/en/company/' + names)

// ...

@Entity
@JsonIgnoreProperties(ignoreUnknown = true)
public class Product
{
    @PrimaryKey
    @ColumnInfo(name = "ID")
    @JsonProperty("ID")
    public int id;

    @ColumnInfo(name = "Name")
    @JsonProperty("Name")
    public String name;

    @ColumnInfo(name = "Documents")
    @JsonProperty("Documents")
    @TypeConverters(DocumentConverter.class)
    public List<Document> documents;
}

通过执行类似的操作,我可以根据产品名称检索产品

@TypeConverters(DocumentConverter.class)
@JsonIgnoreProperties( ignoreUnknown = true )
@JsonTypeName("Documents")
public class Document
{
    @JsonProperty("Name")
    public String name;

    @JsonProperty("URL")
    public String url;
}

然后,我将能够从每个Product对象访问文档列表。但是,我也只想处理包含某些文档的产品。我可以通过上述查询获取所有产品,然后手动过滤所需的文档,但是当我只查找非常特定的文档时,这会变得很麻烦。

是否还可以基于Document变量查询而不将其作为单独的表?

类似...

@Query("SELECT * FROM Product WHERE Name = :name")
List<Product> getProducts(String name);

谢谢。

2 个答案:

答案 0 :(得分:0)

您可以使用LIKE sql语句在json列中搜索转换后的文档列表。例: 假设我们已经将这样转换的文档存储在db中:

const res = await GpsLog.find({
  'gps_time': {
    $gte: 1539648000,
    $lte: 1539820800
  },
  'location': {
    '$geoIntersects': {
      '$geometry': geoFence
    }
  }
}).lean().exec();

因此,您对清单中包含此类文档的产品的查询应如下所示:

{
    name: "Title",
    url: "Your_url"
}

哪里

SELECT * FROM Product WHERE Name = :name AND Documents LIKE :documentLikeExpr

%表示零个,一个或多个字符。

所以我们在这里要做的唯一一件事-使用SQL语言功能在列内搜索字符串的一部分。

答案 1 :(得分:0)

您无法查询Document类变量,因为它没有存储为单独的表。 @TypeConverter 批注将您的文档列表转换为一些预定义的数据类型,例如字符串。基本上,它将文档列表作为字符串Gson存储在Product表的列中,因此我们无法在SQL查询(如 Document.name )中访问Document类的字段 name 。 / p>

阅读 @CommonsWare here

提供的选项#2

因此,要访问它,您必须为Document创建一个单独的表。