核心数据查询,每年最近的汽车?

     2023-03-13     23

关键词:

【中文标题】核心数据查询,每年最近的汽车?【英文标题】:Core Data Query, most recent car per year? 【发布时间】:2017-11-16 03:03:28 【问题描述】:

在我的模型中,我有一个 Car 实体。

汽车 年 创建日期 名字

我想运行一个 fetch 来返回每年所有最近的汽车,其中 name 不是 nil(name 可以是 nil)。

因此,如果我有 3 辆 2000 年的汽车和 5 辆 2010 年的汽车,我想从获取请求中总共获得 2 辆汽车(最近的是 2000 年,最近的是 2010 年)。

我不确定如何编写正确的谓词来实现这一点。我查看了 returnDistinctResults 选项,但我不确定这是正确的路径,它还说它只适用于对我不起作用的 NSDictionaryResultType。

完成这项工作的正确查询/谓词是什么?

【问题讨论】:

【参考方案1】:

您最好使用算法简单地遍历每条记录。

允许您的 Car 类,定义以下内容。

struct C 
    var year: Int
    var created: Date
    var name: String?


var cars = [C(year: 2009, created: Date(), name: nil), C(year: 2009, created: Date(), name: "Green"), C(year: 2010, created: Date(), name: "Green"), C(year: 2010, created: Date(), name: "Orange"), C(year: 2010, created: Date(), name: "Orange")]

var carsPerYear = [Int: [String: Int]]()

for car in cars 
    if let name = car.name 
        var info: [String: Int]? = nil
        if carsPerYear.keys.contains(car.year) 
            info = carsPerYear[car.year]
         else 
            info  = [String: Int]()
        
        if !info!.keys.contains(name) 
            info![name] = 0
        
        info![name] = info![name]! + 1
        carsPerYear[car.year] = info
    


for year in carsPerYear.keys 
    let info = carsPerYear[year]!
    let sorted = info.keys.sorted info[$0]! > info[$1]! 
    print(year, sorted.first!)

给出输出

2009 Green 
2010 Orange

有时SQL或CoreData不能轻易解决问题,最好只写排序算法。

【讨论】:

【参考方案2】:

您可以实现这一点,假设您将一个年份数组传递给一个算法,并期望以字典的形式得到一个结果,每一年您作为一个对象的键传入,该对象对应于最那年最近的车。

即:

let years : [Int] = [2000, 2005]


//The ideal method:

func mostRecentFor<T>(years: [Int]) -> [String:T]

假设您只使用少量搜索年份,并且您的数据库中有少量汽车,您不必担心线程问题。否则,对于这种方法,您必须使用并发或专用线程进行提取以避免阻塞主线程。出于测试目的,您不需要这样做。

要做到这一点,您可以使用以下方法。

首先,应该像其他答案所建议的那样在年份上使用数字谓词。 为此,您将使用 NSPredicate 的日期格式:

NSPredicate(format: "date == %@", year)

因此,您的模型应该将年份作为参数,将实际的 nsdate 作为另一个参数。然后,您将使用设置为 1 的 fecthLimit 参数,并将 sortDescriptor 应用于 nsDate 键参数。后两者的组合将确保只返回给定年份的最年轻或最旧的值。

func mostRecentFor(years: [Int]) -> [String:Car] 
        let result : [String:Car] = [:]
        for year in years 
           let request: NSFetchRequest<CarModel> = CarModel.fetchRequest()
           request.predicate = NSPredicate(format: "date == %@ AND name != nil", year)
           request.fetchLimit = 1
           let NSDateDescriptor: let sectionSortDescriptor = NSSortDescriptor(key: "nsDate", ascending: true)
           let descriptors = [NSDateDescriptor]
           fetchRequest.sortDescriptors = descriptors
           do 
                let fetched = try self.managedObjectContext.fetch(request) as 
                [CarModel]
                guard !fetched.isEmpty, fetched.count == 1 else 
                    print("No Car For year: \(year)")
                    return
                
                result["\(year)"] = new[0].resultingCarStruct //custom parameter here.. see bellow
             catch let err 
                print("Error for Year: \(year), \(err.localizedDescription)")
            
        
        return result

