【问题标题】:How do I display JSON data in my tableView when objects have the same value?当对象具有相同的值时,如何在我的 tableView 中显示 JSON 数据?
【发布时间】:2019-05-07 21:52:09
【问题描述】:

我正在尝试根据具有相同值的对象在我的 tableview 单元格中显示 JSON 数据。

现在,我可以将所有 JSON 数据显示到我的单元格行中,但我无法排除不具有相同对象值的数据。

我正在使用这个设置来获取数据:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        // Retrieve cell
        let cellIdentifier: String = "takesTableViewCell"
        let myCell: TakesTableViewCell = tableView.dequeueReusableCell(withIdentifier: cellIdentifier)! as! TakesTableViewCell

        // Get the location to be shown
        let item: LocationModel = feedItems[indexPath.row] as! LocationModel

        // Get references to labels of cell
        myCell.mainNameLabel.text = item.title
        myCell.mainTakeLabel.text = item.take

        return myCell
    }

这是我拥有的示例 JSON 数据

[
   {
      "id":"1",
      "title":"Great Title 1",
      "take":"Testing !!!",
      "movieid":"299534"
   },
   {
      "id":"2",
      "title":"Great Title 2",
      "take":"Testing 1,2,3",
      "movieid":"299666"
   },
   {
      "id":"3",
      "title":"Great Title 3",
      "take":"Testing 1,2,3",
      "movieid":"299534"
   }
]

我只想显示具有相同“movieid”的结果,如下所示:

标题: 伟大的标题 1
参加: 测试!!!

Title: Great Title 3
Take: 测试 1,2,3

【问题讨论】:

  • 在某些方面不是很清楚。只有一个movieid会被复制吗?提前知道是什么吗?如果没有会发生什么?如果有多个怎么办?无论如何,这将需要一些预处理。 tableView 函数不会自动对此进行过滤。也许构建一个以movieid为键的字典,值是一个对象数组,然后遍历键以寻找计数> 1的数组?
  • 可能有多个可以复制的movieid。有些可能不会被复制。我也不知道事先会复制哪些movieid。如何创建字典?这个 JSON 是从我的 PHP 文件创建的,该文件将 mysql 数据库表中的项目转换为 JSON。该数据库是从 iOS 应用帖子中填充的。

标签: json swift uitableview


【解决方案1】:

在后端你只想返回movieid数量计数> 1的记录

SELECT *
FROM movie_table
GROUP BY movie_id
HAVING COUNT(movie_id) > 1;

SQL query for finding records where count > 1

【讨论】:

  • 看,你给了我快速的代码,这就是我所想的。这是一个更好的解决方案。
  • 问题是,我将不得不创建大量 swift 文件来调用不同的后端文件。我希望在 swift 文件中对数据库进行一次调用,然后将其设置为另一个视图控制器将从该 swift 文件中提取所需的特定数据,具体取决于它所在的视图。
  • 另外,JSON 将是动态的,我无法事先知道 ID 是什么。我正在使用电影数据库 API。用户将能够单击具有其唯一 ID 的电影。然后他们点击一个按钮来创建一个关于电影的“镜头”,它会进入数据库。我想根据电影 ID 检索那些特定的镜头。
  • 为什么您只希望电影 id 重复拍摄?我不知道“电影数据库 API”是什么。您是否有权配置这些 API?如果是这样,我建议您创建一个新的 API 来生成我发布的查询。如果您必须在所有客户端执行此操作,则需要实现一个字典来获取@GntlmnBndt 回答的计数。
【解决方案2】:

首先将对象数组转换为字典。

var movieDict: [String:[[String:String]]] = []
for movObj in jsonData {
    guard let key = movObj["movieid"] else { continue }
    var objArr = movieDict[key] ?? []
    objArr.append(movObj)
    movieDict[key] = objArr
}

然后你可以查看哪些有多个具有相同movieid的对象。

for (k, v) in movieDict {
    if v.count > 0 {
        // either track the keys, or tableData = v
    }
}

【讨论】:

    猜你喜欢
    • 2020-07-11
    • 2021-07-13
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多