我在干净的架构中使用 Riverpod 和 ObjectBox 和 Flutter 2.8。最近,我一直在解决在 Flutter 中使用 ObjectBox 的一些问题。
我从转换为模型的 API 获取数据。然后在我认为使用它们的实体列表中。
当我切换到飞行模式时,objectbox 不再显示任何数据。我搜索了,但我找不到任何可以解释这一点的东西。[已解决]
当我检索我的硬币和与硬币链接的图像时 (OneToOne)。我做了这两个查询来获取它们。有用。我将每个硬币的这两个实体整合到我的列表中。但是我不确定这是呈现数据的最佳方式。
我应该在这里对两个实体进行一次查询吗?要将它们添加到盒子中,会putQueued
或putAsync
更合适吗?
感谢您对这种情况的所有阅读和观点。我将继续我的研究并编辑这篇文章。
- 编辑 2021 年 12 月 14 日
好的 !我解决了问题 1. 我的朋友。我完全忘记了对另一个列出我的硬币的实体的连接检查。所以他不是在没有联系的情况下列出清单。现在它起作用了。
仍然对您对第 2 点的看法持开放态度。
class CoinRepositoryImpl extends CoinRepository {
final CoinRemoteApi _remoteApi;
final ObjectBoxDatabase _objectBoxDatabase;
CoinRepositoryImpl(
this._remoteApi,
this._objectBoxDatabase,
);
@override
Future<List> getCoinById(selectedCoin) async {
ConnectivityResult connectivityResult = await (Connectivity().checkConnectivity());
final _boxCoin = _objectBoxDatabase.store.box<Coin>();
final _boxImage = _objectBoxDatabase.store.box<Image>();
if (connectivityResult == ConnectivityResult.wifi) {
final entitiesList = await getRemoteDataCoin(selectedCoin);
for (var entity in entitiesList) {
addEntity(entity);
}
}
final Query<Coin> queryCoin = (_boxCoin.query(Coin_.coinId.equals(selectedCoin))).build();
int idCoin = queryCoin.findFirst()!.id;
final Query<Image> queryImage = (_boxImage.query(Image_.id.equals(idCoin))).build();
List<dynamic> entities = [];
if (queryCoin.findFirst() != null && queryImage.findFirst() != null) {
entities.add(queryCoin.findFirst());
entities.add(queryImage.findFirst());
}
}
@override
Future<void> addEntity(object) async {
final _boxCoin = _objectBoxDatabase.store.box<Coin>();
final _boxImage = _objectBoxDatabase.store.box<Image>();
if (object.runtimeType == Coin) {
_boxCoin.put(object);
}
if (object.runtimeType == Image) {
_boxImage.put(object);
}
}
// Retrieves remote data and formats it in models.
// Then, its models are injected into the entities with toEntities.
Future<List> getRemoteDataCoin(selectedCoin) async {
return _remoteApi.getCoinById(
selectedCoin,
const CoinRequest(
localization: 'false',
tickers: false,
marketData: false,
communityData: true,
developerData: false,
sparkline: false
)
).then(
(value) => value.toEntities()
);
}
}
class ObjectBoxDatabase {
late final Store store;
late final Box<Coin> _boxCoin;
late final Box<Image> _boxImage;
ObjectBoxDatabase._create(this.store) {
_boxCoin = store.box();
_boxImage = store.box();
}
static Future<ObjectBoxDatabase> initialization() async {
final store = await openStore();
return ObjectBoxDatabase._create(store);
}
}
@Entity()
class Coin extends Equatable {
int id;
@Index()
final String coinId;
final String symbol;
final String name;
final image = ToOne<Image>();
@Property(type: PropertyType.date)
final DateTime lastUpdated;
final coinList = ToOne<CoinsList>();
Coin({
this.id = 0,
required this.coinId,
required this.symbol,
required this.name,
required this.lastUpdated,
});
@override
List<Object?> get props => [
id,
coinId,
symbol,
name,
lastUpdated,
];
}
@Entity()
class Image extends Equatable {
int id;
final String thumb;
final String small;
final String large;
final coin = ToOne<Coin>();
Image({
this.id = 0,
required this.thumb,
required this.small,
required this.large,
});
@override
List<Object?> get props => [
id,
thumb,
small,
large,
coin
];
}