2016-08-26 8 views
0

マップ上にルートを描くことができるアプリケーションを開発しています。コアデータ:NSSet型の値を更新する方法

My entities

ユーザーTrackを保存した後、しばらくした後、それを描き続けることができるはずです: は、私は3つのエンティティを持っています。私の問題は、私が理解したように、Trackオブジェクトを既存のものに追加するために、私はを更新し、コンテキストを保存します(これは正しいアプローチですか?)。TrackNameを取得してください。私はユーザがカスタムタイプLine(トラックエンティティと同じ変数名を持つ)の配列に描画する点を格納しますが、Set<Tracks>Array<Line>に置き換える方法はわかりません。タイプTrackの配列を作成する方法はありますか?または、私はTrackのための何らかのコンストラクタを追加できますか?

今、私はこれをやっている:

var request = NSFetchRequest(entityName: "TrackName") 
     var pred = NSPredicate(format: "name == %@ and username.userName == %@", trackName!, currentUser.login) 
     request.predicate = pred 
     request.returnsObjectsAsFaults = false 

     var result : NSArray = NSArray() 

     do 
     { 
      result = try context.executeRequest(request) as! [TrackName] 
     } 
     catch{} 

     var currTrack = result[0] as! TrackName 

この

currTrack.track = Set<Track>(arrayLiteral: trackPoints) 

ような何かをしようとしているが、トラックポイントは、他のタイプです。

編集1.

パベルは、私は、このようにそれを実行しようとしましたが、新しいTrackNameと名前のオブジェクトが毎回作成されたことが判明し、私はフェッチ時にトラックが、私は空の配列を取得しました。以下のコード:

まず、ユーザー名彼のトラック

func logName(name:String) 
    { 
     var appDel : AppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate); 
     var context : NSManagedObjectContext = appDel.managedObjectContext 
     var nameEntity = NSEntityDescription.entityForName("Name", inManagedObjectContext: context) 
     var forName = Name(entity: nameEntity!, insertIntoManagedObjectContext: context) 
     forName.userName = currentUser.login 

     var trackNameEntity = NSEntityDescription.entityForName("TrackName", inManagedObjectContext: context) 
     var newTrack = TrackName(entity: trackNameEntity!, insertIntoManagedObjectContext: context) 

     newTrack.name = name 
     newTrack.username = forName 
     do{ 
      try context.save() 
     } 
     catch{} 
     trackName = name 
    } 

節約トラック:

func saveTrack() 
    { 
     var appDel : AppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate); 
     var context : NSManagedObjectContext = appDel.managedObjectContext 

     var nameDesc = NSEntityDescription.entityForName("Name", inManagedObjectContext: context) 
     var nameEnt = Name(entity: nameDesc!, insertIntoManagedObjectContext: context) 
     nameEnt.userName = currentUser.login 

     var trackNameDesc = NSEntityDescription.entityForName("TrackName", inManagedObjectContext: context) 
     var trackEnt = TrackName(entity: trackNameDesc!, insertIntoManagedObjectContext: context) 
     trackEnt.username = nameEnt 
       var trackDesc = NSEntityDescription.entityForName("Track", inManagedObjectContext: context) 
     for p in trackPoints 
     { 
      var newTrack = Track(entity: trackDesc!, insertIntoManagedObjectContext: context) 
      newTrack.trackname = trackEnt 
      newTrack.startLat = p.startLat 
      newTrack.startLon = p.startLon 
      newTrack.endLat = p.endLat 
      newTrack.endLon = p.endLon 

     do {try context.save()} 

     catch{} 
    } 
    } 

私はこのように保存して.sqliteファイルをチェックし、私は新しい名前とTrackNameが作成されていることがわかり。

フェッチ:

func fetchWithPredicate(table: String, pred: NSPredicate)->NSArray 
    { 
     var appDel : AppDelegate = (UIApplication.sharedApplication().delegate as! AppDelegate); 
     var context : NSManagedObjectContext = appDel.managedObjectContext 
     var request = NSFetchRequest(entityName: table) 
     request.predicate = pred//NSPredicate(format: pred) 
     request.returnsObjectsAsFaults = false 
     var results: NSArray = NSArray() 
     do{ 
      results = try context.executeFetchRequest(request) 
     } 

     catch{} 

     return results 
    } 

fetchWithPredicateここから呼び出されます。

func getTrack(trackName: String)->[Track] 
    { 
     let pred = NSPredicate(format: "trackname.name == %@", trackName) 
     return fetchWithPredicate("Track", pred: pred) as! [Track] 
    } 

それは空の配列を返しますが、私はそれはかなりだと思う

.sqliteファイル内のレコードがありますあなたが書いたのと同じです。ここで何か間違っているのですか?

+0

からデータを取得しますTrackのためのいくつかのカテゴリを作成することができます'object(' trackEnt')です。したがって、フェッチ要求の述語と一致しません。 – pbasdf

答えて

0

新しいものを追加する場合は、TrackSet<Track>に手動で追加する必要はありません。代わりに、新しいTrackオブジェクトをコンテキストに挿入してからTrackNameに設定してコンテキストを保存するだけで、完全に動作し、TrackNameエンティティを自動的に更新します。

そして、はい、あなたはあなたの `TrackNameの` name`の属性に値を設定していない、コンテキストに挿入して保存するとLineまたはtrackPoints

+0

質問を編集しました。確認してください。 カテゴリについてのリンクを貼り付けてください。私はObjective-Cの背景がなく、私はCore Dataの初心者です。 – Jamil

関連する問題