【问题标题】:swift core data fetching relationshipswift核心数据获取关系
【发布时间】:2014-09-17 16:01:21
【问题描述】:

我有点困惑尝试从 swift 中的 coredata 获取关系数据

个人实体 包含人名和唯一 ID。与书籍的关系是一对多

例如

Person Entity: 
idPerson = 25 - namePerson = John
idPerson = 26 - namePerson = Steve

图书实体包含图书的标题、图书的唯一 ID 以及与人员 (personBook) 的关系 ID。与 Person 的关系是一对一的 例如

Books Entity: 
idBook = 2543 - titleBook = title one - personBook = 25
idBook = 2544 - titleBook = title two - personBook = 25
idBook = 2545 - titleBook = title three - personBook = 26

这里是我的数据模型截图:(没有图片,因为我没有声誉)

人物类

        @objc(Person)
        class Person: NSManagedObject {
              @NSManaged var idPerson: String
              @NSManaged var namePerson: String
              @NSManaged var booksRel: NSSet

        }

书籍类

        @objc(Books)
        class Books: NSManagedObject {
              @NSManaged var bookTitle: String
              @NSManaged var idBook: String
              @NSManaged var personBook: String
              @NSManaged var personRel: Person

        }

获取代码

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

    let request = NSFetchRequest(entityName: "Books")
    request.returnsObjectsAsFaults = false

    request.fetchLimit = 30

    ////////////////////////////
    // CODE TO JOIN Person entity WHERE personBook = idPerson
    ////////////////////////////

    var results:NSArray = context.executeFetchRequest(request, error: nil)!

    for temp in results {
         var data = temp as Books
         ///////////////////////////////////////
         //println(data.namePerson) ----> not working
         ///////////////////////////////////////
    }

是否可以根据 namePerson = personBook 为每本书获取相关的 namePerson ?

非常感谢!

【问题讨论】:

    标签: core-data swift ios8 relationship xcode6gm


    【解决方案1】:

    您的Books 实体不需要属性personBook

    让我们创建一个Person managedObject(使用 Swift 1.0):

    let person = NSEntityDescription.insertNewObjectForEntityForName("Person", inManagedObjectContext: context) as Person
    person.idPerson = 23
    person.namePerson = "John"
    
    var error: NSError?
    if !context.save(&error) {
        println("Unresolved error \(error), \(error!.userInfo)")
        abort()
    }
    

    当你创建一个Books managedObject 时,你可以像这样将它链接到person

    let book = NSEntityDescription.insertNewObjectForEntityForName("Books", inManagedObjectContext: context) as Books
    book.bookTitle = "My book Title"
    book.idBook = 2547
    book.personRel = person
    
    var error: NSError?
    if !context.save(&error) {
        println("Unresolved error \(error), \(error!.userInfo)")
        abort()
    }
    

    现在,当您想获取 Books 时,您可以这样做:

    let fetchRequest = NSFetchRequest(entityName: "Books")
    var error: NSError?
    var booksArray = context.executeFetchRequest(fetchRequest, error:&error)
    if let error = error {
        println("Unresolved error \(error), \(error.userInfo)")
        abort()
    }
    
    for book in booksArray as [Books] {
        let person = book.personRel as Person
    
        println(person.namePerson)
        println(person.idPerson)
    }
    

    【讨论】:

    • 感谢@POB,但核心数据是从 json 中保存的,然后由应用程序获取。例如,今天您只收到了 1 个新人和 50 本书。
    • 我试图解释得更好。该应用程序在不同时间从 json 更新两个实体。我的主要问题是......当我在表格视图或集合视图中获取 Books 实体时,我可以将 Books 实体与 idPerson=personBook 的 person 实体连接起来,以检索 bookTitle 和关联的 namePerson。谢谢!!!!
    【解决方案2】:

    如果我正确理解了您的问题/数据结构,您将需要执行以下操作:

    let fetchRequest = NSFetchRequest(entityName: "Books")
    let bookPersonPredicate = NSPredicate(format: "personRel.idPerson == %@", person.idPerson)
    fetchRequest.predicate = bookPersonPredicate
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多