2015-10-08 24 views
0

我是swift的新手,并且CoreData有问题:我可以保存和加载CoreData存储和从CoreData存储加载。但是当我从CoreData加载保存的数据时,数据已经重新排列。我不希望发生这种情况。我该如何解决这个问题?CoreData和Swift:内容被交换

我的代码是这样的:

Meetings.swift

import Foundation 
import CoreData 

class Meetings: NSManagedObject { 
    @NSManaged var meetingTimeLeft: NSNumber 
    @NSManaged var title: String 
    @NSManaged var date: NSDate 
    @NSManaged var timeFrom: NSDate 
    @NSManaged var timeTo: NSDate 
    @NSManaged var timeFromActual: NSDate 
    @NSManaged var timeToActual: NSDate 
    @NSManaged var location: String 
    @NSManaged var locationRoom: String 
    @NSManaged var meetingGoals: String 
    @NSManaged var purpose: String 
    @NSManaged var averageHourlyCost: NSNumber 
    @NSManaged var completed: NSNumber 
    @NSManaged var durationActual: NSNumber 
    @NSManaged var durationPlanned: NSNumber 
    @NSManaged var persons: NSSet 
    @NSManaged var agendas: NSSet 
    @NSManaged var minutes: NSSet 
    @NSManaged var relationship: NSManagedObject 
    @NSManaged var startSetting: StartSetting? 

} 
extension Meetings { 
func addPer(value: Person) { 
    self.mutableSetValueForKey("persons").addObject(value) 
} 
func removePer(value: Person) { 
    self.mutableSetValueForKey("persons").removeObject(Person) 

    //self.mutableSetValueForKey("persons").addObject(value) 
} 


func getPer() -> [Person] { 
    var persons: [Person] 
    persons = self.persons.allObjects as! [Person] 
    return persons 
} 
func addAgenda(value: AgendaItem) { 
    self.mutableSetValueForKey("agendas").addObject(value) 
} 
func removeAgenda(value: AgendaItem) { 
    self.mutableSetValueForKey("agendas").removeObject(AgendaItem) 

    //self.mutableSetValueForKey("persons").addObject(value) 
} 


func getAgenda() -> [AgendaItem] { 
    var agendas: [AgendaItem] 
    agendas = self.agendas.allObjects as! [AgendaItem] 
    return agendas 
} 
func getAgendaItem(i: Int) -> AgendaItem { 
    var agendas: [AgendaItem] 
    agendas = self.agendas.allObjects as! [AgendaItem] 
    let agendaItem = agendas[i] 
    return agendaItem 
} 
} 

person.swift

import Foundation 
import CoreData 

class Person: NSManagedObject { 

    @NSManaged var name: String 
    @NSManaged var email: String 
    @NSManaged var phone: NSNumber 
    @NSManaged var title: String 
    @NSManaged var company: String 
    @NSManaged var photo: NSData 
    @NSManaged var meeting: Meetings 
} 

AgendaItem.swift

import Foundation 
import CoreData 

class AgendaItem: NSManagedObject { 
    @NSManaged var agendaItemTitle: String 
    @NSManaged var presenter: String 
    @NSManaged var durationPlanned: NSNumber 
    @NSManaged var durationActual: NSNumber 
    @NSManaged var filePresentation: NSData 
    @NSManaged var fileSupporting: NSData 
    @NSManaged var agendaTimeStart: NSDate 
    @NSManaged var meeting: Meetings 
} 

节省当我这样做:

internal var meetingsModels = [Meetings]() 
public let managedObjectContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext 

managedObjectContext?.deleteObject(meetingsModels[meetingsIndexPassed.row]) meetingsModels.removeAtIndex(meetingsIndexPassed.row) 
let entityDescription = NSEntityDescription.entityForName("Meetings", inManagedObjectContext: managedObjectContext!) 
let entityDescription2 = NSEntityDescription.entityForName("Person", inManagedObjectContext: managedObjectContext!) 
let entityDescription3 = NSEntityDescription.entityForName("AgendaItem", inManagedObjectContext: managedObjectContext!) 


let meetings = Meetings(entity: entityDescription!, insertIntoManagedObjectContext: managedObjectContext) 

meetings.title = meetingTitle_txt.text! 
meetings.date = lDate 
meetings.timeFrom = lStartTime 
meetings.timeTo = lEndTime 
meetings.location = address_txt.text! 
meetings.purpose = details[0] 
meetings.meetingGoals = details[1] 
meetings.locationRoom = details[2] 
meetings.durationPlanned = meetingsEditPassed.durationPlanned 
meetings.completed = false 

for var i = 0; i < personsEdit.count; i++ { 
    let person = Person(entity: entityDescription2!, insertIntoManagedObjectContext: managedObjectContext) 
    person.name = personsEdit[i].name 
    person.email = personsEdit[i].email 
    person.title = personsEdit[i].title 
    person.company = personsEdit[i].company 
    person.phone = personsEdit[i].phone 
    meetings.addPer(person) 
} 
for var i = 0; i < agendaEdit.count; i++ { 
    let agenda = AgendaItem(entity: entityDescription3!, insertIntoManagedObjectContext: managedObjectContext) 
    agenda.agendaItemTitle = agendaEdit[i].agendaItemTitle 
    //print(agendaEdit[i].agendaItemTitle) 
    agenda.presenter = agendaEdit[i].presenter 
    agenda.durationPlanned = agendaEdit[i].durationPlanned 
    meetings.addAgenda(agenda) 
} 

do { 
    try managedObjectContext?.save() 
} catch let error1 as NSError { 
    print("\(error1)") 
} 
meetingsModels.append(meetings) 

时加载我这样做:

override func viewWillAppear(animated: Bool) { 
    super.viewWillAppear(animated) 
    //1 
    let appDelegate = 
    UIApplication.sharedApplication().delegate as! AppDelegate 

    let managedContext = appDelegate.managedObjectContext! 

    //2 
    let fetchRequest = NSFetchRequest(entityName:"Meetings") 
    //fetchRequest.sortDescriptors = nil 
    //3 
    let fetchedResults: [Meetings] 
    do { 
     try 
     fetchedResults = (managedContext.executeFetchRequest(fetchRequest) as? [Meetings])! 
     if let results: [Meetings] = fetchedResults { 
      var temp = [Meetings]() 
      var temp2 = [Meetings]() 
      for tmp: Meetings in results { 
       temp.append(tmp) 
       if tmp.completed.boolValue { 
        temp2.append(tmp) 
       }else { 

       } 
      } 
      meetingsModels = temp 
      meetingsModels2 = temp2 
     } else { 
     } 
    } catch let error1 as NSError { 
     print("could not fetch meetings: \(error1), \(error1.userInfo)") 
    } 



} 

我希望,你们当中有些人能帮助我。

+0

默认情况下,Core Data中NSManagedObject的集合是无序的,尽管提取请求的结果是一个数组。如果您想要特定订单,请向请求添加排序描述符 – vadian

回答

0

仅仅因为您的Meetings不属于任何有序关系,您的会议数据正在“重新排列”。我无法在您身边运行您的代码。不过,我可以推荐你执行下列操作之一:

  1. 使用有序的关系,你要确保 数据的顺序被保存,你把它拿来任何时间在任何时间。
  2. 在您的fetch requests上使用 sortDescriptors属性。当你创建一个 时,你可以给它添加一个sort descriptor以便 排列数据。