我们在这里使用升序设置为true,因为我们希望第一个值,即由于fetchLimit值为1而实际返回的值,是该年份最早的汽车,或者是最小的汽车nsDate 键的时间戳。

这应该为您提供一个用于小型数据存储和测试的简单获取查询。此外,创建一个方法或参数来将 CarModel 解释为其对应的 Car 结构体可以更简单地从 CD 转到内存对象。

所以你会像这样搜索你的汽车:

let years = [1985, 1999, 2005]
let cars = mostRecentFor(years: years)

// cars = ["1985": Car<year: 1985, name: "Chevrolet", nsDate: "April 5th 1985">, "1999" : Car<year: 1999, name: "Toyota Corolla", nsDate: "February 5th 1999">]
// This examples suggests that no cars were found for 2005

【讨论】:

我明白你的意思,这有三个问题: 1. 这种方法需要大量的磁盘,非常非常慢。 2.这个问题不是要求通过一系列年份,我只是想要每年最近的汽车 3.这个答案没有考虑名称!= nil 条件。谢谢。 1:我指定此方法适用于测试/小型数据库,并且您需要将其调整为并发包装器以获取更多信息。 2:“每年”可以表示从一组年份到两个给定年份之间的每一年的任何内容,这至少会导致一个年份数组(或在这种情况下为整数)。 3:确实我忘记了名字,检查 nil 是通过在谓词字符串中添加一个 AND 运算符来完成的,然后在字符串中或使用参数符号添加该避免的值。生病更新 这没有提供问题所要求的答案。对不起。 您的问题是询问查询中指定的每年最早的汽车,其名称没有零? “核心数据查询”,而不是“核心数据查询”。一个查询得到我想要的。您提供的内容在我可能传入的每一年都会进入磁盘。另外,正如我上面所说,我没有指定我想在几年内传递。那是您在此处添加的内容...所以,再次抱歉,但您的回答并未解决问题。谢谢

核心数据插入对象到现有对象

】核心数据插入对象到现有对象【英文标题】:coredatainsertobjecttoexistingobject【发布时间】:2017-01-0919:55:48【问题描述】:Swift和iOS最新版本我创建了一个包含两个实体的核心数据对象模型:所有者和汽车。一位车主可以拥有多辆... 查看详情

试图掌握核心数据中的关系

】试图掌握核心数据中的关系【英文标题】:Tryingtograsprelationshipsincoredata【发布时间】:2013-10-0416:19:46【问题描述】:我正在尝试了解核心数据关系。我有两个实体。一个叫做Driver,它有一个(汽车司机的)姓名、年龄、性别。... 查看详情

核心数据父子UITableView关系

】核心数据父子UITableView关系【英文标题】:CoreDataParent-ChildUITableViewRelationship【发布时间】:2012-07-2402:51:57【问题描述】:我正在尝试创建父子核心数据关系。TableViewA包含汽车制造商,TableViewB包含所选制造商制造的汽车。我想... 查看详情

iPhone核心数据-简单查询

】iPhone核心数据-简单查询【英文标题】:iPhoneCoreData-SimpleQuery【发布时间】:2010-01-2022:14:23【问题描述】:我正在尝试创建一个CoreDataiPhone应用程序。我正在跟踪的实体之一是汽车,每辆汽车的一个属性是“制造商”。在我的应... 查看详情

将子实体加载到核心数据中的托管对象

】将子实体加载到核心数据中的托管对象【英文标题】:Issueloadingsubentitiestomangedobjectincoredata【发布时间】:2013-01-0219:08:50【问题描述】:我认为这是错误的,它只加载一个汽车零件:此方法采用两个数组,一个包含汽车名称,... 查看详情

最近的搜索结果加入核心数据

】最近的搜索结果加入核心数据【英文标题】:MostrecentsearchresultsjoininCoreData【发布时间】:2009-05-1621:11:48【问题描述】:这是对之前savingrecentsearches与CoreData的帖子的后续问题。为了对搜索结果进行分组,我有一个条目实体和历... 查看详情

