2017-05-01 17 views
0

こんにちは私は、コアデータからいくつかの値(ストリングのみ)を格納して取得するためにコアデータを扱っています。ここに私はどのように値を格納しています。コアデータ値はNilを返す

機能:ここで

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 
} 

は私が実体に挿入

  1. タイトルことを印刷コンソールで見ることができます

    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") 
          } 
         } 
    

    それを呼び出す方法です

  2. が実体にImageInsertedここ

は、コアデータストアから値を取得するためのコードがある

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 
} 

しかし、私はそれがnilやプリントを返すブックIMAGEURLを取得するためのコードを実行したときに

  1. キーの値がありません:画像 タイトルは取得しますがimageUrlは取得しません。 この問題を解決するのに手伝ったり、正しい方向に向けることができますか?そして、私がこの問題を抱えている理由とそれを解決する方法を投稿してください。ありがとう。

答えて

1

あなたの問題は、saveStringValueが呼び出すたびに新しいNSManagedObjectインスタンスが作成されることです。

saveStringValueを初めて呼び出す場合、titleを持つが、imageを持たないSearchHistoryオブジェクトを作成します。 2度目に呼び出すとimageという値を持つ別のSearchHistoryオブジェクトが作成されますが、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() 
+0

なぜあなたは聞かせて書いたnewHistory = SearchHistory( context:Context)クラスSearchHistoryはありません。 –

+0

はい、うまくいきました。ありがとう。 –

+0

Xcodeは、コアデータモデルでこのオプションをオフにしない限り、コアデータエンティティのクラスを自動的に作成します。 – Paulw11

関連する問題