核心数据值返回Nil

时间:2017-05-01 20:05:31

标签: ios core-data swift3

您好我一直在使用核心数据来存储和检索核心数据中的一些值(仅限字符串)。这是我存储值的方式。

功能:

public func saveStringValue(forKey: String, value: String) -> Bool{
    var saved = false
    if self.entityName != nil && self.appDelegate != nil{
        let context = appDelegate?.persistentContainer.viewContext
        if context != nil{
            let entity = NSEntityDescription.entity(forEntityName: self.entityName!, in: context!)
            let entityHandle = NSManagedObject(entity: entity!, insertInto: context!)
            entityHandle.setValue(value, forKey: forKey)
            do{
                try context?.save()
                saved = true
            }catch let error as NSError{
                saved = false
                print("Error : \(error)")
            }
        }
    }

    return saved 
}

以下是我的称呼方式

let historyManager = HistoryManager(entity: "SearchHistory")
        let titleInserted = historyManager.saveStringValue(forKey: "title", value: book.title!)
        if(titleInserted == true)
        {
            print("Title Inserted to Entity")
        }

        if let image = book.imageUrl{
            let imageInserted = historyManager.saveStringValue(forKey: "image", value: image)
            if imageInserted == true{
                print("Image Url Inserted to Entity")
            }
        }

我可以在控制台中看到

  1. 标题已插入实体
  2. ImageInserted Into entity
  3. 以下是从核心数据存储中检索值的代码

    public func fetchAll() -> [Book]{
        var books = [Book]()
        let context = self.appDelegate?.persistentContainer.viewContext
        let fetchRequest = NSFetchRequest<NSManagedObject>(entityName: self.entityName!)
        //let fetchRequest: NSFetchRequest<SearchHistory> = SearchHistory.fetchRequest()
    
        do{
            let fetchedBooks = try context?.fetch(fetchRequest)
    
            for aBook in fetchedBooks!{
                if let title = aBook.value(forKey: "title"){
                    let book = Book(title: title as! String)
                    if let im = aBook.value(forKey: "image"){
    
                        book.imageUrl = im as! String
                        print("ImageUrl : \(im) : ")
                    }
                    else{
                        print("No Value for key : image")
                    }
                    books.append(book)
                }
    
    
            }
        }
        catch let error as NSError{
            print("Fetch Error: \(error.localizedDescription)")
        }
        print("Books : \(books.count)")
        return books
    }
    

    但是当我运行代码来检索图书imageUrl时,它返回nil并打印

    1. 键没有值:图片 它检索标题但不检索imageUrl。 你能帮我解决这个问题还是指出正确的方向。并请发布我遇到此问题的原因以及如何解决它。感谢。

1 个答案:

答案 0 :(得分:1)

您的问题是,saveStringValue每次调用时都会创建一个新的NSManagedObject实例。

第一次拨打saveStringValue时,您将创建一个SearchHistorytitle但没有image的对象。第二次调用它时,您将创建另一个SearchHistory对象,其值为image但没有title

在我看来,您的saveStringValue功能是不必要的。假设您的代码基于Xcode中单击“使用核心数据”而产生的模板,您将拥有SearchHistory类,您可以使用以下内容:

let appDelegate = UIApplication.shared.delegate as! AppDelegate
let context = appDelegate.persistentContainer.viewContext

let newHistory = SearchHistory(context: context)

newHistory.title = book.title
newHistory.image = book.imageUrl

appDelegate.saveContext()