#swift #core-data #duplicates
Вопрос:
Я хочу избежать дублирования в моих основных данных swift. У меня есть ощущение, что это должно быть сделано делегатом в приложении, но я не уверен, что должно измениться.
Вот мой код, когда я добавляю новый элемент:
@IBAction func buttonClicked(_ sender: UIBarButtonItem) {
let fetchRequest: NSFetchRequest<Bookmarks> = Bookmarks.fetchRequest()
let bookmark = Bookmarks(context: context)
if bookmarkButton.image == UIImage(systemName: "bookmark") {
bookmarkButton.image = UIImage(systemName: "bookmark.fill")
bookmark.urlToImage = urlImage
bookmark.source = sourceName
bookmark.titleName = titleName
bookmark.urlLink = url
bookmarks.append(bookmark)
} else {
bookmarkButton.image = UIImage(systemName: "bookmark")
if fetchRequest.predicate == NSPredicate.init(format: "titleName == %@", titleName!){
print(bookmark)
do {
let objects = try context.fetch(fetchRequest)
for object in objects {
context.delete(object)
}
try context.save()
} catch _ {
// error handling
}
}
}
do {
try context.save()
} catch {
}
}
Вот фотография моего приложения с дублированием:
Если вы знаете что-нибудь о том, как решить эту проблему, помогите мне, заранее спасибо
Комментарии:
1. Пожалуйста, перестаньте публиковать один и тот же вопрос снова и снова. Этот вопрос нуждается в дополнительной информации. Опубликуйте код, как и где вы вставляете новый элемент. Вы должны проверить наличие дубликата, прежде чем вставлять новый элемент.
2. @vadian Я понял, что мне нужно проверить, прежде чем добавлять элемент, но я спрашиваю, как проверить этот элемент на наличие? Я просмотрел несколько веб-сайтов, но они не подходят для моего случая
3. @bahtovarumarov вы не должны проверять, равны ли два изображения. Есть много способов избежать этого сравнения
Ответ №1:
Перед вставкой нового элемента проверьте titleName
, существует ли уже такой элемент. Если нет, вставьте новый элемент.
Что-то вроде этого
@IBAction func buttonClicked(_ sender: UIBarButtonItem) {
let fetchRequest: NSFetchRequest<Bookmarks> = Bookmarks.fetchRequest()
fetchRequest.predicate = NSPredicate(format: "titleName == %@", titleName!)
if (try? context.fetch(fetchRequest))?.first != nil {
bookmarkButton.image = UIImage(systemName: "bookmark.fill")
} else {
let bookmark = Bookmarks(context: context)
bookmarkButton.image = UIImage(systemName: "bookmark")
bookmark.urlToImage = urlImage
bookmark.source = sourceName
bookmark.titleName = titleName
bookmark.urlLink = url
bookmarks.append(bookmark)
do {
try context.save()
} catch {
print(error)
}
}
}
Если элемент не может быть однозначно идентифицирован по названию, добавьте дополнительные условия к предикату.
Комментарии:
1. да, это помогает при дублировании, но я хотел бы также добавить контекст.удалить(закладку), если кнопка bookmarkButton.image == UIImage(системное имя: «закладка»)