我正在构建一个水果购物车,我希望它是持久的。我已经使用 Sembast 成功地实现了水果列表的持久性,但我还没有成功地为购物车做到这一点。
如何从数据库中正确存储和检索 Cart 对象的单个记录?
这是我的代码:
购物车实体
class Cart extends Equatable {
final Map<int, int> cartList;
Cart({this.cartList});
static Cart fromJson(Map<String, dynamic> json) => _$CartFromJson(json);
Map<String, dynamic> toJson() => _$CartToJson(this);
@override
List<Object> get props => [cartList];
}
购物车
Cart _$CartFromJson(Map<String, dynamic> json) {
return Cart(
cartList: (json['cartList'] as Map<String, dynamic>)?.map(
(k, e) => MapEntry(int.parse(k), e as int),
),
);
}
Map<String, dynamic> _$CartToJson(Cart instance) => <String, dynamic>{
'cartList': instance.cartList?.map((k, e) => MapEntry(k.toString(), e)),
};
我的数据库存储库
class DatabaseHandler extends PlantsRepository {
static const String CART_STORE_NAME = 'cart__';
final _cartStore = intMapStoreFactory.store(CART_STORE_NAME);
Future<Database> get _database async => await FrutsDatabase.instance.database;
@override
Future<Cart> getPlantsFromCart() async {
final snap = await _cartStore.find(await _database);
final carts = snap.map((e) => Cart.fromJson(e.value)).toList();
return carts.elementAt(0);
}
@override
Future insertPlantIntoCart(Cart cart) async {
await _cartStore.add(await _database, cart.toJson());
}
}
谢谢。
获取记录的最简单方法是使用其键(或 id,任何适合的名称(。您在添加过程中获得密钥。以下是对DatabaseHandler
类的轻微修改:
class DatabaseHandler extends PlantsRepository {
/// Get a cart by id
Future<Cart> getCart(int id) async {
var map = await _cartStore.record(id).get(await _database);
return map == null ? null : Cart.fromJson(map);
}
/// Add a cart and returns its id
Future<int> addCart(Cart cart) async {
return await _cartStore.add(await _database, cart.toJson());
}
}
可以这样使用:
// Insert the cart
var cartId = await databaseHandler.addCart(cart);
// Read the cart
cart = await databaseHandler.getCart(cartId);