Целевой объект сохраненного отношения 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();
}