Как получить конкретные данные строки в качестве словаря путем поиска в coredata

#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