2016-08-26 2 views
0

Я разрабатываю приложение, которое позволяет пользователю рисовать маршруты на карте. У меня есть три сущности:Основные данные: Как обновить значение типа NSSet

My entities

Пользователь должен быть в состоянии сохранить 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 файле

Я думаю, что это в значительной степени так же, как вы писали. Я здесь что-то не так?

+0

При сохранении, вы не устанавливая значение для 'name' атрибут вашего' TrackName 'object (' trackEnt'). Следовательно, он не соответствует предикату в вашем запросе на выборку. – pbasdf

ответ

0

Для первого, чтобы добавить новый Track, его не нужно добавлять вручную до Set<Track>. Вместо этого вам нужно вставить новый объект Track в контекст, затем установить для него TrackName, а затем сохранить контекст, и он будет работать просто отлично, он автоматически обновит объект TrackName.

И да, вы можете создать некоторую категорию Track, которая будет вставлять его в контексте и принимать данные из Line или trackPoints

+0

Я отредактировал вопрос, пожалуйста проверите его. Не могли бы вы наклеить ссылку о категориях? У меня нет фона Objective-C, и я новичок в Core Data. – Jamil

Смежные вопросы