这是我使用SEMBAST存储在设备中的示例数据库结构。
{
"household": [
{
"id": "1",
"group": {
"group_id": "1",
"group_name": "UP"
},
"states": {
"state_id": "1",
"state_name": "UP"
},
"cluster": {
"cluster_id": "1",
"cluster_name": "Saharanpur"
},
"hid": "A02",
"total_family_members": "5",
"famil_income": "3400000",
"bpl": {
"bpl_id": "1",
"bpl_name": "Yes"
},
"duration": "90",
"religion": {
"religion_id": "1",
"religion_name": "Hindu"
},
"residence": {
"residence_id": "1",
"residence_type": "Rented"
},
"individual_details": [
{
"id": "0001",
"pid": "ASDASD3453456",
"enu_date": "11-5-2019",
"personal_details": {
"name": "Redox",
"dob": "11-5-1987",
"age": "32"
},
"sex": {
"sex_id": "1",
"sex_type": "Female"
},
"relationship": {
"relationship_id": "1",
"relationship_type": "self"
},
"marital": {
"maritial_id": "1",
"maritial_type": "Married"
},
"occupation": {
"occupation_id": "1",
"occupation_type": "Professional"
},
"income": "20000",
"enroll": {
"enroll_id": "1",
"enroll_type": "Eligible",
"specific_reason": "No",
"other_reason": ""
}
},
{
"id": "0002",
"pid": "ASDASD3453456",
"enu_date": "11-5-2019",
"personal_details": {
"name": "Redox",
"dob": "11-5-1987",
"age": "32"
},
"sex": {
"sex_id": "1",
"sex_type": "Female"
},
"relationship": {
"relationship_id": "1",
"relationship_type": "self"
},
"marital": {
"maritial_id": "1",
"maritial_type": "Married"
},
"occupation": {
"occupation_id": "1",
"occupation_type": "Professional"
},
"income": "20000",
"enroll": {
"enroll_id": "1",
"enroll_type": "Eligible",
"specific_reason": "No",
"other_reason": ""
}
}
]
}
]
}
从以上数据中,我希望单独删除以下数组,这是“ individual_details”键下的第一个数组值。
{
"id":"0001",
"pid":"ASDASD3453456",
"enu_date":"11-5-2019",
"personal_details":{
"name":"Redox",
"dob":"11-5-1987",
"age":"32"
},
"sex":{
"sex_id":"1",
"sex_type":"Female"
},
"relationship":{
"relationship_id":"1",
"relationship_type":"self"
},
"marital":{
"maritial_id":"1",
"maritial_type":"Married"
},
"occupation":{
"occupation_id":"1",
"occupation_type":"Professional"
},
"income":"20000",
"enroll":{
"enroll_id":"1",
"enroll_type":"Eligible",
"specific_reason":"No",
"other_reason":""
}
},
我在Flutter中的代码在下面
Future deleteHousehold(Household houseHold,int index) async {
final finder = Finder(filter: Filter.byKey(houseHold.individualDetails[index].id));
await _householdStore.delete(await _db, finder: finder);
}
我也尝试过
final finder = Finder(filter: Filter.equal("pid",houseHold.individualDetails[index].id));
await _householdStore.delete(await _db, finder: finder);
final finder = Finder(filter: Filter.equals("id", houseHold.individualDetails[index].id));
但是我无法删除此特定行。非常感谢您的帮助。
答案 0 :(得分:0)
Sembast是基于文档的数据库。您可以更新文档中的单个字段。因此,如果要更新数组中的项目,则必须更新整个数组(但只能更新此数组,例如在Firestore中)
我不确定您的示例中的记录是什么(是“住所”记录列表或文档中的字段),但是您可以轻松地通过键更新/删除记录。我在下面的伪示例中简化了您的数据集。
var store = intMapStoreFactory.store('household');
// Add a document
var key = await store.add(db, {
"residence": {"residence_id": "1", "residence_type": "Rented"},
"individual_details": [
{"id": "0001", "pid": "ASDASD3453456"}
]
});
// Get its reference
var record = store.record(key);
// Update a single field
await record.put(db, {'individual_details': [{"id": "0002", "pid": "ASDASD3453456"}]}, merge: true);
expect(await record.get(db), {
'residence': {'residence_id': '1', 'residence_type': 'Rented'},
'individual_details': [{'id': '0002', 'pid': 'ASDASD3453456'}]
});
// Delete the record
await record.delete(db);
答案 1 :(得分:0)
如果可以的话,在 dart 中操作对象也可能更容易。
final _dbStore = sembast.intMapStoreFactory.store('hokusai_paintings');
final recordSnapshot = await _dbStore.find(_database);
final HokusaiPaintsList =
recordSnapshot.map((e) => HokusaiPainting.fromJson(e.value)).toList();
HokusaiPaintsList.removeWhere((element) => element.id == data.id);
await _dbStore.delete(_database);
await _dbStore.addAll(_database, HokusaiPaintsList.map((h) => h.toJson()).toList());
答案 2 :(得分:0)
//delete using Finder
final finder = Finder(
filter: Filter.and(
[ //you can add more filters
Filter.equals(userId, 10),
],
));
await _chatTable.delete(await _db, finder: finder);
//delete using key
await _ chatTable.record(userId).delete(await _db);