swift核心数据获取关系
Posted
技术标签:
【中文标题】swift核心数据获取关系【英文标题】:swift core data fetching relationship 【发布时间】: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 ?
非常感谢!
【问题讨论】:
【参考方案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
【讨论】:
以上是关于swift核心数据获取关系的主要内容,如果未能解决你的问题,请参考以下文章