Ios 核心数据获取数据并查找重复数据
我想从核心数据中提取数据并寻找副本,然后只保存数据,这样就不会有电影ID的副本。 也许有人能帮我 如何将结果与movieid字符串进行比较Ios 核心数据获取数据并查找重复数据,ios,swift,core-data,Ios,Swift,Core Data,我想从核心数据中提取数据并寻找副本,然后只保存数据,这样就不会有电影ID的副本。 也许有人能帮我 如何将结果与movieid字符串进行比较 let request = NSFetchRequest<NSFetchRequestResult>(entityName: "MovieData") //request.predicate = NSPredicate(format: "movieid = %@", movieID) request.returns
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")
}
let request=NSFetchRequest(entityName:“MovieData”)
//request.predicate=NSPredicate(格式:“movieid=%@”,movieid)
request.returnsObjectsAsFaults=false
做{
let result=try context.fetch(请求)
对于结果中的数据![NSManagedObject]{
打印(data.value(forKey:“movieid”)为!字符串)
}
}抓住{
打印(“失败”)
}
在核心数据中保存时,您需要创建谓词,并在其中检查是否已使用相同的“movieid”保存了值,然后必须对其进行更新,这样您就不会有重复的数据。请参考该方法,并尝试使用相同的方法将值保存在DB中。这样,重复的值将不会保存在DB中
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.")
}
}
class func insertupdaterecord(电影ID:String,上下文:NSManagedObjectContext)
{
让entityDescription=NSEntityDescription.entity(在:上下文中,名为“电影”)
让pred=NSPredicate(格式:“movieid=%@”,movieid)
let fetchRequest=NSFetchRequest(entityName:“电影”)
fetchRequest.entity=entityDescription
fetchRequest.predicate=pred
让result=try!(context.fetch(fetchRequest)作为NSArray.lastObject
让我们更新InsertInfo:电影
如果结果为!=nil
{
updateInsertInfo=结果为!电影
}
其他的
{
打印(“未找到记录!”)
}
做
{
尝试context.save()
}
将let错误捕获为NSError
{
打印(“在数据库中保存\(错误)时出错。”)
}
}
为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")
}
var选择:[String]=[]
let request=NSFetchRequest(entityName:“MovieData”)
request.returnsObjectsAsFaults=false
做{
let result=try context.fetch(请求)
对于结果中的数据![NSManagedObject]{
guard let movieId=data.value(forKey:“movieId”)作为?字符串else{
context.delete(data)//或以您希望的方式处理此情况
持续
}
如果选择.contains(电影ID){
context.delete(数据)
}否则{
选择。追加(电影ID)
}
}
尝试context.save()
}抓住{
打印(“失败”)
}
差不多了。应用谓词仅获取具有特定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)
}
let request=NSFetchRequest(entityName:“MovieData”)
request.predicate=NSPredicate(格式:“movieid=%@”,movieid)
做{
let result=try context.fetch(请求)
如果结果是空的{
让newMovie=NSEntityDescription.insertNewObject(forEntityName:“MovieData”,插入:context)作为!MovieData
newMovie.movieid=movieid
尝试context.save()
}
}抓住{
打印(错误)
}