Сучасна диджитал-освіта для дітей — безоплатне заняття в GoITeens ×
Mazda CX 5
×

Помогите с Core Data Swift 2.0

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

Привет помогите, не могу уже вторую неделю осилить момент в Core Data Swift 2.0, создаю объекты они успешно сохраняются при первом запуске, но если запускаю приложение снова и снова, то объекты в Core Data дублируются, дублируются и так до бесконечности, в моем tableview начинается лажа)

Вот мой код, очень прошу помощи, хочу двигаться дальше..., но на этом этапе завис..., я понимаю, что нужно как то перед сохранением проверить есть ли данный объект уже или его нет

//Стартуем

import UIKit
import SwiftyJSON
import CoreData

class MainTableViewController: UITableViewController {

@IBOutlet var MainTableView: UITableView!

//Создаю массив для типизации и хранения данных Core Data

var someNewsCore = [FNews]()

//Устанавливаю номер страницы для загрузки данных с помощью SwiftyJSON

let pageNumber = "1"

//Используем стандартные процедуры для подготовки использования Core Data

let moContext = (UIApplication.sharedApplication().delegate as! AppDelegate).managedObjectContext

override func viewDidLoad() {
super.viewDidLoad()

let urlString = "http://kinodrive.com/json/news.php?page=" + pageNumber

//Получаем JSON

if let url = NSURL(string: urlString) {

if let data = try? NSData(contentsOfURL: url, options: []) {

let json = JSON(data: data)

for value in json.dictionaryValue.keys {

if let idJson = json[value]["id"].string {

let titleJson = json[value]["title"].string

let dateJson = json[value]["date"].string

let viewsJson = json[value]["views"].string

let imageJson = json[value]["image"].string

//Типизируем данные перед сохранением в Core Data

let entity = NSEntityDescription.entityForName("FNews", inManagedObjectContext: moContext)

let fnews2 = FNews(entity: entity!, insertIntoManagedObjectContext: moContext)

fnews2.title = titleJson

fnews2.id = idJson

fnews2.view = viewsJson

fnews2.data = dateJson

let imagePath = UIImage(data: NSData(contentsOfURL: NSURL(string: imageJson!)!)!)

let imageData = UIImageJPEGRepresentation(imagePath!, 1)

fnews2.image = imageData

//Наверно тут САМЫЙ важный момент вопроса, каждый раз при запуске приложения, данные сохраняются в Core Data, снова и снова.

Как сделать, чтобы они проверялись, есть ли запись с таким значением или нет? Может хотя бы перезаписывались, но не дублировались...

do {

try moContext.save()

} catch {

fatalError("Failure to save context: \(error)")

}

tableView.reloadData()

}

}

}

}

}

//Получаем данные из Core Data

override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}

override func viewDidAppear(animated: Bool) {

let request = NSFetchRequest(entityName: "FNews")

let sortArray = NSSortDescriptor(key: "id", ascending: false)

request.sortDescriptors = [sortArray]

do {

let core = try moContext.executeFetchRequest(request) as! [FNews]

someNewsCore = core

} catch {

fatalError("Failed to fetch person: \(error)")

}



self.MainTableView.reloadData()

}

// MARK: - Table view data source

//Присваиваем данные нашим label и imageView

override func numberOfSectionsInTableView(tableView: UITableView) -> Int {
// #warning Incomplete implementation, return the number of sections
return 1
}

override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
// #warning Incomplete implementation, return the number of rows
return someNewsCore.count
}


override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

let cell = tableView.dequeueReusableCellWithIdentifier("mainCell", forIndexPath: indexPath) as! MainTableViewCell

let fnews = someNewsCore[indexPath.row]

cell.mainTitleNews.text = fnews.title

cell.mainDateNews.text = fnews.data

cell.mainViewNews.text = fnews.view

cell.mainImageNews.image = UIImage(data: fnews.image!)

cell.mainImageNews.layer.cornerRadius = cell.mainImageNews.frame.size.height / 2

cell.mainImageNews.clipsToBounds = true

return cell
}
👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

все получилось вот так:

let obj = try? moContext.executeFetchRequest(request)

if let results = obj {

if results.count > 0 {

let match = results[0] as! News

news2.id = match.valueForKey("id") as? String
} else {

do {
try moContext.save()
} catch {
fatalError("Failure to save context: \(error)")
}

//Вставляем все после получения изображения к новости и все work perfect!

Всем спасибо и удачного вечера

эмм. В новом АПИ для iOS 9 есть новые возможности по кордате. Там что-то было про сырые объекты и так далее. А так же про уже существющие объекты, и что уже типа не всегда нужно сначала проверять, существует ли такой в базе. Видео смотрел с ВВДС2015 — пока сам в тонкости не вникал. Но по идее пока работа так — если хочешь что-то новое записать в базу, для начала выполняется поиск и если найден объект — то его падейтим и сохраняем, а если не найден, то создаём новый и сохраняем.

Программирование это для меня хобби, нравиться мне вся эта IT тематика. Хочу научиться, есть опыт стартапера, желание, вот только не все так просто с программированием)

Ребят, а можно чуток подробней.

как и для чего сделать load? Объекты FNews это массив с заголовком, текстом, картинкой, датой и id новости.

Пробовал вот так:

let request = NSFetchRequest(entityName: «FNews»)
let predicate = NSPredicate(format: «id == %@», idJson)
request.predicate = predicate

вставлял этот код перед сохранением, но че то не сработало, вообще не сильно понимаю этот механизм, мы достаем из core data entity которое нам нужно и в нем ищем id совпадет или нет, потом берем присваиваем это запросы и ... и с этого хз.

Подскажите?

“let request = NSFetchRequest(entityName: ‘FNews’)
let predicate = NSPredicate(format: ‘id == %@’, idJson)
request.predicate = predicate”
let arrayOfEntities = <yourManObjContext>.executeFetchRequest(request)
if !arrayOfEntities.isEmpty
{
//тут берёшь уже существующий объект и записываешь в него, то тебе надо
}
else{
let newObject =  контекст . инсерт нью энтити....
}

do {

try moContext.save()

А ты сначала load делать не пробовал??? Оо

Не директорське то діло — добриво кодити)

ну і по ділу — чим відрізняються ваші обєкти FNews ? Напевно у них є якісь унікальний ідентифікатор ? Як зробити NSFetchRequest з фільтром по цьому ідентифікатору і при потребі зробити апедейт ?

Не директорське то діло — добриво кодити)
absolutely :)
горедата горедатой, но принципы CRUD там так же работают как и обычной БД,
потому как по факту там работа SQLite

о, чувак, ми здається з тобою працювали в одній компаніНейм на осокорках чи я перепутав ?

Ага, было дело :)))
Вродь фюрэр-тимлид сожрал нас :)))

хехех, да я чуствував шо толкові люди там надовго не затримуються

Тащить Тотошкин проект было тем еще счастьем, чудеса ПМ тоже местами радовали, а потом вдруг оказалось что есть только еще один ответственный проект, и я ничо то и не умею чтоб меня приняли в ряды избранных :)))
Там остался вроде джуник из Хрякова, если они им не закусили напоследок :)))

Используй теги, Люк! Совершенно нечитаемо ж...

Все исправил)

Підписатись на коментарі