2016-05-18 1 views
1

Я новичок в CoreData. Я построил очень простой интерфейс счетчика, который увеличивает число на 1 каждый раз при просмотре представления. Очень просто. Необходимо реализовать CoreData, чтобы число сохранялось при следующем открытии.CoreData - сохранение целого числа, которое обновляется при нажатии кнопки

Вот мой код

свойства уровня класса

var timer = Int() 
var name = Int() 
let appDel: AppDelegate = UIApplication.sharedApplication().delegate as! AppDelegate 

viewDidLoad

override func viewDidLoad() { 
    super.viewDidLoad() 
    let context: NSManagedObjectContext = appDel.managedObjectContext 
    do { 
     let request = NSFetchRequest(entityName: "Model") 
     let results = try context.executeFetchRequest(request) 

     for item in results{ 
      let name = item.valueForKey("counter") as! Int 
      print("The counter # saved in Core Data is: \(name)") 
      counterOutlet.text = "\(name)" 

      // Updated 
      if name > timer { 
       timer = name 
      } 
     } 

    } 
    catch { 
     print("Error retrieving from Core Data.") 
    } 
} 

Просмотр резьбовыми (увеличить счетчик, и сохранить на диск

@IBAction func tapGestureRecognizerTapped(sender: UITapGestureRecognizer) { 
    timer += 1 
    print(timer) 
    counterOutlet.text = "\(timer)" 

    let context: NSManagedObjectContext = appDel.managedObjectContext 

    // Add stuff to CD 
    let mySavedCounter = NSEntityDescription.insertNewObjectForEntityForName("Model", inManagedObjectContext: context) 
    mySavedCounter.setValue(timer, forKey: "counter") 


    // Add the info to the entity! 
    do { 
     try context.save() 
    } 
    catch { 
     print("Error saving to Core Data.") 
    } 
} 

Моя модель данных xcdatamodel

Когда я загрузить приложение в первый раз когда-либо, счетчик на 0 (как это должно быть.) Я могу нажать на вид, чтобы увеличить счетчик 1. Работает нормально.

Когда я закрываю приложение, я снова открываю его, чтобы увидеть значение, которое я остановил, все еще там! (Здорово !!) Бревно консоль показывает следующее: (я закрыл приложение, когда я добрался до 15)

The counter # saved in Core Data is: 1 
The counter # saved in Core Data is: 2 
The counter # saved in Core Data is: 3 
The counter # saved in Core Data is: 4 
The counter # saved in Core Data is: 5 
The counter # saved in Core Data is: 6 
The counter # saved in Core Data is: 7 
The counter # saved in Core Data is: 8 
The counter # saved in Core Data is: 9 
The counter # saved in Core Data is: 10 
The counter # saved in Core Data is: 11 
The counter # saved in Core Data is: 12 
The counter # saved in Core Data is: 13 
The counter # saved in Core Data is: 14 
The counter # saved in Core Data is: 15 

Теперь проблема, что мне нужно для отладки:

После постукиваю вид, счетчик сбрасывает до 0 и увеличивается оттуда. Не увеличивайте с 15, как надо!

Как исправить эту ошибку, чтобы приращение счетчика на сохраненный номер (в данном случае, 15.) Кроме того, я создал подкласс NSManagedObject, но, похоже, не использую его. Вышеприведенный код был создан с помощью нескольких обучающих программ на YouTube. Можно ли оптимизировать этот код с помощью подкласса? Неправильно ли сохранять этот счетчик на CD каждый раз при просмотре представления?

+0

, если единственное, что вы пытаетесь упорствовать это счетчик, то почему бы вам не просто использовать NSUserDefaults вместо того, чтобы стек CoreData в приложение? –

+1

@ Юджин Женя Гордин - короткий ответ на этот вопрос - я просто хочу тренироваться с coredata. спасибо за предложение! – Joe

ответ

1

У вас неправильный код, записанный в методе 'tapGestureRecognizerTapped', вы не должны вставлять новый объект в базу данных ядра каждый раз после нажатия. Я хотел бы предложить вставить объект один раз в 'viewDidLoad', когда вставленное количество объектов равно нулю, иначе не вставляйте. Теперь вам нужно получить сохраненное значение в CoreDatabse и обновить значение и сохранить его обратно.

+0

Ум, отправляя ответ с кодом, я должен попытаться это сделать? Попытка решить эту кривую обучения CoreData как можно лучше. Благодаря! – Joe

0

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

Если вы планируете перебрать все записи после загрузки, вы можете получить значение timer, добавив строчку в петле:

if name > timer { 
    timer = name 
} 

Тогда timer бы получить то, что максимально сохранено значение есть, и подсчитайте оттуда. Если вы не планируете прокручивать все записи, вы можете использовать reduce на извлеченном массиве, чтобы найти максимальное значение.

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

+0

Мне просто нужно одно значение. После прочтения вашего комментария и Сантоша, похоже, что я делаю все это неправильно. Мне просто нужно добавить объект один раз и обновить его значение до CD. Верный? - EDIT: я отредактировал мой вопрос выше с вашим утверждением if. Это фиксировало ошибку возврата счетчика обратно к нулю, однако мне все же нужно исправить это, поэтому он эффективен с компакт-диска. – Joe

+0

Можете ли вы предоставить какое-либо руководство по коду о том, как предотвратить создание новых записей для каждого значения? Я просто хочу, чтобы каждое значение, хранящееся на компакт-диске, обновлялось каждый раз. Благодаря! – Joe

+0

Вы знаете, как выполнить запрос на выборку. Извлеките существующую запись и посмотрите, что это такое. Затем измените это значение и сохраните изменения. –

1

В представленииDidLoad вы устанавливаете counterOutlet.text для указания. Вы также должны установить таймер для имени. Обновленный код в viewDidLoad выглядит следующим образом:

override func viewDidLoad() { 
    super.viewDidLoad() 
    let context: NSManagedObjectContext = appDel.managedObjectContext 
    do { 
     let request = NSFetchRequest(entityName: "Model") 
     let results = try context.executeFetchRequest(request) 

    for item in results{ 
     let name = item.valueForKey("counter") as! Int 
     print("The counter # saved in Core Data is: \(name)") 
     counterOutlet.text = "\(name)" 
     timer = name 
    } 

} 
catch { 
    print("Error retrieving from Core Data.") 
} 
} 
Смежные вопросы