【问题标题】:Swift code is adding unwanted nil data to core dataSwift 代码正在向核心数据添加不需要的零数据
【发布时间】:2016-10-28 00:44:15
【问题描述】:

我正在尝试在我的应用中包含提醒,并将用户日历添加到我的应用程序中。但是我遇到了一个问题,当我尝试加载保存在核心数据中的数据时,我得到了零。加载几次后我只得到零数据,但每次重新加载应用程序时它都会增加。

addReminderToCalendar 函数

/*
 *
 *This function adds the reminder to the devices calendar and to the devices local storage
 *
 */
func addReminderToCalendar(newReminder : Reminder){
    print("adding reminder :" + newReminder.reminderName)
    /*print(newReminder.reminderDescription)
     print(newReminder.reminderDate)
     print(newReminder.reminderID)
     print(newReminder.reminderName)*/
    if(newReminder.reminderID != nil && newReminder.reminderDate != nil && newReminder.reminderDescription != nil && newReminder.reminderName != nil){
        //print("Adding Reminder to Calendar")
        let appDelegate = UIApplication.shared.delegate as! AppDelegate!
        let managedContext = appDelegate?.managedObjectContext
        let entity =  NSEntityDescription.entity(forEntityName: "Reminders", in:managedContext!)
        let reminderDB = NSManagedObject(entity: entity!, insertInto: managedContext)
        //  print("Reminder ID :" + String(newReminder.reminderID))
        if(checkForReminder(newReminder) == -1){//Checking that the reminder is not already added
            print("addReminderToCalendar :")
            print(newReminder.reminderID)
            reminderDB.setValue(newReminder.reminderID, forKey: "reminderID")
            reminderDB.setValue(newReminder.reminderName, forKey: "reminderName")
            reminderDB.setValue(newReminder.reminderDescription, forKey: "reminderDescription")
            reminderDB.setValue(newReminder.reminderDate, forKey: "reminderDate")
            reminders.append(newReminder)
        }
        if (managedContext?.hasChanges)! {
            do {
                try managedContext?.save()
            } catch {
                //print(newReminder)
                NSLog("Error Here")
            }
        }
    }else{
        print("The reminder to be added was nil")
    }
}

加载提醒功能

    /*
 * This function loads the reminders that have been stored in the device
 */
func loadReminders(){

    let appDelegate = UIApplication.shared.delegate as! AppDelegate

    let managedContext = appDelegate.managedObjectContext

    let fetchRequest:NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "Reminders")

    let results = try? managedContext.fetch(fetchRequest)

    storedReminders = results as! [NSManagedObject]
    print(storedReminders.count)
    //print(storedReminders[0].value(forKey: "reminderID"))
    if (storedReminders.count > 0){
        for index in 0 ... storedReminders.count - 1{
            print("Loading reminder with ID : ")
            print(storedReminders[index].value(forKey: "reminderID"))
            print("Loading reminder with Name : ")
            print(storedReminders[index].value(forKey: "reminderName"))

            if(storedReminders[index].value(forKey: "reminderID") != nil && storedReminders[index].value(forKey: "reminderName") != nil && storedReminders[index].value(forKey: "reminderDescription") != nil && storedReminders[index].value(forKey: "reminderDate") != nil){ //checking that the values are not null
                let loadedReminder = Reminder()
                loadedReminder.reminderID = storedReminders[index].value(forKey: "reminderID") as! Double
                loadedReminder.reminderName = storedReminders[index].value(forKey: "reminderName") as! String
                loadedReminder.reminderDescription = storedReminders[index].value(forKey: "reminderDescription") as! String
                loadedReminder.reminderDate = (storedReminders[index].value(forKey: "reminderDate") as! NSDate) as Date!
                reminders.append(loadedReminder)
            }
        }
    }
}

提醒课

import Foundation
import UIKit
import CoreData

class Reminder :UICollectionViewCell{

   var reminderDate: Date!
   var reminderDescription: String!
   var reminderID: Double!
   var reminderName: String!

}

