我的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实现中存在一个错误,因为它返回的是关系,而不是long属性的属性。我在开一个问题。