SEMBAST-如何从数据库中删除特定的阵列?

时间:2019-06-06 13:42:53

标签: flutter dart nosql

这是我使用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));

但是我无法删除此特定行。非常感谢您的帮助。

3 个答案:

答案 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);