【问题标题】:Get Multiple Rows on SQLite in Flutter在 Flutter 中获取 SQLite 上的多行
【发布时间】:2021-03-17 21:04:17
【问题描述】:

我只保留数据库中“favorite”表中添加到收藏夹的产品“productID”信息。我将此信息添加到表中没有问题。 (product表和favorite表是分开的。)但是当我想在表中列出所有喜欢的产品时,我找到了可以让我一一查询的代码。我需要的是一个可以将 List<int> productIDs 作为参数并将最喜欢的产品返回为 List<Map<String, dynamic>>> 的函数。我几乎到处找,但找不到。 我用来获取存储在favorite 表中的最喜欢的产品 ID 的函数:

Future<List<Map<String, dynamic>>> favProds() async{
    List<int> IDs = new List<int>();
    var db = await _getDatabase();
    var result = await db.query(_favTable, orderBy: '$_columnProdID DESC');
    for(Map incomingMap in result){
      IDs.add(incomingMap['prodID']);
    }
    return _getFavProdsWithIDList(IDs);
  }

这是我的函数,它以 ID 列表作为参数,并返回一个包含最喜欢的产品的列表作为地图:

Future<List<Map<String, dynamic>>> _getFavProdsWithIDList(List<int> IDs) async{
    var db = await _getDatabase();
    var result = await db.query("$_prodTable", where: '$_columnProdID = ?', whereArgs: IDs);
    return result;
  }

这是我使用它们时遇到的错误:

Unhandled Exception: DatabaseException(Cannot bind argument at index 8 because the index is out of range.  The statement has 1 parameters.) sql 'SELECT * FROM urun WHERE urunID = ?' args [230, 180, 179, 20, 19, 18, 17, 2]}

从这个错误中,我们看到添加产品到favorite表是成功的。

【问题讨论】:

    标签: database sqlite flutter dart async-await


    【解决方案1】:

    如果你想在 id 列表中选择 id 的记录,你应该使用类似查询

    SELECT * FROM urun WHERE urunID IN (1, 2, 3);
    

    你有两个选择。

    1. 提供与列表长度相同数量的占位符
    final placeholders = List.generate(5,(_) => "?").join(",");
    var result = await db.query("$_prodTable", where: '$_columnProdID IN ($placeholders)', whereArgs: IDs);
    
    1. 因为 ids 只是整数
    var result = await db.query("$_prodTable", where: '$_columnProdID IN (${IDs.join(",")})');
    

    【讨论】:

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