2015-08-09 2 views
1

Я работаю над основным приложением данных, и в настоящее время у меня есть правильная настройка методов, чтобы сохранить основной объект, сохраняя имя колоды пользователей, но он не сохраняет отзыв вторичной объект, хотя метод, используемый для сохранения обоих, идентичен. Первичный сохраняет второе, хотя мне интересно, имеет ли значение порядок сохранения объектов. Я знаю, что это реляционная, но я полагал, что неважно, было ли вторичное вызвано, чтобы сохранить до первичного. Я по-прежнему новичок в основных данных, поэтому достаточно простого ответа. Если мне сначала нужно сохранить первичный объект объекта, я создам приложение таким образом, чтобы это произошло, иначе мне, возможно, придется переустановить код, чтобы понять, почему он не вызывает.Первичная сущность против вторичных объектов о объектах сохранения данных ядра

Это код, который должен сохранить до названия сохраняются в реляционной образом:

@IBAction func buttonWarrior(sender: AnyObject) { 

    let entity = NSEntityDescription.entityForName("ClassSelection", inManagedObjectContext: classMOC!) 

    let newObject = ClassSelection(entity: entity!,insertIntoManagedObjectContext: classMOC) 

    newObject.classname = "Warrior" 

    var error: NSError? 

    classMOC?.save(&error) 

    if let err = error { 

     println(err) 

    } else { 

    self.performSegueWithIdentifier("popOver", sender: self) 

    } 
} 

Это код, используемый для хранения первичного объекта, который представляет собой другой файл viewcontroller.swift чем другой. Это отображается как поле для всплытия над вторичным объектом. Эта часть работает отлично, и напоминает правильно:

@IBAction func enterButton(sender: AnyObject) { 

    let entityDescription = NSEntityDescription.entityForName("Deck",inManagedObjectContext: managedObjectContext!) 

    let storeDeck = Deck(entity: entityDescription!,insertIntoManagedObjectContext: managedObjectContext) 

    storeDeck.deckname = usersDeckName.text 

    var error: NSError? 

    managedObjectContext?.save(&error) 

    if let err = error { 

     status.text = err.localizedFailureReason 


    } else { 

     usersDeckName.text = "" 
     status.text = "Deck Saved" 
     self.performSegueWithIdentifier("showCardSelection", sender: self) 

    } 

} 

Метод отзыва Я пытаюсь использовать не может иметь смысл в это текущей итерации, как я пытался много различных методов:

@IBOutlet weak var decksListed: UITableView! 

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

var savedDecksClass = [ClassSelection]() 

var frc: NSFetchedResultsController = NSFetchedResultsController() 

var frcClasses: NSFetchedResultsController = NSFetchedResultsController() 

func getFetchedResultsController() -> NSFetchedResultsController { 
    frc = NSFetchedResultsController(fetchRequest: listFetchRequest(), managedObjectContext: managedObjectContext!, sectionNameKeyPath: nil, cacheName: nil) 

return frc 

} 

func getClassesFetchedResultsController() -> NSFetchedResultsController { 

    frcClasses = NSFetchedResultsController(fetchRequest: classFetchRequest(), managedObjectContext: managedObjectContext!, sectionNameKeyPath: nil, cacheName: nil) 

return frcClasses 

} 

func listFetchRequest() -> NSFetchRequest { 

    let fetchRequest = NSFetchRequest(entityName: "Deck") 
    let sortDescriptor = NSSortDescriptor(key: "deckname", ascending: true) 
    fetchRequest.sortDescriptors = [sortDescriptor] 

    return fetchRequest 

} 
func classFetchRequest() -> NSFetchRequest { 

    let fetchRequestClasses = NSFetchRequest(entityName: "Deck") 
    let classSortDescriptor = NSSortDescriptor(key: "classname", ascending: true) 
    fetchRequestClasses.sortDescriptors = [classSortDescriptor] 

    return fetchRequestClasses 
} 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 

    let numberofRowsInSection = frc.sections?[section].numberOfObjects 

    return numberofRowsInSection! 

} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 

    let cell = tableView.dequeueReusableCellWithIdentifier("usersDeck", forIndexPath: indexPath) as! UITableViewCell 

    let listed = frc.objectAtIndexPath(indexPath) as! Deck 
    cell.textLabel?.text = listed.deckname 
    let listedClass = frcClasses.objectAtIndexPath(indexPath) as! ClassSelection 
    cell.detailTextLabel!.text = listedClass.classname 
    return cell 

} 

func controllerDidChangeContent(controller: NSFetchedResultsController) { 

    decksListed.reloadData() 

} 


override func viewDidLoad() { 
    super.viewDidLoad() 

    frcClasses = getClassesFetchedResultsController() 
    frcClasses.delegate = self 
    frc.performFetch(nil) 
    frc = getFetchedResultsController() 
    frc.delegate = self 
    frc.performFetch(nil) 

} 

Я надеюсь, что это достаточно, чтобы дать вам представление. Я проверил отношения, и все они кажутся правильными в модели. Я извиняюсь за продвинутый подход к тому, как некоторые из кодов выглядят, я планирую сократить его после того, как все редактирование сделано и работает.

+0

Метод 'save'' NSManagedObjectContext' сохраняет ВСЕ изменения в контексте. Таким образом, последовательность, в которой они созданы, не имеет значения. Отредактируйте сообщение, чтобы включить код - есть и другие проблемы. – pbasdf

+0

Я изменил сообщение, как и спросил, надеюсь, это даст вам представление о том, что я сделал, и что я, вероятно, ошибаюсь. Также не уверен, имеет ли значение для простой базовой модели данных, но я просто использую делегат приложения в качестве постоянного координатора хранилища, поскольку я не был достаточно храбр, чтобы экспериментировать за пределами этого еще и сам себя учил. Я не думал, что это очень важно для простого приложения, которое хранит только основные данные. – Matthew

+0

Извините, что я осознал одну вещь, о которой забыл упомянуть в запросе выборки, который вызывает колоду с именем «classname», с которым я попытался использовать фактический класс ClassSelection, а не колоду, и все еще имел ту же всплывающую ошибку, которая была Thread 1: EXC_BAD_ACCESS (code = 1, address = 0x0) – Matthew

ответ

0

Благодаря pbasdf за помощь в этом. Чат, который он открыл, фактически содержал именно то, что нужно было сделать. Я просто не сохранял отношения и передавал объект с одного контроллера вида на следующий. После того, как я показал, как это сделать с примером, я понял все остальное! В принципе, он никогда бы не смог вспомнить объект, поскольку он никогда не знал, что они связаны ... глупо меня! Еще раз спасибо!

Смежные вопросы