マップ上にルートを描くことができるアプリケーションを開発しています。コアデータ:NSSet型の値を更新する方法
ユーザー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ファイル内のレコードがありますあなたが書いたのと同じです。ここで何か間違っているのですか?
からデータを取得します
Track
のためのいくつかのカテゴリを作成することができます'object(' trackEnt')です。したがって、フェッチ要求の述語と一致しません。 – pbasdf