Swiftのcoredataからリレーションデータをフェッチしようとすると少し混乱します
個人エンティティ個人の名前と一意のIDが含まれます。本との関係は1対多です
例えば
Person Entity:
idPerson = 25 - namePerson = John
idPerson = 26 - namePerson = Steve
Books Entity書籍のタイトル、書籍の一意のID、および個人との関係ID(personBook)が含まれます。人との関係は1対1です例えば
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をすべての本に対してフェッチすることは可能ですか?
どうもありがとうございました!
personBook
エンティティにプロパティBooks
は必要ありません。
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)
}
私があなたの質問/データ構造を正しく理解しているなら、あなたは次のようなことをしたいと思うでしょう:
let fetchRequest = NSFetchRequest(entityName: "Books")
let bookPersonPredicate = NSPredicate(format: "personRel.idPerson == %@", person.idPerson)
fetchRequest.predicate = bookPersonPredicate