XCode - 删除核心数据中的相关对象

】XCode-删除核心数据中的相关对象【英文标题】:XCode-Deletingrelatedobjectsincoredata【发布时间】:2013-10-1104:23:57【问题描述】:我有两个实体。一个是司机,一个是汽车一个司机可以有很多辆车,一辆汽车只能有一个司机。这是一... 查看详情

中国汽车企业核心技术优势明显,将在全球市场击败特斯拉

...车占中国汽车出口量的比例已提升45.3%。比亚迪所拥有的核心技术优势比亚迪在国内新能源汽车市场迅速 查看详情

核心数据表视图删除崩溃

】核心数据表视图删除崩溃【英文标题】:CoreDataTableViewDeletingCrash【发布时间】:2012-07-3003:47:25【问题描述】:我在我的iPhone应用程序中设置了父子核心数据关系。我有一个制造商对象和一个汽车对象。它是与制造商作为所有者... 查看详情

库克不愿量产每年投10亿,已耗时8年的苹果汽车何时能面世?

整理|苏宓出品|CSDN(ID:CSDNnews)一直走在软件、硬件最前沿的苹果,如今却在自动驾驶方面「栽」了跟头,八年的厚积,暂未等来薄发,反而负面消息接踵而至,外界也从满心期待转为半信半疑。... 查看详情

核心数据:关系和用户对象

】核心数据:关系和用户对象【英文标题】:CoreData:RelationshipsandUserObjects【发布时间】:2013-04-0519:16:36【问题描述】:我将StackMob与CoreData(远程数据库)一起使用,但我认为这是一个通用的CoreData问题。我有3个实体:用户(登... 查看详情

软件定义算力,算力定义汽车

引言:智能网联汽车四大核心技术——芯片、操作系统、算法、数据共同形成生态闭环,其中,芯片是智能网联汽车生态发展的基石,算力提升是新一代汽车发展的核心方向。因此,在汽车产业快速变革的时... 查看详情

宝马集团携手aws以数据驱动汽车行业创新

...成全面战略协作,将数据和数据分析作为集团决策制定的核心,进一步加快宝马的创新步伐。两家行业领导者将结合各自优势,共同开发基于云计算的解决方案,在汽车生命周期的各个环节(从汽车设计到售后服务)提高效率、... 查看详情

怎么解决汽车制造业cad图纸安全外发问题?

CAD设计图纸是汽车制造企业的核心资产,也是车企产品研发设计的核心竞争力。但是随着CAD文件越来越多、越来越大和供应商数量的不断增长,数据交换变得愈加频繁。这导致CAD数据交换时,无论是整车企业还是其供应商都面临... 查看详情

小鹏飞行汽车完成海外公开首飞;统一充电接口或让苹果每年损失百亿;linus电脑内存问题致linux6.1补丁合并推迟|极客头条...

「极客头条」——技术人员的新闻圈!CSDN的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧。整理|梦依丹出品|CSDN(ID:CSDNnews)一分钟速览新闻点!... 查看详情

核心数据,“按瞬态属性排序”解决方法

】核心数据,“按瞬态属性排序”解决方法【英文标题】:CoreData,"sortingbytransientproperty"workaround【发布时间】:2011-08-1901:05:03【问题描述】:假设我有一个名为Event的CoreData实体,它代表经常性(每年)的事件。每个事件... 查看详情

从尚未提交的上下文中获取数据。核心数据

】从尚未提交的上下文中获取数据。核心数据【英文标题】:Fetchdatafromcontextthatisnotyetcommitted.CoreData【发布时间】:2016-02-0312:59:26【问题描述】:我使用MagicalRecord在默认NSManagedObjectContext中创建了NSManagedObject实体的多个实例(例... 查看详情

带有由核心数据驱动的绑定的 NSOutlineView

】带有由核心数据驱动的绑定的NSOutlineView【英文标题】:NSOutlineViewwithBindingsdrivenbyCoreData【发布时间】:2009-12-2317:47:55【问题描述】:我有一个NSOutlineView作为我的应用程序的源列表,我的数据模型是使用CoreData完成的。我想使用... 查看详情