ObjectBox (Java): запрос свойства для отношения не работает - PullRequest
0 голосов
/ 18 декабря 2018

У меня проблемы с ObjectBox в моем приложении для Android.Все работает, кроме этой проблемы, поэтому я знаю, что с моими классами сущностей все в порядке.

Это инвентарь, который позволяет проводить инвентаризацию нескольких магазинов (магазинов).Каждый 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;

    // ...
}

1 Ответ

0 голосов
/ 21 декабря 2018

После долгих поисков ответа в GitHub ObjectBox и здесь я нашел решение, основанное на этом ответе на 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 (или я мог бы просто получить идентификаторы в long[]).Еще несколько строк кода ...

Тем не менее, я считаю, что это ошибка в реализации ObjectBox, так как она возвращает отношение вместо свойства длинного атрибута.Я открываю вопрос.

...