gpt4 book ai didi

java - 对象框(Java): Property query on a relation doesn't work

转载 作者:行者123 更新时间:2023-11-29 00:57:10 25 4
gpt4 key购买 nike

我的 Android 应用程序中的 ObjectBox 出现问题。一切正常,除了这个问题,所以我知道我的实体类没问题。

它是一种库存,可以对多个商店(商店)进行库存。每个 InventoryItem 都是在进行盘点时扫描的产品。盘点结束后,将根据框中的数据生成一个或多个文本文件。

为每个商店生成一个文件,所以我有这段代码来查找哪些不同的商店被盘点:

Box<InventoryItem> box = app.getBoxStore().boxFor(InventoryItem.class);
long[] shopIds = box.query()
.build()
.property(InventoryItem_.shopId)
.distinct()
.findLongs();

此代码运行时我得到以下信息(仅堆栈跟踪的相关部分):

Caused by: java.lang.IllegalArgumentException: Property "shopId" is of type Relation, but we expected a property of type Long in this context
at io.objectbox.query.PropertyQuery.nativeFindLongs(Native Method)
at io.objectbox.query.PropertyQuery$2.call(PropertyQuery.java:213)
at io.objectbox.query.PropertyQuery$2.call(PropertyQuery.java:210)
at io.objectbox.BoxStore.callInReadTx(BoxStore.java:709)
at io.objectbox.BoxStore.callInReadTxWithRetry(BoxStore.java:654)
at io.objectbox.query.Query.callInReadTx(Query.java:273)
at io.objectbox.query.PropertyQuery.findLongs(PropertyQuery.java:210)
at br.com.donadio.inventario.view.ExportDialog$GenerateFilesAsync.doInBackground(ExportDialog.java:132)
at br.com.donadio.inventario.view.ExportDialog$GenerateFilesAsync.doInBackground(ExportDialog.java:104)
at android.os.AsyncTask$2.call(AsyncTask.java:305)
at java.util.concurrent.FutureTask.run(FutureTask.java:237)
at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:243) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 
at java.lang.Thread.run(Thread.java:761) 

我也尝试在查询中使用 .property(InventoryItem_.shop.targetIdProperty),但它给出了完全相同的错误。我找不到其他方法来执行此操作,也找不到修复我的代码的方法。

我正在使用 AndroidX(这无关紧要)并且我的项目已针对它正确设置。MinSdk为19,MaxSdk为28,targetSdk为28。ObjectBox 版本为 2.2.0。在运行 Android 7.1.1 的设备上调试。

这些是相关实体:

@Entity
public class InventoryItem
{
@Id
public long id;

public String operator;

public ToOne<Area> area;
public long areaId; // expose relationship target ID

public ToOne<Product> product;
public long productId; // expose relationship target ID

public ToOne<Shop> shop;
public long shopId; // expose relationship target ID

public Date timestamp;

// ...
}

@Entity
public class Shop
{
@Id(assignable=true)
public long id;

@Index @Unique
public String name;

@Backlink
public ToMany<InventoryItem> inventoryItems;

// ...
}

最佳答案

在 ObjectBox 的 GitHub 和这里寻找了很多答案之后,我想出了一个基于 this answer on the project's GitHub 的解决方案。 :

List<InventoryItem> items = box.getAll();
ArrayList<Shop> shops = new ArrayList<>();
for (InventoryItem item : items)
{
Shop shop = item.shop.getTarget();
if (!shops.contains(shop))
shops.add(shop);
}

因此,我们只需找到所有内容,然后遍历列表,在 ArrayList 中获取不同的对象(或者我可以将 Id 放入 long[] 中) .只需几行代码...

不过,我认为这是 ObjectBox 实现中的一个错误,因为它返回的是关系而不是长属性上的属性。我正在打开一个问题。

关于java - 对象框(Java): Property query on a relation doesn't work,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53839879/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com