gpt4 book ai didi

Swift:核心数据在 TableView 中显示唯一记录

转载 作者:行者123 更新时间:2023-11-30 13:51:09 30 4
gpt4 key购买 nike

我试图仅显示名为“Persons”的核心数据实体中唯一的“名称”。由此,我目前正在从“名称”属性中获取“年龄”、“描述”和“国家/地区”。但是,我希望它只显示每个名称的一个实例(仅唯一名称),而不是显示两个“Bob”、三个“Sara”和七个“Ali”。我试图仅显示单元格中“nameLabel”中的唯一名称,同时在其他 TableView 单元格标签中显示“添加日期”的最新记录。这基本上就是我想要实现的目标:

安德烈亚斯 - 12/13/2015阿里 - 10/10/2015约翰 - 05/04/2015

等等..

//即使可能 5 个 Andreas 已经存在,我只想显示一个,但添加了最新的“日期”。

这是我当前拥有的代码,它可以工作 - 但不会过滤任何内容。

我的全局变量:

var Names : [NSManagedObject] = []
var Dates : [NSManagedObject] = []

在我的 ViewDidLoad 中:

let delegate = UIApplication.sharedApplication().delegate as! AppDelegate
let context = delegate.managedObjectContext


let request = NSFetchRequest(entityName: "Persons")

var err:NSError?

do {

Names = try context.executeFetchRequest(request) as! [NSManagedObject]
Dates = try context.executeFetchRequest(request) as! [NSManagedObject]

} catch let err1 as NSError {
err = err1
}

if err != nil {
print("Problem loading data..")
}

在我的 tableView cellForRowAtIndexPath 中:

 let Name = Names[indexPath.row]
let DateAdded = Dates[indexPath.row]

let cell = tableView.dequeueReusableCellWithIdentifier("Cell", forIndexPath: indexPath) as! TableViewCell


if Name.valueForKey("name") != nil {
cell.nameLabel!.text = Name.valueForKey("name") as! String
} else {
cell.nameLabel!.text = ""
}
if DateAdded.valueForKey("date") != nil {
cell.dateLabel!.text = DateAdded.valueForKey("date") as! String
} else {
cell.dateLabel!.text = ""
}


return cell

任何帮助将不胜感激,因为我已经为此奋斗了数周,试图解决这个“谜团”。

最佳答案

我尚未测试此代码,但您应该使用聚合函数来获得您想要的内容。它应该是这样的。您可能需要稍微调整一下,但这应该可行。

func fetchLastUpdateDates(context: NSManagedObjectContext) -> [String: NSDate] {
var namesWithDates = [String: NSDate]()

var properties = [AnyObject]()

// retrieve the name value in the results
properties.append("name")

// retrieve the max value of date in the aggregate
let latestDateDescription = NSExpressionDescription()
latestDateDescription.name = "LastDate"
latestDateDescription.expression = NSExpression(format: "@max.date")
latestDateDescription.expressionResultType = .DateAttributeType
properties.append(latestDateDescription)

let request = NSFetchRequest(entityName: "Persons")
// aggregate by "name" - results in one entry per name
request.propertiesToGroupBy = ["name"]

// need to use the "dictionary" result type because aggregate doesn't represent an actual record
request.resultType = .DictionaryResultType
request.propertiesToFetch = properties

context.performBlockAndWait {
do {
if let results = try context.executeFetchRequest(request) as? [[String: AnyObject]] {
// convert the results in to name-date dictionary
for result in results {
if let name = result["name"] as? String, date = result["LastDate"] as? NSDate {
namesWithDates[name] = date
}
}
}
} catch _ {
// handle your errors here
}
}
return namesWithDates
}

您实际上并不需要将结果转换为 name-date 字典,还可以将 sortDescriptors 添加到 request 以便列表根据需要排序。但这取决于你。

关于Swift:核心数据在 TableView 中显示唯一记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34253858/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com