2016-12-17 7 views
0

私は約2000レコードのSQLiteを持つ配列を持っており、すべてがテーブルビューにリストされています。レコードの1つが選択されると、その種の共通名を含むその項目の詳細が表示され、「speciesDetailViewController」に移動します。コアデータの問題を取得します。

現在、表示されているすべてのフィールドは編集できません。

フィールドの1つ、共通名、種ごとにメモを追加する機能をユーザーが変更できるようになりました。

私はSQLite(雇用された人)の経験がないので、マイナーな変更はCoreDataに保存されます。

データを表示しているので、データが保存されています。

私の問題はデータを取得しているようです。

このフィールドの編集はオプションであるため、すべての種がcoreDataにレコードを持つわけではなく、ユーザーが共通名を更新した種だけです。

class SpeciesDetailData: NSManagedObject 
{ 
    @NSManaged var speciesName: String 
    @NSManaged var commonName: String 
    @NSManaged var commonForeignName: String 
    @NSManaged var speciesNote: String 
} 

。ここで

var speciesDetailData : SpeciesDetailData? 

var speciesDataObject: [NSManagedObject] = [] 
var speciesNameToSave = String() 


@IBAction func ckSaveCommonNameButton(_ sender: Any) { 

    speciesNameToSave = speciesLabel.text! 
    self.saveSpeciesName(speciesName: speciesNameToSave) 

    let commonNameToSave = ckCommonNameTextField.text 
    self.saveCommonName(commonName: commonNameToSave!) 

    } 



func saveCommonName (commonName: String) { 

    guard let appDelegate = 
     UIApplication.shared.delegate as? AppDelegate else { 
      return 
    } 

    let managedContext = appDelegate.persistentContainer.viewContext 
    let entity = NSEntityDescription.entity(forEntityName: "SpeciesDetailData", in: managedContext)! 
    let saveEntity = NSManagedObject(entity: entity, insertInto: managedContext) 
    saveEntity.setValue(commonName, forKey: "commonName") 

    saveSpeciesName(speciesName: speciesNameToSave) 

    do { 
     try managedContext.save() 
     speciesDataObject.append(saveEntity) 

     print(commonName) 

    } catch let error as NSError { 
     print("Could not save. \(error), \(error.userInfo)") 
    } 
} 

func saveSpeciesName (speciesName: String) { 

    guard let appDelegate = 
     UIApplication.shared.delegate as? AppDelegate else { 
      return 
    } 

    let managedContext = appDelegate.persistentContainer.viewContext 
    let entity = NSEntityDescription.entity(forEntityName: "SpeciesDetailData", in: managedContext)! 
    let saveEntity = NSManagedObject(entity: entity, insertInto: managedContext) 
    saveEntity.setValue(speciesName, forKey: "speciesName") 

    do { 
     try managedContext.save() 
     speciesDataObject.append(saveEntity) 

     print(speciesName) 

    } catch let error as NSError { 
     print("Could not save. \(error), \(error.userInfo)") 
    } 
} 

は、それが
になると検索機能

func retrieveCoreDataSpecies() { 

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

let entity = NSEntityDescription.entity(
forEntityName: "SpeciesDetailData", in: context) 


let request: NSFetchRequest<SpeciesDetailData> = SpeciesDetailData.fetchRequest() 
request.entity = entity 

let pred = NSPredicate(format: "speciesName = %@", specieDetail.specie) 
request.predicate = pred 

do { 
let results = try context.fetch(request as! 
NSFetchRequest<NSFetchRequestResult>) 

    if (results.count > 0) { 

let match = results[0] as! NSManagedObject 

     if speciesDetailData?.commonName != nil { 

      ckCommonNameTextField.text = match.value(forKey: "commonName") as? String 

     } else { 

     } 

     if ckNotesTextView.text == "" || ckNotesTextView.text == nil { 
     } else { 

      ckNotesTextView.text = match.value(forKey: "speciesNote") as! String 
     } 
    } 

} catch let error { 

print("Count not fetch \(error), \(error.localizedDescription)") 
} 
} 

であるかのspeciesDetailData?.commonName!=それはレコードが空であると考えて、必要な行をスキップし nilを。

ご協力いただき誠にありがとうございます。

+0

* "私はSQLiteの経験がないのでCoreDataに保存されています..." *これは無関係で、同じものではありません。あなたはコアデータを使用するためにSQLiteの経験を持つ必要はありません。 –

答えて

1

2つの保存機能で別々のオブジェクトを作成しています。いずれの場合もプロパティのうち1つしか設定していないので、saveSpeciesNameを呼び出した後、種名が設定されたオブジェクトが作成され、saveCommonNameを呼び出すと、共通名が設定された別のオブジェクトが作成されます。種名と共通名の両方を同じオブジェクトに設定する必要があります。

関連する問題