#ios #swift #core-data #swift4.2
#iOS #swift #core-данные #свифт4.2
Вопрос:
я добавил этот код для поиска через product_id в coredata, но он возвращает все записи, которые я хочу просто получить конкретные данные из строки, которые содержат этот product_id
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "CartEntity")
let predicate = NSPredicate(format: "product_id == %@", "(Product_id)")
request.predicate = predicate
request.fetchLimit = 1
do{
let count = try managedContext.count(for: request)
if(count == 0){
// no matching object
print("no")
self.savecoredata()
}
else{
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "CartEntity")
request.returnsObjectsAsFaults = false
do {
let result = try managedContext.fetch(request)
for dataresult in result as! [NSManagedObject] {
let userName = dataresult.value(forKey: "proname") as! String
let age = dataresult.value(forKey: "price") as! String
print("User Name is : " userName " and price is : " age)
print(datastored)
}
} catch {
print("Fetching data Failed")
}
print("yes")
// deleteFeed(id: "(Product_id)")
// first delete old and than insert new id
}
}
catch let error as NSError {
print("Could not fetch (error), (error.userInfo)")
}
Ответ №1:
Проблема в том, что у вас есть разные запросы, сначала вы используете один с предикатом, а затем используете один без предиката, который вернет все строки. Либо повторно используйте предикат и для второго запроса, либо, что еще лучше, пропустите первый count
запрос, который кажется ненужным, и выполните только второй
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "CartEntity")
request.returnsObjectsAsFaults = false
request.predicate = NSPredicate(format: "product_id == %@", "(Product_id)")
do {
let result = try managedContext.fetch(request)
for dataresult in result as! [NSManagedObject] {
//... rest of code
Комментарии:
1. Этот небольшой блок кода решил мою проблему и спас весь мой день
Ответ №2:
Прежде всего, используйте предикат первого запроса, а во-вторых, используйте конкретный запрос на выборку, чтобы вернуть фактический NSManagedObject
подкласс. Преимущество заключается в том, чтобы получать значения непосредственно с помощью точечной нотации, а не с помощью подверженного ошибкам KVC (кодирование ключ-значение).
Это соответствующая логика всего вашего кода, однако savecoredata
строка кажется бессмысленной
let request : NSFetchRequest<CartEntity> = CartEntity.fetchRequest()
request.predicate = NSPredicate(format: "product_id == %ld", Product_id)
do {
if let result = try managedContext.fetch(request).first {
let userName = result.proname
let price = result.price
print("User Name is : (userName) and price is : (price)")
} else {
// no matching object
print("no")
self.savecoredata()
}
} catch {
print(error)
}
Ответ №3:
Похоже, проблема связана с вашим предикатом. Проверьте, является ли product_id
строка или целое число. Если вы выполняете кастинг, примените формат "%d", "%ld"
let request = NSFetchRequest<NSFetchRequestResult>(entityName: "CartEntity")
let predicate = NSPredicate(format: "product_id = (Product_id)")
request.predicate = predicate
request.fetchLimit = 1
var count = 0
do{
count = try managedContext.count(for: request)
}
catch let error {
print("Could not fetch (error), (error.localizedDescription)")
}
guard count != 0 else {
// no matching object
print("no")
self.savecoredata()
return
}
// remove predicate, which is actually not required.
request.predicate = nil
request.returnsObjectsAsFaults = false
do {
let result = try managedContext.fetch(request)
for dataresult in result as! [NSManagedObject] {
let userName = dataresult.value(forKey: "proname") as! String
let age = dataresult.value(forKey: "price") as! String
print("User Name is : " userName " and price is : " age)
print(datastored)
}
} catch let error {
print("Fetching data Failed - (error)")
}
print("yes")
// deleteFeed(id: "(Product_id)")
// first delete old and than insert new id