我有一个tableview,它使用Core Data显示String类型的对象列表,用户可以在这里继续向同一个表添加新对象。但是有一个限制,不允许添加重复项。我设法避免重复,例如:“银行”/“银行”。问题是我还需要阻止这样的重复:“Bank”/“bAnk”或“Bank”/“BAnk”等等,但我不知道如何做到这一点。
这是我的代码:
func checkDuplicates(catName: String) -> Bool {
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext
var contents = [NSManagedObject]()
var items = [String]()
let fetchRequest = NSFetchRequest(entityName: "Categories")
do {
let results = try managedContext.executeFetchRequest(fetchRequest)
contents = results as! [Items]
for item in contents {
items.append(item.valueForKey("name") as! String)
}
} catch {
print("error")
}
if items.contains(catName) {
return true
}
return false
}
它返回一个Bool,这样当它返回一个副本时,我会显示一个Alert,告诉用户他可以添加一个副本。
所以任何人都可以帮助我吗?
答案 0 :(得分:4)
无需获取所有对象以检查现有的Core Data对象。您可以创建获取请求 使用谓词搜索具有给定名称的对象:
let fetchRequest = NSFetchRequest(entityName: "Categories")
fetchRequest.predicate = NSPredicate(format: "name ==[c] %@", catName)
此处==[c]
代表不区分大小写的比较。
实际上,您根本不需要获取对象。您可以
使用countForFetchRequest()
检查匹配的对象:
var error : NSError? = nil
let count = managedContext.countForFetchRequest(fetchRequest, error: &error)
if count == NSNotFound {
print("error:", error!.localizedDescription)
return false
} else if count >= 1 {
return true
} else {
return false
}
这更有效,因为执行了获取请求 作为SQLite级别的“SELECT COUNT ...”查询,无需提取 对象进入记忆。
答案 1 :(得分:1)
您可以对字符串进行小写以进行比较,以避免出现区分大小写的问题:
let Item_Name = item.valueForKey("name") as! String
items.append(Item_Name.lowercaseString);
和
if items.contains(catName.lowercaseString) {
return true
}
答案 2 :(得分:1)
您可以为contains
方法指定自定义逻辑。看
let animals = ["Dog", "Cat", "Fish"]
let newAnimal = "dog"
let duplicate = animals.contains { $0.lowercaseString == newAnimal.lowercaseString }
print(duplicate) // true