0

我在颤振应用程序中使用 sembast,我有一个 getAll()如下所示的函数:

Future getFavorites() async {
    List favSnapshot = await _favFolder.find(await _db);
    if (favSnapshot.length > 0) {
      return favSnapshot;
     
    } else {
      return null;
    }
  }

它返回以下内容:

[
  Record(favorites, 1) {hello: worls}, 
  Record(favorites, 2) {name: Daredevil, season: 1, episode: 3}, 
  Record(favorites, 3) {name: Daredevil, season: 1, episode: 2}, 
  Record(favorites, 4) {name: Daredevil, season: 3, episode: 2}, 
  Record(favorites, 5) {name: Daredevil, season: 1, episode: 13}, 
  Record(favorites, 6) {name: Daredevil, season: 1, episode: 1}]

如何检查{name: Daredevil, season: 1, episode: 13}我的数据中是否有数据?

4

1 回答 1

0

我可以想到 2 种方法来创建一个过滤器来检查记录是否“包含”一些数据。

您可以组合过滤器:

/// Filter record that contains the same field (i.e. check multiple fields value)
Filter containsMapFilter(Map<String, Object?> map) {
  return Filter.and(
      map.entries.map((e) => Filter.equals(e.key, e.value)).toList());
}

var snapshots = await store.find(db,
    finder: Finder(
        filter: containsMapFilter(
            {'name': 'Daredevil', 'season': 1, 'episode': 13})));

您可以使用自定义过滤器:

/// Filter record that contains the same field (i.e. check multiple fields value)
Filter containsMapFilter(Map<String, Object?> map) {
  return Filter.custom((record) {
    var data = record.value as Map;
    for (var entry in map.entries) {
      if (data[entry.key] != entry.value) {
        return false;
      }
    }
    return true;
  });
}

var snapshots = await store.find(db,
    finder: Finder(
        filter: containsMapFilter(
            {'name': 'Daredevil', 'season': 1, 'episode': 13})));

如果您正在寻找完全匹配,您可以使用自定义过滤器和收集包中的 DeepCollectionEquality:

// import 'package:collection/collection.dart';

/// Filter record that contains the same field (i.e. check multiple fields value)
Filter mapEqualsFilter(Map<String, Object?> map) {
  return Filter.custom((record) {
    var data = record.value as Map;
    return DeepCollectionEquality().equals(map, data);
  });
}

var snapshots = await store.find(db,
    finder: Finder(
        filter: mapEqualsFilter(
            {'name': 'Daredevil', 'season': 1, 'episode': 13})));
于 2021-09-10T17:22:24.900 回答