Предотвращение дублирования основных данных swift

#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(системное имя: «закладка»)