Я разрабатываю приложение, которое позволяет пользователю рисовать маршруты на карте. У меня есть три сущности:Основные данные: Как обновить значение типа NSSet
Пользователь должен быть в состоянии сохранить Track
, а затем продолжить рисовать его через некоторое время. Моя проблема заключается в обновлении - как я понял, добавить объекты Track
к существующим, я должен получить TrackName
, обновить его Set<Track>
и сохранить контекст (не уверен в этом, это правильный подход?). Я сохраняю точки, которые пользователь рисует в массиве настраиваемого типа Line
(он имеет те же имена переменных, что и объект Track), но я не знаю, как заменить 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)
но является тчк трассы другого типа.
Edit 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 файле
Я думаю, что это в значительной степени так же, как вы писали. Я здесь что-то не так?
При сохранении, вы не устанавливая значение для 'name' атрибут вашего' TrackName 'object (' trackEnt'). Следовательно, он не соответствует предикату в вашем запросе на выборку. – pbasdf