编辑 我在负载提醒中添加了以下几行,这是为了阻止核心数据被 nil 值填充。 }别的{ //删除这个提醒 managedContext.delete(storedReminders[index] as NSManagedObject) print("删除的数据") } 所以我的 loadReminders 函数现在看起来像这样

/* * 此功能加载已存储在设备中的提醒 */ func loadReminders(){

let appDelegate = UIApplication.shared.delegate as! AppDelegate

let managedContext = appDelegate.managedObjectContext

let fetchRequest:NSFetchRequest<NSFetchRequestResult> = NSFetchRequest(entityName: "Reminders")

let results = try? managedContext.fetch(fetchRequest)

storedReminders = results as! [NSManagedObject]
print(storedReminders.count)
//print(storedReminders[0].value(forKey: "reminderID"))
if (storedReminders.count > 0){
    for index in 0 ... storedReminders.count - 1{
        print("Loading reminder with ID : ")
        print(storedReminders[index].value(forKey: "reminderID"))
        print("Loading reminder with Name : ")
        print(storedReminders[index].value(forKey: "reminderName"))

        if(storedReminders[index].value(forKey: "reminderID") != nil && storedReminders[index].value(forKey: "reminderName") != nil && storedReminders[index].value(forKey: "reminderDescription") != nil && storedReminders[index].value(forKey: "reminderDate") != nil){ //checking that the values are not null
            let loadedReminder = Reminder()
            loadedReminder.reminderID = storedReminders[index].value(forKey: "reminderID") as! Double
            loadedReminder.reminderName = storedReminders[index].value(forKey: "reminderName") as! String
            loadedReminder.reminderDescription = storedReminders[index].value(forKey: "reminderDescription") as! String
            loadedReminder.reminderDate = (storedReminders[index].value(forKey: "reminderDate") as! NSDate) as Date!
            reminders.append(loadedReminder)
        }else{
                //delete this reminder
                managedContext.delete(storedReminders[index] as NSManagedObject)
                print("deleted data")
            }
    }
}

}

【问题讨论】:

    标签: ios swift core-data


    【解决方案1】:

    在这里,您正在创建一个新的 Reminders 实例并将其添加到 NSManagedObjectContext

    let entity =  NSEntityDescription.entity(forEntityName: "Reminders", in:managedContext!)
    let reminderDB = NSManagedObject(entity: entity!, insertInto: managedContext)
    

    然后你检查它是否已经添加:

    if(checkForReminder(newReminder) == -1)
    

    这就是我认为的问题所在。您已经将 Reminders 实例添加到您的上下文中!所以managedContext?.hasChanges 将是true

    上下文发生了变化,这些Reminders 将与您的所有实体属性及其默认值一起保存。我假设他们默认为nil

    这应该可以解决它,尽管我看不到您的部分代码,所以请谨慎对待...

    func addReminderToCalendar(newReminder: Reminder) {
        if(newReminder.reminderID != nil && newReminder.reminderDate != nil && newReminder.reminderDescription != nil && newReminder.reminderName != nil) {
            if(checkForReminder(newReminder) == -1) {
                let appDelegate = UIApplication.shared.delegate as! AppDelegate!
                let managedContext = appDelegate?.managedObjectContext
                let entity =  NSEntityDescription.entity(forEntityName: "Reminders", in:managedContext!)
                let reminderDB = NSManagedObject(entity: entity!, insertInto: managedContext)
                reminderDB.setValue(newReminder.reminderID, forKey: "reminderID")
                reminderDB.setValue(newReminder.reminderName, forKey: "reminderName")
                reminderDB.setValue(newReminder.reminderDescription, forKey: "reminderDescription")
                reminderDB.setValue(newReminder.reminderDate, forKey: "reminderDate")
                reminders.append(newReminder)
    
                if (managedContext?.hasChanges)! {
                    do {
                        try managedContext?.save()
                    } catch {
                        NSLog("Error Here")
                    }
                }
            }
        } else {
            print("The reminder to be added was nil")
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多