简体   繁体   中英

Swift / how to parse data and save as pairs to core data

I have a blog with entries having two attributes. "eventDate" & "title". I have the following code to download the "eventDate":

    func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {

    if elementName == "item" {
        currentEvent = EventPosts()

        return
    }

    if elementName == "eventDate" {
        parsedElement = "eventDates"
    }

    if elementName == "title" {
        parsedElement = "title"
    }

}

func parser(parser: NSXMLParser, foundCharacters string: String) {

    let str = string.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())

    if parsedElement == "eventDates" && str != "" {
        if currentEvent.eventDates.isEmpty {

            currentEvent.eventDates = str
            parsedElement = ""

            let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
            let managedContext = appDelegate.managedObjectContext
            let entity =  NSEntityDescription.entityForName("Calendar", inManagedObjectContext:managedContext)
            let datum = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: managedContext)
            datum.setValue(currentEvent.eventDates, forKey: "date")

            do {
                try managedContext.save()
                dates.append(datum)
            } catch let error as NSError  {
                print("Could not save \(error), \(error.userInfo)")
            }
        }

    }
}

Now I want to save the matching "title" into the matching core data entity called Calendar.

This code is what I have tried, but I guess it does not create matching pairs. It only creates Calendar entries with eventDates and Calendar entries with title, but not with both and matching pairs...

    if parsedElement == "eventDates" && str != "" {
        if currentEvent.eventDates.isEmpty {

            currentEvent.eventDates = str
            parsedElement = ""

            let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
            let managedContext = appDelegate.managedObjectContext
            let entity =  NSEntityDescription.entityForName("Calendar", inManagedObjectContext:managedContext)
            let datum = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: managedContext)
            datum.setValue(currentEvent.eventDates, forKey: "date")

            do {
                try managedContext.save()
                dates.append(datum)
            } catch let error as NSError  {
                print("Could not save \(error), \(error.userInfo)")
            }
        }

    }

    if parsedElement == "title" && str != "" {
        if currentEvent.eventDates.isEmpty {

            currentEvent.eventDates = str
            parsedElement = ""

            let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
            let managedContext = appDelegate.managedObjectContext
            let entity =  NSEntityDescription.entityForName("Calendar", inManagedObjectContext:managedContext)
            let title = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: managedContext)
            title.setValue(currentEvent.title, forKey: "title")

            do {
                try managedContext.save()
                dates.append(title)
            } catch let error as NSError  {
                print("Could not save \(error), \(error.userInfo)")
            }
        }

    }

What is the correct code to create an entity of Calendar with the matching pair of "title" and "eventDate"? Help is very appreciated.

EDIT That was tryed so far:

    func parser(parser: NSXMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String]) {

    if elementName == "item" {
        currentEvent = EventPosts()

        return
    }

    if elementName == "eventDate" {
        parsedElement = "eventDates"
        print(currentEvent.eventDates)
    }

    if elementName == "title" {
        parsedElement = "title"
        print(currentEvent.title)
    }

    if !currentEvent.eventDates.isEmpty && !currentEvent.title.isEmpty {

        parsedElement = ""

        let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        let managedContext = appDelegate.managedObjectContext
        let entity =  NSEntityDescription.entityForName("Calendar", inManagedObjectContext:managedContext)
        let datum = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: managedContext)


        datum.setValue(currentEvent.eventDates, forKey: "date")
        datum.setValue(currentEvent.title, forKey: "title")

        do {
            try managedContext.save()
            dates.append(datum)
        } catch let error as NSError  {
            print("Could not save \(error), \(error.userInfo)")
        }
    } else if currentEvent.eventDates.isEmpty && !currentEvent.title.isEmpty {
        print("currentEvent.eventDates.isEmpty")
    } else if !currentEvent.eventDates.isEmpty && currentEvent.title.isEmpty {
        print("currentEvent.title.isEmpty")
    } else {
        print("both.isEmpty")
    }
}

Console says both.isEmpty million times with this code. But please remember: with my first code I had the eventDates perfectly saved!

The following assumes you only want to save an object if both pieces of information are available. The idea is to move the creation of the managed object to be after the parsing.

    if parsedElement == "eventDates" && str != "" {
        if currentEvent.eventDates.isEmpty {
            currentEvent.eventDates = str
            parsedElement = ""
        }
    }

    if parsedElement == "title" && str != "" {
        if currentEvent.title.isEmpty {
            currentEvent.title = str
            parsedElement = ""
        }
    }

    if !currentEvent.eventDates.isEmpty && !currentEvent.title.isEmpty {
        let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
        let managedContext = appDelegate.managedObjectContext
        let entity =  NSEntityDescription.entityForName("Calendar", inManagedObjectContext:managedContext)
        let datum = NSManagedObject(entity: entity!, insertIntoManagedObjectContext: managedContext)
        datum.setValue(currentEvent.eventDates, forKey: "date")
        datum.setValue(currentEvent.title, forKey: "title")

        do {
            try managedContext.save()
            dates.append(datum)
        } catch let error as NSError  {
            print("Could not save \(error), \(error.userInfo)")
        }
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM