【问题标题】:Flutter shared_preferences - how to get all the stored values begin with specific wordFlutter shared_preferences - 如何获取所有存储的值以特定单词开头
【发布时间】:2021-08-27 16:13:55
【问题描述】:

我已存储在 shared_preferences 键值对中,如下所示......

  1. item_001 = '一些数据'
  2. item_103 = '一些数据'
  3. item_007 = '一些数据'
  4. item_059 = '一些数据'

我正在尝试获取所有以item_***开头的存储值

我知道如何用单键读写(下面的示例)...但我正在尝试从 shared_preferences 获取项目列表,其中键名以 item_ 开头。

字符串

read: final myString = prefs.getString('my_string_key') ?? '';
write: prefs.setString('my_string_key', 'hello');

字符串列表

read: final myStringList = prefs.getStringList('my_string_list_key') ?? [];
write: prefs.setStringList('my_string_list_key', ['horse', 'cow', 'sheep']);

由于某种原因,我不想将所有项目存储在一个列表中......我想用单独的键存储每个项目。

我在 google 和 stackoverflow 中搜索,不幸的是没有找到正确的答案......

我也查看了这个one,但不明白如何实现部分关键字搜索...

【问题讨论】:

    标签: flutter dart sharedpreferences


    【解决方案1】:

    esetintis 首先解决了这个问题,但我涂鸦了这段代码,所以我想我会分享它。但是是的,您必须首先获取共享首选项中的所有键,然后获取匹配键的值。

    SharedPreferences prefs = await SharedPreferences.getInstance();
    Set<String> keys = prefs.getKeys().where((key)=>key.startsWith('item_'));
    for (String key in keys) {
      String value = prefs.getString(key); // Throws an error if you store something other than a String
      // Do your thing
    }
    

    【讨论】:

      【解决方案2】:

      我认为没有办法进行此类查询。不过,您可以通过一些额外的步骤来解决这个问题。

      1 步:

      使用prefs.getKeys() 方法从SharedPreferences 中获取所有keys。这将返回一个Set 的密钥。现在您可以分配一个List&lt;String&gt; keys = prefs.getKeys().where((k)=&gt;k.startsWith('item_')),它将拥有您想要从Storage 获取的密钥。

      第二个:

      迭代过滤后的数组,调用SharedPreferences获取你想要的值,并将它们保存到某个变量中。

      【讨论】:

        【解决方案3】:

        假设你有一个列表中的所有键,例如:

        List<String> keys = ['item_001', 'item_103', 'item_007', 'item_059', 'other_key', 'blablabla'];
        

        现在,您可以遍历所有这些并检查 “item_”开头的那些,如下所示:

          var itemKeys = [];
          
          for(var i=0;i<keys.length;i++){
            if (keys[i].startsWith('item_')) {
              itemKeys.add(keys[i]);
            }
          }
          
          print(itemKeys); // [item_001, item_103, item_007, item_059]
        

        在上面的示例中,itemKeys 包含您所需的所有密钥。您还可以做的是添加适当的逻辑以从循环中的if 语句中的共享首选项中获取值:

          var result = [];
          
          for(var i=0;i<keys.length;i++){
            if (keys[i].startsWith('item_')) {
              result.add(prefs.getString(keys[i]) ?? '');
            }
          }
        

        result 应该包含您要查找的内容。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-22
          • 2016-02-03
          • 1970-01-01
          • 2020-06-28
          • 1970-01-01
          • 2021-03-29
          相关资源
          最近更新 更多