Flutter:如何从Sembast数据库中存储和检索单个项目/对象



我正在构建一个水果购物车,我希望它是持久的。我已经使用 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);

最新更新