فهرست منبع

Merge branch 'master' into Blog

Iñigo Valentin 9 سال پیش
والد
کامیت
5b3c498718
2فایلهای تغییر یافته به همراه520 افزوده شده و 67 حذف شده
  1. 518 66
      app/Sync.swift
  2. 2 1
      app/app.xcdatamodeld/app.xcdatamodel/contents

+ 518 - 66
app/Sync.swift

@@ -23,12 +23,12 @@ import CoreData
 import UIKit
 import UIKit
 
 
 /**
 /**
- Class to handle server sync.
- */
+Class to handle server sync.
+*/
 class Sync{
 class Sync{
 	
 	
 	/**
 	/**
-	 Starts the sync process.
+	Starts the sync process.
 	*/
 	*/
 	init(){
 	init(){
 		let url = buildUrl();
 		let url = buildUrl();
@@ -36,37 +36,36 @@ class Sync{
 	}
 	}
 	
 	
 	/**
 	/**
-	 Builds the URL to perform the sync against.
-	 :returns: The URL.
+	Builds the URL to perform the sync against.
+	:returns: The URL.
 	*/
 	*/
 	func buildUrl() -> URL{
 	func buildUrl() -> URL{
 		let url = URL(string: "https://margolariak.com/API/v1/sync.php?client=com.margolariak.app")
 		let url = URL(string: "https://margolariak.com/API/v1/sync.php?client=com.margolariak.app")
 		//TODO add parameters
 		//TODO add parameters
 		return url!
 		return url!
-		
 	}
 	}
 	
 	
-	
-	
 	/**
 	/**
-	 Performs an asynchronous sync.
-	 It fethes the info from the server and stores as Core Data
-	 :param: url The url to sync.
+	Performs an asynchronous sync.
+	It fethes the info from the server and stores as Core Data
+	:param: url The url to sync.
 	*/
 	*/
 	func sync(url: URL){
 	func sync(url: URL){
 		
 		
+		print("SYNC:LOG: Sync started.")
+		
 		//Synchronously get data
 		//Synchronously get data
 		let task = URLSession.shared.dataTask(with: url) { data, response, error in
 		let task = URLSession.shared.dataTask(with: url) { data, response, error in
 			guard error == nil else {
 			guard error == nil else {
-				print("Sync error")
+				print("SYNC:ERROR: Unknown error.")
 				return
 				return
 			}
 			}
 			guard let data = data else {
 			guard let data = data else {
-				print("Data is empty")
+				print("SYNC:ERROR: Data is empty.")
 				return
 				return
 			}
 			}
 			
 			
-			print("Got the Sync JSON")
+			print("SYNC:LOG: Data received.")
 			
 			
 			var strData = String(data:data, encoding: String.Encoding.utf8)
 			var strData = String(data:data, encoding: String.Encoding.utf8)
 			
 			
@@ -80,7 +79,8 @@ class Sync{
 			let dataActivityComment : [String] = self.getTable(data: strData!, table: "activity_comment")
 			let dataActivityComment : [String] = self.getTable(data: strData!, table: "activity_comment")
 			let dataActivityImage : [String] = self.getTable(data: strData!, table: "activity_image")
 			let dataActivityImage : [String] = self.getTable(data: strData!, table: "activity_image")
 			let dataActivityTag : [String] = self.getTable(data: strData!, table: "activity_tag")
 			let dataActivityTag : [String] = self.getTable(data: strData!, table: "activity_tag")
-			//let dataAlbum : [String] = self.getTable(data: strData!, table: "album")
+			let dataActivityItinerary : [String] = self.getTable(data: strData!, table: "activity_itinerary")
+			let dataAlbum : [String] = self.getTable(data: strData!, table: "album")
 			//let dataFestival : [String] = self.getTable(data: strData!, table: "festival")
 			//let dataFestival : [String] = self.getTable(data: strData!, table: "festival")
 			//let dataFestivalDay : [String] = self.getTable(data: strData!, table: "festival_day")
 			//let dataFestivalDay : [String] = self.getTable(data: strData!, table: "festival_day")
 			//let dataFestivalEvent : [String] = self.getTable(data: strData!, table: "festival_event")
 			//let dataFestivalEvent : [String] = self.getTable(data: strData!, table: "festival_event")
@@ -90,7 +90,7 @@ class Sync{
 			//let dataPhoto : [String] = self.getTable(data: strData!, table: "photo")
 			//let dataPhoto : [String] = self.getTable(data: strData!, table: "photo")
 			//let dataPhotoAlbum : [String] = self.getTable(data: strData!, table: "photo_album")
 			//let dataPhotoAlbum : [String] = self.getTable(data: strData!, table: "photo_album")
 			//let dataPhotoComment : [String] = self.getTable(data: strData!, table: "photo_comment")
 			//let dataPhotoComment : [String] = self.getTable(data: strData!, table: "photo_comment")
-			//let dataPlace : [String] = self.getTable(data: strData!, table: "place")
+			let dataPlace : [String] = self.getTable(data: strData!, table: "place")
 			let dataPost : [String] = self.getTable(data: strData!, table: "post")
 			let dataPost : [String] = self.getTable(data: strData!, table: "post")
 			let dataPostComment : [String] = self.getTable(data: strData!, table: "post_comment")
 			let dataPostComment : [String] = self.getTable(data: strData!, table: "post_comment")
 			let dataPostImage : [String] = self.getTable(data: strData!, table: "post_image")
 			let dataPostImage : [String] = self.getTable(data: strData!, table: "post_image")
@@ -102,63 +102,268 @@ class Sync{
 			self.saveTableActivityComment(entries : dataActivityComment)
 			self.saveTableActivityComment(entries : dataActivityComment)
 			self.saveTableActivityImage(entries : dataActivityImage)
 			self.saveTableActivityImage(entries : dataActivityImage)
 			self.saveTableActivityTag(entries : dataActivityTag)
 			self.saveTableActivityTag(entries : dataActivityTag)
+			self.saveTableActivityItinerary(entries : dataActivityItinerary)
 			
 			
 			self.saveTablePost(entries: dataPost)
 			self.saveTablePost(entries: dataPost)
 			self.saveTablePostComment(entries: dataPostComment)
 			self.saveTablePostComment(entries: dataPostComment)
 			self.saveTablePostImage(entries: dataPostImage)
 			self.saveTablePostImage(entries: dataPostImage)
 			self.saveTablePostTag(entries: dataPostTag)
 			self.saveTablePostTag(entries: dataPostTag)
 			
 			
-			//TODO: Tester, Debug only
+			self.saveTablePlace(entries: dataPlace)
+			
+			self.saveTableAlbum(entries: dataAlbum)
+			
+			//DEBUG: Tester, Debug only
 			// Test if a entity has entries
 			// Test if a entity has entries
 			let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
 			let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
 			let appDelegate = UIApplication.shared.delegate as! AppDelegate
 			let appDelegate = UIApplication.shared.delegate as! AppDelegate
 			context.persistentStoreCoordinator = appDelegate.persistentStoreCoordinator
 			context.persistentStoreCoordinator = appDelegate.persistentStoreCoordinator
-			let fetchRequest: NSFetchRequest<Post> = Post.fetchRequest()
+			let fetchRequest: NSFetchRequest<Post> = Post.fetchRequest()  //Entity to debug
 			
 			
 			do {
 			do {
 				//go get the results
 				//go get the results
 				let searchResults = try context.fetch(fetchRequest)
 				let searchResults = try context.fetch(fetchRequest)
 				
 				
-				print ("Num of results = \(searchResults.count)")
+				print("SYNC:DEBUG: Num of results = \(searchResults.count).")
 				for r in searchResults as [NSManagedObject] {
 				for r in searchResults as [NSManagedObject] {
-					print("\(r.value(forKey: "id"))")
+					print("SYNC:DEBUG: id: \(r.value(forKey: "id")).")
 				}
 				}
 			} catch {
 			} catch {
-				print("Error with request: \(error)")
+				print("SYNC:DEBUG: Error with request: \(error).")
 			}
 			}
 			//End tester
 			//End tester
 		}
 		}
 		
 		
 		task.resume()
 		task.resume()
-
+		
 	}
 	}
 	
 	
+	/**
+	Extracts table rows from the raw data received.
+	:param: param Received data in JSON format.
+	:param: table The name of the table to look for.
+	:return: Array of strings containing the rows of the table, in JSON format.
+	*/
 	func getTable(data: String, table: String) -> [String]{
 	func getTable(data: String, table: String) -> [String]{
 		//Does the table exists?
 		//Does the table exists?
-		if data.indexOf(target: "\"\(table)\"") == nil{
-			print("No data in table \(table)")
+		if data.indexOf(target: "\"\(table)\":[") == nil{
+			print("SYNC:LOG: Empty table: \(table).")
 			return [String]()
 			return [String]()
 		}
 		}
-		let iS : Int? = data.indexOf(target: "\"\(table)\"")
+		let iS : Int? = data.indexOf(target: "\"\(table)\":[")
 		var str = data.subStr(start: iS!, end: data.length - 1)
 		var str = data.subStr(start: iS!, end: data.length - 1)
 		let iE : Int? = str.indexOf(target: "}]}")!
 		let iE : Int? = str.indexOf(target: "}]}")!
 		str = str.subStr(start: 0, end: iE!)
 		str = str.subStr(start: 0, end: iE!)
 		str = str.subStr(start: table.length + 3,end: str.length - 1)
 		str = str.subStr(start: table.length + 3,end: str.length - 1)
-	
+		
 		//Separate the entries
 		//Separate the entries
 		var entries : [String] = str.components(separatedBy: "},{")
 		var entries : [String] = str.components(separatedBy: "},{")
-	
+		
 		//Modify the first and the last one to remove bracers
 		//Modify the first and the last one to remove bracers
 		entries[0] = entries[0].subStr(start: 1, end: entries[0].length - 1)
 		entries[0] = entries[0].subStr(start: 1, end: entries[0].length - 1)
 		entries[entries.count - 1] = entries[entries.count - 1].subStr(start: 0, end: entries[entries.count - 1].length - 2)
 		entries[entries.count - 1] = entries[entries.count - 1].subStr(start: 0, end: entries[entries.count - 1].length - 2)
-	
+		
+		print("SYNC:LOG: Table \(table) has \(entries.count) rows.")
+		
 		//Return the array
 		//Return the array
 		return entries
 		return entries
 	}
 	}
-
 	
 	
+	// FIX: ERROR in API.
+	/**
+	Saves the data in the table.
+	:param: entries Array of strings containing the rows of the table, in JSON format.
+	*/
+	func saveTablePeople(entries : [String]){
+		
+		print("SYNC:LOG: Saving table People.")
+		
+		//Set up context
+		let appDelegate = UIApplication.shared.delegate as! AppDelegate
+		let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
+		context.persistentStoreCoordinator = appDelegate.persistentStoreCoordinator
+		
+		let entity =  NSEntityDescription.entity(forEntityName: "People", in: context)
+		
+		var row: NSManagedObject
+		
+		//Delete all previous entries
+		let fetch = NSFetchRequest<NSFetchRequestResult>(entityName: "People")
+		let request = NSBatchDeleteRequest(fetchRequest: fetch)
+		do {
+			try context.execute(request)
+		} catch let error as NSError  {
+			print("SYNC:ERROR: Could not clean up People entity: \(error), \(error.userInfo).")
+		} catch {
+			print("SYNC:ERROR: Could not clean up People entity")
+		}
+		
+		//Loop new entries
+		for entry in entries{
+			
+			//Get id
+			var str = entry
+			let id : Int = Int(str.subStr(start : str.indexOf(target : "\"id\":")! + 6, end : str.indexOf(target : ",\"")! - 2))!
+			
+			//Get name_es
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let name_es : String = str.subStr(start : str.indexOf(target : "\"name_es\":")! + 11, end : str.indexOf(target : ",\"")! - 2)
+			
+			//Get name_en
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let name_en : String = str.subStr(start : str.indexOf(target : "\"name_en\":")! + 11, end : str.indexOf(target : ",\"")! - 2)
+			
+			//Get name_eu
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let name_eu : String = str.subStr(start : str.indexOf(target : "\"name_eu\":")! + 11, end : str.indexOf(target : ",\"")! - 2)
+			
+			//Get address_es
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let address_es : String = str.subStr(start : str.indexOf(target : "\"address_es\":")! + 14, end : str.indexOf(target : ",\"")! - 2)
+			
+			//Get address_en
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let address_en : String = str.subStr(start : str.indexOf(target : "\"address_en\":")! + 14, end : str.indexOf(target : ",\"")! - 2)
+			
+			//Get address_eu
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let address_eu : String = str.subStr(start : str.indexOf(target : "\"address_eu\":")! + 14, end : str.indexOf(target : ",\"")! - 2)
+			
+			//Get cp
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let cp : String = str.subStr(start : str.indexOf(target : "\"cp\":")! + 6, end : str.indexOf(target : ",\"")! - 2)
+			
+			//Get lat
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let lat : Float = Float(str.subStr(start : str.indexOf(target : "\"lat\":")! + 7, end : str.indexOf(target : ",\"")! - 2))!
+			
+			//Get lon
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let lon : Float = Float(str.subStr(start : str.indexOf(target : "\"lon\":")! + 7, end : str.length - 2))!
+			
+			//Save CoreData
+			row = NSManagedObject(entity: entity!, insertInto: context)
+			row.setValue(id, forKey: "id")
+			row.setValue(name_es, forKey: "name_es")
+			row.setValue(name_en, forKey: "name_en")
+			row.setValue(name_eu, forKey: "name_eu")
+			row.setValue(address_es, forKey: "address_es")
+			row.setValue(address_en, forKey: "address_en")
+			row.setValue(address_eu, forKey: "address_eu")
+			row.setValue(cp, forKey: "cp")
+			row.setValue(lat, forKey: "lat")
+			row.setValue(lon, forKey: "lon")
+			do {
+				try context.save()
+			} catch let error as NSError  {
+				print("SYNC:ERROR: Could not store Place with id \(id): \(error), \(error.userInfo).")
+			} catch {
+				print("SYNC:ERROR: Could not store Place with id \(id).")
+			}
+		}
+	}
+	
+	/**
+	Saves the data in the table.
+	:param: entries Array of strings containing the rows of the table, in JSON format.
+	*/
+	func saveTablePlace(entries : [String]){
+		
+		print("SYNC:LOG: Saving table Place.")
+		
+		//Set up context
+		let appDelegate = UIApplication.shared.delegate as! AppDelegate
+		let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
+		context.persistentStoreCoordinator = appDelegate.persistentStoreCoordinator
+		
+		let entity =  NSEntityDescription.entity(forEntityName: "Place", in: context)
+		
+		var row: NSManagedObject
+		
+		//Delete all previous entries
+		let fetch = NSFetchRequest<NSFetchRequestResult>(entityName: "Place")
+		let request = NSBatchDeleteRequest(fetchRequest: fetch)
+		do {
+			try context.execute(request)
+		} catch let error as NSError  {
+			print("SYNC:ERROR: Could not clean up Places entity: \(error), \(error.userInfo).")
+		} catch {
+			print("SYNC:ERROR: Could not clean up Places entity.")
+		}
+		
+		//Loop new entries
+		for entry in entries{
+			
+			//Get id
+			var str = entry
+			let id : Int = Int(str.subStr(start : str.indexOf(target : "\"id\":")! + 6, end : str.indexOf(target : ",\"")! - 2))!
+			
+			//Get name_es
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let name_es : String = str.subStr(start : str.indexOf(target : "\"name_es\":")! + 11, end : str.indexOf(target : ",\"")! - 2)
+			
+			//Get name_en
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let name_en : String = str.subStr(start : str.indexOf(target : "\"name_en\":")! + 11, end : str.indexOf(target : ",\"")! - 2)
+			
+			//Get name_eu
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let name_eu : String = str.subStr(start : str.indexOf(target : "\"name_eu\":")! + 11, end : str.indexOf(target : ",\"")! - 2)
+			
+			//Get address_es
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let address_es : String = str.subStr(start : str.indexOf(target : "\"address_es\":")! + 14, end : str.indexOf(target : ",\"")! - 2)
+			
+			//Get address_en
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let address_en : String = str.subStr(start : str.indexOf(target : "\"address_en\":")! + 14, end : str.indexOf(target : ",\"")! - 2)
+			
+			//Get address_eu
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let address_eu : String = str.subStr(start : str.indexOf(target : "\"address_eu\":")! + 14, end : str.indexOf(target : ",\"")! - 2)
+			
+			//Get cp
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let cp : String = str.subStr(start : str.indexOf(target : "\"cp\":")! + 6, end : str.indexOf(target : ",\"")! - 2)
+			
+			//Get lat
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let lat : Float = Float(str.subStr(start : str.indexOf(target : "\"lat\":")! + 7, end : str.indexOf(target : ",\"")! - 2))!
+			
+			//Get lon
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let lon : Float = Float(str.subStr(start : str.indexOf(target : "\"lon\":")! + 7, end : str.length - 2))!
+			
+			//Save CoreData
+			row = NSManagedObject(entity: entity!, insertInto: context)
+			row.setValue(id, forKey: "id")
+			row.setValue(name_es, forKey: "name_es")
+			row.setValue(name_en, forKey: "name_en")
+			row.setValue(name_eu, forKey: "name_eu")
+			row.setValue(address_es, forKey: "address_es")
+			row.setValue(address_en, forKey: "address_en")
+			row.setValue(address_eu, forKey: "address_eu")
+			row.setValue(cp, forKey: "cp")
+			row.setValue(lat, forKey: "lat")
+			row.setValue(lon, forKey: "lon")
+			do {
+				try context.save()
+			} catch let error as NSError  {
+				print("SYNC:ERROR: Could not store Place with id \(id): \(error), \(error.userInfo).")
+			} catch {
+				print("SYNC:ERROR: Could not store Place with id \(id).")
+			}
+		}
+	}
+	
+	/**
+	Saves the data in the table.
+	:param: entries Array of strings containing the rows of the table, in JSON format.
+	*/
 	func saveTablePost(entries : [String]){
 	func saveTablePost(entries : [String]){
 		
 		
+		print("SYNC:LOG: Saving table Post.")
+		
 		let dateFormatter = DateFormatter()
 		let dateFormatter = DateFormatter()
 		dateFormatter.timeZone = TimeZone.ReferenceType.local
 		dateFormatter.timeZone = TimeZone.ReferenceType.local
 		
 		
@@ -177,9 +382,9 @@ class Sync{
 		do {
 		do {
 			try context.execute(request)
 			try context.execute(request)
 		} catch let error as NSError  {
 		} catch let error as NSError  {
-			print("Could not clean up Post entity: \(error), \(error.userInfo)")
+			print("SYNC:ERROR: Could not clean up Post entity: \(error), \(error.userInfo).")
 		} catch {
 		} catch {
-			
+			print("SYNC:ERROR: Could not clean up Post entity.")
 		}
 		}
 		
 		
 		//Loop new entries
 		//Loop new entries
@@ -230,8 +435,6 @@ class Sync{
 			dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
 			dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
 			let dtime = dateFormatter.date(from : str.subStr(start : str.indexOf(target : "\"dtime\":")! + 9, end : str.length - 2))!
 			let dtime = dateFormatter.date(from : str.subStr(start : str.indexOf(target : "\"dtime\":")! + 9, end : str.length - 2))!
 			
 			
-			
-			
 			//Save CoreData
 			//Save CoreData
 			row = NSManagedObject(entity: entity!, insertInto: context)
 			row = NSManagedObject(entity: entity!, insertInto: context)
 			//set the entity values
 			//set the entity values
@@ -250,16 +453,21 @@ class Sync{
 			do {
 			do {
 				try context.save()
 				try context.save()
 			} catch let error as NSError  {
 			} catch let error as NSError  {
-				print("Could not store Post with id \(id) \(error), \(error.userInfo)")
+				print("SYNC:ERROR: Could not store Post with id \(id): \(error), \(error.userInfo).")
 			} catch {
 			} catch {
-				
+				print("SYNC:ERROR: Could not store Post with id \(id).")
 			}
 			}
-			
 		}
 		}
 	}
 	}
 	
 	
+	/**
+	Saves the data in the table.
+	:param: entries Array of strings containing the rows of the table, in JSON format.
+	*/
 	func saveTablePostComment(entries : [String]){
 	func saveTablePostComment(entries : [String]){
 		
 		
+		print("SYNC:LOG: Saving table Post_comment.")
+		
 		let dateFormatter = DateFormatter()
 		let dateFormatter = DateFormatter()
 		dateFormatter.timeZone = TimeZone.ReferenceType.local
 		dateFormatter.timeZone = TimeZone.ReferenceType.local
 		
 		
@@ -278,9 +486,9 @@ class Sync{
 		do {
 		do {
 			try context.execute(request)
 			try context.execute(request)
 		} catch let error as NSError  {
 		} catch let error as NSError  {
-			print("Could not clean up Post_comment entity: \(error), \(error.userInfo)")
+			print("SYNC:ERROR: Could not clean up Post_comment entity: \(error), \(error.userInfo).")
 		} catch {
 		} catch {
-			
+			print("SYNC:ERROR: Could not clean up Post_comment entity.")
 		}
 		}
 		
 		
 		//Loop new entries
 		//Loop new entries
@@ -322,16 +530,22 @@ class Sync{
 			do {
 			do {
 				try context.save()
 				try context.save()
 			} catch let error as NSError  {
 			} catch let error as NSError  {
-				print("Could not store Activity_comment with id \(id) \(error), \(error.userInfo)")
+				print("SYNC:ERROR: Could not store Activity_comment with id \(id): \(error), \(error.userInfo).")
 			} catch {
 			} catch {
-				
+				print("SYNC:ERROR: Could not store Activity_comment with id \(id).")
 			}
 			}
 			
 			
 		}
 		}
 	}
 	}
 	
 	
+	/**
+	Saves the data in the table.
+	:param: entries Array of strings containing the rows of the table, in JSON format.
+	*/
 	func saveTablePostImage(entries : [String]){
 	func saveTablePostImage(entries : [String]){
 		
 		
+		print("SYNC:LOG: Saving table Post_image.")
+		
 		//Set up context
 		//Set up context
 		let appDelegate = UIApplication.shared.delegate as! AppDelegate
 		let appDelegate = UIApplication.shared.delegate as! AppDelegate
 		let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
 		let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
@@ -347,9 +561,9 @@ class Sync{
 		do {
 		do {
 			try context.execute(request)
 			try context.execute(request)
 		} catch let error as NSError  {
 		} catch let error as NSError  {
-			print("Could not clean up Post_comment entity: \(error), \(error.userInfo)")
+			print("SYNC:ERROR: Could not clean up Post_comment entity: \(error), \(error.userInfo).")
 		} catch {
 		} catch {
-			
+			print("SYNC:ERROR: Could not clean up Post_comment entity.")
 		}
 		}
 		
 		
 		//Loop new entries
 		//Loop new entries
@@ -380,15 +594,21 @@ class Sync{
 			do {
 			do {
 				try context.save()
 				try context.save()
 			} catch let error as NSError  {
 			} catch let error as NSError  {
-				print("Could not store Post_image with id \(id) \(error), \(error.userInfo)")
+				print("SYNC:ERROR: Could not store Post_image with id \(id): \(error), \(error.userInfo).")
 			} catch {
 			} catch {
-				
+				print("SYNC:ERROR: Could not store Post_image with id \(id).")
 			}
 			}
 		}
 		}
 	}
 	}
 	
 	
+	/**
+	Saves the data in the table.
+	:param: entries Array of strings containing the rows of the table, in JSON format.
+	*/
 	func saveTablePostTag(entries : [String]){
 	func saveTablePostTag(entries : [String]){
 		
 		
+		print("SYNC:LOG: Saving table Post_tag.")
+		
 		//Set up context
 		//Set up context
 		let appDelegate = UIApplication.shared.delegate as! AppDelegate
 		let appDelegate = UIApplication.shared.delegate as! AppDelegate
 		let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
 		let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
@@ -404,9 +624,9 @@ class Sync{
 		do {
 		do {
 			try context.execute(request)
 			try context.execute(request)
 		} catch let error as NSError  {
 		} catch let error as NSError  {
-			print("Could not clean up Post_tag entity: \(error), \(error.userInfo)")
+			print("SYNC:ERROR: Could not clean up Post_tag entity: \(error), \(error.userInfo).")
 		} catch {
 		} catch {
-			
+			print("SYNC:ERROR: Could not clean up Post_tag entity.")
 		}
 		}
 		
 		
 		//Loop new entries
 		//Loop new entries
@@ -427,15 +647,21 @@ class Sync{
 			do {
 			do {
 				try context.save()
 				try context.save()
 			} catch let error as NSError  {
 			} catch let error as NSError  {
-				print("Could not store Post_tag for post: \(post), tag: \(tag). Error: \(error), \(error.userInfo)")
+				print("SYNC:ERROR: Could not store Post_tag for post: \(post), tag: \(tag): \(error), \(error.userInfo).")
 			} catch {
 			} catch {
-				
+				print("SYNC:ERROR: Could not store Post_tag for post: \(post), tag: \(tag).")
 			}
 			}
 		}
 		}
 	}
 	}
 	
 	
+	/**
+	Saves the data in the table.
+	:param: entries Array of strings containing the rows of the table, in JSON format.
+	*/
 	func saveTableActivity(entries : [String]){
 	func saveTableActivity(entries : [String]){
 		
 		
+		print("SYNC:LOG: Saving table Activity.")
+		
 		let dateFormatter = DateFormatter()
 		let dateFormatter = DateFormatter()
 		dateFormatter.timeZone = TimeZone.ReferenceType.local
 		dateFormatter.timeZone = TimeZone.ReferenceType.local
 		
 		
@@ -454,9 +680,9 @@ class Sync{
 		do {
 		do {
 			try context.execute(request)
 			try context.execute(request)
 		} catch let error as NSError  {
 		} catch let error as NSError  {
-			print("Could not clean up Activity entity: \(error), \(error.userInfo)")
+			print("SYNC:ERROR: Could not clean up Activity entity: \(error), \(error.userInfo).")
 		} catch {
 		} catch {
-			
+			print("SYNC:ERROR: Could not clean up Activity entity.")
 		}
 		}
 		
 		
 		//Loop new entries
 		//Loop new entries
@@ -573,20 +799,26 @@ class Sync{
 			if (album != -1){
 			if (album != -1){
 				row.setValue(album, forKey: "album")
 				row.setValue(album, forKey: "album")
 			}
 			}
-
+			
 			do {
 			do {
 				try context.save()
 				try context.save()
 			} catch let error as NSError  {
 			} catch let error as NSError  {
-				print("Could not store Activity with id \(id) \(error), \(error.userInfo)")
+				print("SYNC:ERROR: Could not store Activity with id \(id): \(error), \(error.userInfo).")
 			} catch {
 			} catch {
-				
+				print("SYNC:ERROR: Could not store Activity with id \(id).")
 			}
 			}
-
+			
 		}
 		}
 	}
 	}
 	
 	
+	/**
+	Saves the data in the table.
+	:param: entries Array of strings containing the rows of the table, in JSON format.
+	*/
 	func saveTableActivityComment(entries : [String]){
 	func saveTableActivityComment(entries : [String]){
 		
 		
+		print("SYNC:LOG: Saving table Activity_comment.")
+		
 		let dateFormatter = DateFormatter()
 		let dateFormatter = DateFormatter()
 		dateFormatter.timeZone = TimeZone.ReferenceType.local
 		dateFormatter.timeZone = TimeZone.ReferenceType.local
 		
 		
@@ -605,9 +837,9 @@ class Sync{
 		do {
 		do {
 			try context.execute(request)
 			try context.execute(request)
 		} catch let error as NSError  {
 		} catch let error as NSError  {
-			print("Could not clean up Activity_comment entity: \(error), \(error.userInfo)")
+			print("SYNC:ERROR: Could not clean up Activity_comment entity: \(error), \(error.userInfo).")
 		} catch {
 		} catch {
-			
+			print("SYNC:ERROR: Could not clean up Activity_comment entity.")
 		}
 		}
 		
 		
 		//Loop new entries
 		//Loop new entries
@@ -649,16 +881,22 @@ class Sync{
 			do {
 			do {
 				try context.save()
 				try context.save()
 			} catch let error as NSError  {
 			} catch let error as NSError  {
-				print("Could not store Activity_comment with id \(id) \(error), \(error.userInfo)")
+				print("SYNC:ERROR: Could not store Activity_comment with id \(id): \(error), \(error.userInfo).")
 			} catch {
 			} catch {
-				
+				print("SYNC:ERROR: Could not store Activity_comment with id \(id).")
 			}
 			}
 			
 			
 		}
 		}
 	}
 	}
 	
 	
+	/**
+	Saves the data in the table.
+	:param: entries Array of strings containing the rows of the table, in JSON format.
+	*/
 	func saveTableActivityImage(entries : [String]){
 	func saveTableActivityImage(entries : [String]){
 		
 		
+		print("SYNC:LOG: Saving table Activity_image.")
+		
 		//Set up context
 		//Set up context
 		let appDelegate = UIApplication.shared.delegate as! AppDelegate
 		let appDelegate = UIApplication.shared.delegate as! AppDelegate
 		let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
 		let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
@@ -674,9 +912,9 @@ class Sync{
 		do {
 		do {
 			try context.execute(request)
 			try context.execute(request)
 		} catch let error as NSError  {
 		} catch let error as NSError  {
-			print("Could not clean up Activity_comment entity: \(error), \(error.userInfo)")
+			print("SYNC:ERROR: Could not clean up Activity_comment entity: \(error), \(error.userInfo).")
 		} catch {
 		} catch {
-			
+			print("SYNC:ERROR: Could not clean up Activity_comment entity.")
 		}
 		}
 		
 		
 		//Loop new entries
 		//Loop new entries
@@ -707,15 +945,21 @@ class Sync{
 			do {
 			do {
 				try context.save()
 				try context.save()
 			} catch let error as NSError  {
 			} catch let error as NSError  {
-				print("Could not store Activity_image with id \(id) \(error), \(error.userInfo)")
+				print("SYNC:ERROR: Could not store Activity_image with id \(id): \(error), \(error.userInfo).")
 			} catch {
 			} catch {
-				
+				print("SYNC:ERROR: Could not store Activity_image with id \(id).")
 			}
 			}
 		}
 		}
 	}
 	}
 	
 	
+	/**
+	Saves the data in the table.
+	:param: entries Array of strings containing the rows of the table, in JSON format.
+	*/
 	func saveTableActivityTag(entries : [String]){
 	func saveTableActivityTag(entries : [String]){
 		
 		
+		print("SYNC:LOG: Saving table Activity_tag.")
+		
 		//Set up context
 		//Set up context
 		let appDelegate = UIApplication.shared.delegate as! AppDelegate
 		let appDelegate = UIApplication.shared.delegate as! AppDelegate
 		let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
 		let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
@@ -731,9 +975,9 @@ class Sync{
 		do {
 		do {
 			try context.execute(request)
 			try context.execute(request)
 		} catch let error as NSError  {
 		} catch let error as NSError  {
-			print("Could not clean up Activity_tag entity: \(error), \(error.userInfo)")
+			print("SYNC:ERROR: Could not clean up Activity_tag entity: \(error), \(error.userInfo).")
 		} catch {
 		} catch {
-			
+			print("SYNC:ERROR: Could not clean up Activity_tag entity.")
 		}
 		}
 		
 		
 		//Loop new entries
 		//Loop new entries
@@ -754,9 +998,217 @@ class Sync{
 			do {
 			do {
 				try context.save()
 				try context.save()
 			} catch let error as NSError  {
 			} catch let error as NSError  {
-				print("Could not store Activity_tag for activity: \(activity), tag: \(tag). Error: \(error), \(error.userInfo)")
+				print("SYNC:ERROR: Could not store Activity_tag for activity \(activity), tag: \(tag): Error: \(error), \(error.userInfo).")
 			} catch {
 			} catch {
-				
+				print("SYNC:ERROR: Could not store Activity_tag for activity \(activity), tag: \(tag).")
+			}
+		}
+	}
+	
+	/**
+	Saves the data in the table.
+	:param: entries Array of strings containing the rows of the table, in JSON format.
+	*/
+	//CHECK: New (and probably better format than the others.)
+	func saveTableActivityItinerary(entries : [String]){
+		
+		print("SYNC:LOG: Saving table Activity_itinerary.")
+		
+		let dateFormatter = DateFormatter()
+		dateFormatter.timeZone = TimeZone.ReferenceType.local
+		
+		//Set up context
+		let appDelegate = UIApplication.shared.delegate as! AppDelegate
+		let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
+		context.persistentStoreCoordinator = appDelegate.persistentStoreCoordinator
+		
+		let entity =  NSEntityDescription.entity(forEntityName: "Activity_itinerary", in: context)
+		
+		var row: NSManagedObject
+		
+		//Delete all previous entries
+		let fetch = NSFetchRequest<NSFetchRequestResult>(entityName: "Activity_itinerary")
+		let request = NSBatchDeleteRequest(fetchRequest: fetch)
+		do {
+			try context.execute(request)
+		} catch let error as NSError  {
+			print("SYNC:ERROR: Could not clean up Activity_itinerary entity: \(error), \(error.userInfo).")
+		} catch {
+			print("SYNC:ERROR: Could not clean up Activity_itinerary entity.")
+		}
+		
+		//Loop new entries
+		for entry in entries{
+			
+			row = NSManagedObject(entity: entity!, insertInto: context)
+			
+			//Get id
+			var str = entry
+			let id : Int = Int(str.subStr(start : str.indexOf(target : "\"id\":")! + 6, end : str.indexOf(target : ",\"")! - 2))!
+			row.setValue(id, forKey: "id")
+			
+			//Get activity
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let activity : Int = Int(str.subStr(start : str.indexOf(target : "\"activity\":")! + 12, end : str.indexOf(target : ",\"")! - 2))!
+			row.setValue(activity, forKey: "activity")
+			
+			//Get name_es
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let name_es : String = str.subStr(start : str.indexOf(target : "\"name_es\":")! + 11, end : str.indexOf(target : ",\"")! - 2)
+			row.setValue(name_es, forKey: "name_es")
+			
+			//Get name_en
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let name_en : String = str.subStr(start : str.indexOf(target : "\"name_en\":")! + 11, end : str.indexOf(target : ",\"")! - 2)
+			row.setValue(name_en, forKey: "name_en")
+			
+			//Get name_eu
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let name_eu : String = str.subStr(start : str.indexOf(target : "\"name_eu\":")! + 11, end : str.indexOf(target : ",\"")! - 2)
+			row.setValue(name_eu, forKey: "name_eu")
+			
+			//Get description_es
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let description_es : String = str.subStr(start : str.indexOf(target : "\"description_es\":")! + 18, end : str.indexOf(target : ",\"")! - 2)
+			if (description_es != "ul"){ //From "null"
+				row.setValue(description_es, forKey: "description_es")
+			}
+			
+			//Get description_en
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let description_en : String = str.subStr(start : str.indexOf(target : "\"description_en\":")! + 18, end : str.indexOf(target : ",\"")! - 2)
+			if (description_en != "ul"){ //From "null"
+				row.setValue(description_en, forKey: "description_en")
+			}
+			
+			//Get description_eu
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let description_eu : String = str.subStr(start : str.indexOf(target : "\"description_eu\":")! + 18, end : str.indexOf(target : ",\"")! - 2)
+			if (description_eu != "ul"){ //From "null"
+				row.setValue(description_eu, forKey: "description_eu")
+			}
+			
+			//Get start
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss"
+			let start = dateFormatter.date(from: str.subStr(start : str.indexOf(target : "\"start\":")! + 9, end : str.indexOf(target : ",\"")! - 2))!
+			row.setValue(start, forKey: "start")
+			
+			//Get end
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let end = str.subStr(start : str.indexOf(target : "\"end\":")! + 7, end : str.indexOf(target : ",\"")! - 2)
+			if (end != "ul"){ //From "null"
+				row.setValue(dateFormatter.date(from: end), forKey: "end")
+			}
+			
+			//Get place
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let place : Int = Int(str.subStr(start : str.indexOf(target : "\"place\":")! + 9, end : str.length - 2))!
+			row.setValue(place, forKey: "place")
+			
+			//Save CoreData
+			do {
+				try context.save()
+			} catch let error as NSError  {
+				print("SYNC:ERROR: Could not store Activity_itinerary with id \(id): \(error), \(error.userInfo).")
+			} catch {
+				print("SYNC:ERROR: Could not store Activity_itinerary with id \(id).")
+			}
+		}
+	}
+	
+	/**
+	Saves the data in the table.
+	:param: entries Array of strings containing the rows of the table, in JSON format.
+	*/
+	//CHECK: New (and probably better format than the others.)
+	func saveTableAlbum(entries : [String]){
+		
+		print("SYNC:LOG: Saving table Album.")
+		
+		//Set up context
+		let appDelegate = UIApplication.shared.delegate as! AppDelegate
+		let context = NSManagedObjectContext(concurrencyType: .privateQueueConcurrencyType)
+		context.persistentStoreCoordinator = appDelegate.persistentStoreCoordinator
+		
+		let entity =  NSEntityDescription.entity(forEntityName: "Album", in: context)
+		
+		var row: NSManagedObject
+		
+		//Delete all previous entries
+		let fetch = NSFetchRequest<NSFetchRequestResult>(entityName: "Album")
+		let request = NSBatchDeleteRequest(fetchRequest: fetch)
+		do {
+			try context.execute(request)
+		} catch let error as NSError  {
+			print("SYNC:ERROR: Could not clean up Album: \(error), \(error.userInfo).")
+		} catch {
+			print("SYNC:ERROR: Could not clean up Album entity.")
+		}
+		
+		//Loop new entries
+		for entry in entries{
+			
+			row = NSManagedObject(entity: entity!, insertInto: context)
+			
+			//Get id
+			var str = entry
+			let id : Int = Int(str.subStr(start : str.indexOf(target : "\"id\":")! + 6, end : str.indexOf(target : ",\"")! - 2))!
+			row.setValue(id, forKey: "id")
+			
+			//Get permalink
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let permalink : String = str.subStr(start : str.indexOf(target : "\"permalink\":")! + 13, end : str.indexOf(target : ",\"")! - 2)
+			row.setValue(permalink, forKey: "permalink")
+			
+			//Get title_es
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let title_es : String = str.subStr(start : str.indexOf(target : "\"title_es\":")! + 12, end : str.indexOf(target : ",\"")! - 2)
+			row.setValue(title_es, forKey: "title_es")
+			
+			//Get title_en
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let title_en : String = str.subStr(start : str.indexOf(target : "\"title_en\":")! + 12, end : str.indexOf(target : ",\"")! - 2)
+			row.setValue(title_es, forKey: "title_es")
+			
+			//Get title_eu
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let title_eu : String = str.subStr(start : str.indexOf(target : "\"title_eu\":")! + 12, end : str.indexOf(target : ",\"")! - 2)
+			row.setValue(title_es, forKey: "title_es")
+			
+			//Get description_es
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let description_es : String = str.subStr(start : str.indexOf(target : "\"description_es\":")! + 18, end : str.indexOf(target : ",\"")! - 2)
+			if (description_es != "ul"){ //From "null"
+				row.setValue(description_es, forKey: "description_es")
+			}
+			
+			//Get description_en
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let description_en : String = str.subStr(start : str.indexOf(target : "\"description_en\":")! + 18, end : str.indexOf(target : ",\"")! - 2)
+			if (description_en != "ul"){ //From "null"
+				row.setValue(description_en, forKey: "description_en")
+			}
+			
+			//Get description_eu
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let description_eu : String = str.subStr(start : str.indexOf(target : "\"description_eu\":")! + 18, end : str.indexOf(target : ",\"")! - 2)
+			if (description_eu != "ul"){ //From "null"
+				row.setValue(description_eu, forKey: "description_eu")
+			}
+			
+			//Get open
+			str = str.subStr(start : str.indexOf(target : ",\"")! + 1, end : str.length - 1)
+			let open : Int = Int(str.subStr(start : str.indexOf(target : "\"open\":")! + 8, end : str.length - 2))!
+			row.setValue(open, forKey: "open")
+			
+			//Save CoreData
+			do {
+				try context.save()
+			} catch let error as NSError  {
+				print("SYNC:ERROR: Could not store Album with id \(id): \(error), \(error.userInfo).")
+			} catch {
+				print("SYNC:ERROR: Could not store Album with id \(id).")
 			}
 			}
 		}
 		}
 	}
 	}

+ 2 - 1
app/app.xcdatamodeld/app.xcdatamodel/contents

@@ -53,6 +53,7 @@
         <attribute name="tag" optional="YES" attributeType="String" syncable="YES"/>
         <attribute name="tag" optional="YES" attributeType="String" syncable="YES"/>
     </entity>
     </entity>
     <entity name="Album" representedClassName=".Album" syncable="YES" codeGenerationType="class">
     <entity name="Album" representedClassName=".Album" syncable="YES" codeGenerationType="class">
+        <attribute name="description_en" optional="YES" attributeType="String" syncable="YES"/>
         <attribute name="description_es" optional="YES" attributeType="String" syncable="YES"/>
         <attribute name="description_es" optional="YES" attributeType="String" syncable="YES"/>
         <attribute name="description_eu" optional="YES" attributeType="String" syncable="YES"/>
         <attribute name="description_eu" optional="YES" attributeType="String" syncable="YES"/>
         <attribute name="id" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/>
         <attribute name="id" optional="YES" attributeType="Integer 32" defaultValueString="0" usesScalarValueType="YES" syncable="YES"/>
@@ -224,7 +225,7 @@
         <element name="Activity_image" positionX="-36" positionY="-3897" width="128" height="105"/>
         <element name="Activity_image" positionX="-36" positionY="-3897" width="128" height="105"/>
         <element name="Activity_itinerary" positionX="-18" positionY="-3888" width="128" height="210"/>
         <element name="Activity_itinerary" positionX="-18" positionY="-3888" width="128" height="210"/>
         <element name="Activity_tag" positionX="0" positionY="-3852" width="128" height="75"/>
         <element name="Activity_tag" positionX="0" positionY="-3852" width="128" height="75"/>
-        <element name="Album" positionX="18" positionY="-3861" width="128" height="180"/>
+        <element name="Album" positionX="18" positionY="-3861" width="128" height="195"/>
         <element name="Festival" positionX="36" positionY="-3852" width="128" height="180"/>
         <element name="Festival" positionX="36" positionY="-3852" width="128" height="180"/>
         <element name="Festival_day" positionX="-9" positionY="-3906" width="128" height="135"/>
         <element name="Festival_day" positionX="-9" positionY="-3906" width="128" height="135"/>
         <element name="Festival_event" positionX="0" positionY="-3897" width="128" height="225"/>
         <element name="Festival_event" positionX="0" positionY="-3897" width="128" height="225"/>