Основные данные, выбирающие данные и ищущие дубликаты - PullRequest
0 голосов
/ 18 сентября 2018

Я хочу получить данные из данных Core и найти дубликаты, а затем только сохранить данные, тогда дубликат фильма не будет найден.Может быть, кто-нибудь может мне помочь ..

Как я могу сравнить результат со строкой movieid?

let request = NSFetchRequest<NSFetchRequestResult>(entityName: "MovieData")
        //request.predicate = NSPredicate(format: "movieid = %@", movieID)
        request.returnsObjectsAsFaults = false
        do {
            let result = try context.fetch(request)
            for data in result as! [NSManagedObject] {
               print(data.value(forKey: "movieid") as! String)
          }

        } catch {

            print("Failed")
        }

Ответы [ 3 ]

0 голосов
/ 18 сентября 2018

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

var selection: [String] = []
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "MovieData")

request.returnsObjectsAsFaults = false
do {
    let result = try context.fetch(request)
    for data in result as! [NSManagedObject] {
        guard let movieId = data.value(forKey: "movieid") as? String else {
            context.delete(data) // or however you want to handle this situation
            continue
        }
        if selection.contains(movieId) {
            context.delete(data)
        } else {
            selection.append(movieId)
        }
    }
    try context.save()
} catch {
    print("Failed")
}
0 голосов
/ 18 сентября 2018

Почти.Примените предикат, чтобы получить только запись с конкретным movieID.Однако предполагается, что movieID является объектом (NSNumber), если это скаляр Int, вы должны использовать %ld в качестве заполнителя.

Если выборка возвращает пустой массив, дубликатов нети вы можете вставить новый объект

let request = NSFetchRequest<NSManagedObject>(entityName: "MovieData")
request.predicate = NSPredicate(format: "movieid = %@", movieID)
do {
    let result = try context.fetch(request)
    if result.isEmpty {
        let newMovie = NSEntityDescription.insertNewObject(forEntityName: "MovieData", into: context) as! MovieData
        newMovie.movieid = movieID
        try context.save()
    }      
} catch {
    print(error)
}
0 голосов
/ 18 сентября 2018

При сохранении в основных данных вам нужно создать предикат, и там вы должны проверить, есть ли значения, уже сохраненные с тем же «movieid», тогда его необходимо обновить, таким образом у вас не будет дублирующихся данных.Пожалуйста, обратитесь к методу и попробуйте использовать его для сохранения значений в БД.Таким образом, дубликаты не будут сохранены в БД

class func insertupdaterecord (movieID:String, context: NSManagedObjectContext)
{
    let entityDescription = NSEntityDescription.entity(forEntityName: "movie", in: context)
    let pred = NSPredicate(format: "movieid = %@", movieID)

    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "movie")
    fetchRequest.entity    = entityDescription
    fetchRequest.predicate = pred

    let result = try! (context.fetch(fetchRequest) as NSArray).lastObject
    let updateInsertInfo : movie

    if result != nil
    {
        updateInsertInfo               = result as! movie
    }
    else
    {
        print("Record not found!")
    }
    do
    {
        try context.save()
    }
    catch let error as NSError
    {
        print("Error while saving \(error) in database.")
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...