Целевой объект сохраненного отношения Objectbox равен нулю для ToOne и ToMany

Недавно обновился с 1.0.0 до 1.1.1, и мой код отношения перестает работать, я не уверен, что именно я пропустил, но все, вплоть до запроса элемента, похоже, работает правильно.

Это то, что у меня есть, и мне действительно нужна помощь, чтобы выяснить, что я пропустил

Создание магазина:

        void initializeUserInventory() async {
    await getApplicationDocumentsDirectory().then((dir) {
      try {
        _quickSaveStore =
            Store(getObjectBoxModel(), directory: dir.path + '/quickSaveItems');
        _quickActionStore = Store(getObjectBoxModel(),
            directory: dir.path + '/quickSaveActions');
        _categorizedSaveStore = Store(getObjectBoxModel(),
            directory: dir.path + '/categorizedSaveItems');
        _itemCategoryStore = Store(getObjectBoxModel(),
            directory: dir.path + '/categorizedSaveCategories');
        _itemTagsStore = Store(getObjectBoxModel(),
            directory: dir.path + '/categorizedSaveTags');
      } catch (e) {
        print(e.toString());
      }
    }).whenComplete(() {
      // Must initialize everything else after completion of store initialization!
      _userQuickSaveBox = Box<InitialItem>(_quickSaveStore!);
      _quickActionSaveBox = Box<QuickSaveAction>(_quickActionStore!);
      _categorizedSaveBox = Box<InitialItem>(_categorizedSaveStore!);
      _itemCategoryBox = Box<ItemCategory>(_itemCategoryStore!);
      _itemTagsBox = Box<ItemTag>(_itemTagsStore!);
    });
  }

Вот файлы сущностей:InitialItem:

      part 'initial_item.g.dart';

@JsonSerializable(explicitToJson: true)
@Entity()
class InitialItem {
  String? itemName;
  String? inc;
  DateTime cacheTime;
  DateTime? saveTime;


  @Id(assignable: true)
  int id;

  //#region Category
  //
  // Functions that are utilized for Saving the item by Category
  //
  /// Holds the count of how many items the vehicle/WO needs
  int? quantity;

  /// Any comments the user has added to the item
  String? userComment;

  /// Category that the item belongs too
  final itemCategory = ToOne<ItemCategory>();

  /// Allows adding a tag to the saved item
  final tags = ToMany<ItemTag>();

  //#endregion


  InitialItem(
      {this.id = 0,
      this.itemName,
      this.inc,
      this.quantity = 1,
      DateTime? cacheTime,
      DateTime? saveTime,
      this.userComment = '',})
      : cacheTime = cacheTime ?? DateTime.now(),
        saveTime = cacheTime ?? DateTime.now();
}

Категория товара:

      part 'item_category.g.dart';

@JsonSerializable(explicitToJson: true)
@Entity()
class ItemCategory {
  int id;
  String? categoryUid;
  String? userUid;
  String? categoryName;
  String? categoryComment;

  @Backlink()
  final items = ToMany<InitialItem>();

  ItemCategory(
      {this.id = 0,
      this.userUid,
      this.categoryName,
      this.categoryUid,
      this.categoryComment});
}

ItemTag:

      part 'item_tag.g.dart';

@JsonSerializable(explicitToJson: true)
@Entity()
class ItemTag {
  int id;
  String? name;

  /// Only used for FilterChip display, not saved in any database
  @Transient()
  bool isSelected;
  String? uid;

  ItemTag({this.id = 0, this.name, this.isSelected = false, this.uid});
}

Теги и категории уже созданы пользователем и сохранены в своих ящиках. Элемент передается в представление, пользователь может добавить тег (ы) к элементу и может выбрать категорию для сохранения элемента.

        /// Attaches the tags that the user selected to the item for saving
  void attachTagsToItem() {
    // Clear all previous tags before adding the selected tags
    savingItem?.tags.clear();
    savingItem?.tags.addAll(enabledTagList);
  }

Затем элемент имеет выбранную категорию, записанную в его цель в One, и он сохраняется - saveItem правильно имеет все в нем прямо здесь

        bool saveCategorizedItem() {
    if (selectedCategory != null) {
      // Set the item category
      savingItem!.itemCategory.target = selectedCategory;

      _userInventoryService.addCategorizedItemToLocal(savingItem!);

      return true;
    } else {
      return false;
    }
  }

Где это сохранено - на данный момент все проверяется. Я могу отлаживать и видеть теги и информацию в их переменных, и я могу видеть категорию и информацию о ней в itemCategory.

        void addCategorizedItemToLocal(InitialItem saveItem) {
    _categorizedSaveBox.put(saveItem);
    print('Item saved to categorized database');
  }

Позже я запрашиваю каждый сохраненный элемент, чтобы сгруппировать их в списки.

        /// Returns all the of Items that have been categorized and saved
  List<InitialItem> getAllCategorizedItems() => _categorizedSaveBox.getAll();

------------------------------------------------------------------------------------------
Calling the query in the View Provider's class
  void getCategorizedItems() {
    _categorizedSaveList = _userInventoryService.getAllCategorizedItems();
    notify(ViewState.Idle);
  }

Затем я пытаюсь создать список, используя возвращенный запрос. element.itemCategory.target возвращает null, то же самое касается тегов. Как я уже говорил, все это ранее работало в версии 1.0.0, и после обновления оно не работает без каких-либо других изменений. Что-то не так с запросом в целом? Я могу просматривать отношения в окне отладки, поэтому я предполагаю, что это установлено правильно, просто не похоже, что объекты с исходным запросом вытягиваются. Может ли кто-нибудь пролить свет на то, что я делаю неправильно?

        Widget categorizedList(BuildContext context) {
    final saveProvider =
        Provider.of<UserInventoryProvider>(context, listen: true);
    return GroupedListView<dynamic, String>(
      physics: const BouncingScrollPhysics(),
      elements: saveProvider.categorizedSaveList,
      groupBy: (element) => element.itemCategory.target!.categoryName,
      groupComparator: (d1, d2) => d2.compareTo(d1),
      groupSeparatorBuilder: (String value) => Padding(
        padding: const EdgeInsets.all(8.0),
        child: Text(value,
            textAlign: TextAlign.center,
            style: TextStyles.kTextStyleWhiteLarge),
      ),
      indexedItemBuilder: (c, element, index) {
        return Container();
      },
    );
  }

1 ответ

После всех разговоров в комментариях я наконец заметил, что вы инициализируете несколько магазинов. Фактически вы работаете с несколькими автономными базами данных, поэтому отношения не могут работать должным образом. Ваш initializeUserInventory() должно выглядеть примерно так:

      void initializeUserInventory() async {
  _store = await openStore(); // new shorthand in v1.1, uses getApplicationDocumentsDirectory()
  _userQuickSaveBox = _store.box();
  _quickActionSaveBox = _store.box();
  _categorizedSaveBox = _store.box();
  _itemCategoryBox = _store.box();
  _itemTagsBox = _store.box();
}
Другие вопросы по тегам