2015-07-04 3 views
0

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

На данный момент это не работает, данных не сохранено.

Код:

//In view controller showing data 
    //Viewdidload 
    let appDel:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
    let context:NSManagedObjectContext = appDel.managedObjectContext! 

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

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

    if results.count > 0{ 
     var thisUser = results[0] as! People 
     labelMoney.text = "\(thisUser.money)" 
     labelName.text = "\(thisUser.name)" 
     labelProfit.text = "\(thisUser.profit)" 
     if results.count > 1{ 
      var thisUser = results[1] as! People 

     } 
     if results.count > 2{ 
      var thisUser = results[2] as! People 

     } 

    } 

    //In view controller creating name and money 
    //in button 
    let appDel:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
    let context:NSManagedObjectContext = appDel.managedObjectContext! 

    let request = NSFetchRequest(entityName: "People") 
    request.returnsObjectsAsFaults = false 
    //request.predicate = NSPredicate(format: "username = %@", txtUsername.text) 

    var results:NSArray = context.executeFetchRequest(request, error: nil)! 
    if results.count > 0{ 
     var yes = results[0] as! NSManagedObject 
     yes.setValue(money, forKey: "money") 
     yes.setValue(name, forKey: "name") 
    } 
// In game view controller saving data 
//In button 
let appDel:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
    let context:NSManagedObjectContext = appDel.managedObjectContext! 

    let ent = NSEntityDescription.entityForName("People", inManagedObjectContext: context) 

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

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

    var newUser = results[thisPerson] as! People 
    newUser.setValue(profit, forKey: "profit") 
    newUser.setValue(money, forKey: "money") 

    context.save(nil) 
+2

«Что является лучшим способом» и «исправить мой код» являются довольно широкими для переполнения стека ... Попробуйте уточнить свой вопрос. – matt

+0

Всегда избегайте запрашивать код. Более опытным пользователям SO это не нравится. Попробуйте перечислить решения, которые вы уже пробовали, и, возможно, ссылки на другие вопросы, такие как ваши, но где решение не работает. Если вы начали работать с учебником, никогда не бывает плохо, если вы также разместите ссылку на него. Также старайтесь быстро реагировать на комментарии и ответы на свой вопрос. –

ответ

0
//In view controller showing data 
    //Viewdidload 

объявить appDel и свой контекст как переменные класса. Назначают их в viewDidLoad

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

попытки к контексту имя ан запрос более конкретно, это будет держать ваш код читаемым. Это будет запутаться, когда вы начинаете выборки из более чем одного объекта или при использовании более чем одного типа контекста (например, CGContext)

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

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

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

if results.count > 0{ 
     var thisUser = results[0] as! People 
     labelMoney.text = "\(thisUser.money)" 
     labelName.text = "\(thisUser.name)" 
     labelProfit.text = "\(thisUser.profit)" 
     if results.count > 1{ 
      var thisUser = results[1] as! People 

     } 
     if results.count > 2{ 
      var thisUser = results[2] as! People 

     } 

    } 

    //In view controller creating name and money 
    //in button 

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

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

Вы Fetching уже сохраненных данных здесь и назначая обновленные значения ?? Если нет, здесь нет необходимости в получении. Если это так, вы должны обработать его с помощью инструкции if else. Если есть человек, обновить значения, в противном случае создать новый человек ...

let request = NSFetchRequest(entityName: "People") 
    request.returnsObjectsAsFaults = false 
    //request.predicate = NSPredicate(format: "username = %@", txtUsername.text) 

    var results:NSArray = context.executeFetchRequest(request, error: nil)! 
    if results.count > 0{ 
     var yes = results[0] as! NSManagedObject 
     yes.setValue(money, forKey: "money") 
     yes.setValue(name, forKey: "name") 
    } 
// In game view controller saving data 
//In button 
let appDel:AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 
    let context:NSManagedObjectContext = appDel.managedObjectContext! 

    let ent = NSEntityDescription.entityForName("People", inManagedObjectContext: context) 

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

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

    var newUser = results[thisPerson] as! People 
    newUser.setValue(profit, forKey: "profit") 
    newUser.setValue(money, forKey: "money") 

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

context.save(nil) 

Создание нового пользователя:

var newUser = NSEntityDescription.insertNewObjectForEntityForName("People", inManagedObjectContext: context!) as! People 
newUser.profit = 42 
newUser.money = 1984 

context.save() 

Резюме:

  • Попробуйте улучшить свои наименования

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

  • Создание нового экземпляра выполняется с помощью метода insertNewObjectForEntityForName. Назначьте значения, которые вы хотите, и сохраните.

  • Также изучите вопрос об изменении Контекста управляемого объекта. Или освобождение загруженных/недавно сохраненных данных. Это предотвратит внесение изменений в ваши экземпляры, когда вы сохраните что-то еще.

  • Также смотрите на viewWillDisappear и willGoToBackground методы автоматического сохранения ваших данных, когда ваше приложение переходит на задний план или вы отходите от просмотра.

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