2015-10-20 2 views
1

установки: IOS 9, Swift, Xcode 7.1 BetaДобавление и удаление CoreData на основе поискового запроса значения атрибута

Цель заключается в создании корзины функционально, для которых мне нужно уникальные значения в CoreData.

У меня есть UITableView, в котором данные (название, стоимость, количество, идентификатор) загружаются из бэкэнда Parse. Каждая пользовательская ячейка TableView имеет кнопку, нажимающую, которая сохраняет выбранные данные строки в CoreData.

Я не хочу иметь дубликат продукта в корзине, поэтому перед сохранением я хочу проверить, есть ли у корзины продукт. Если это так, я хочу заменить тележку на данные, отобранные в данный момент. Если нет, просто добавьте новый товар в корзину.

Установка My CoreData проста.

имя Entity = Корзина

Атрибуты = PNAME (тип String), pCost (тип Int), pQuantity (тип Int), идентификатор заказа (тип String)

Добавить продукт в Код корзины корзины выглядит так:

// Product data is retrieved in these variable 
var pNam = NSMutableArray() 
var pCost = NSMutableArray() 
var pQty = NSMutableArray() 
var pObjectID = NSMutableArray() 

// Add to Cart button .... 
    let indexPath = NSIndexPath(forRow: sender.tag, inSection: 0) 
    let cell = tableView.cellForRowAtIndexPath(indexPath) as! ProductMenuTableViewCell! // Custom cell in which the button add to Cart button is placed 

     let entityDescription = NSEntityDescription.entityForName("Cart", inManagedObjectContext: managedObjectContext!) 
     let cart = Cart(entity: entityDescription!, insertIntoManagedObjectContext: managedObjectContext) 

     cart.pName = pNam[indexPath.row].description 
     cart.pCost = pCst[indexPath.row].integerValue! 
     cart.pQuantity = pQty[indexPath.row].integerValue! 
     cart.orderID = pObjectID[indexPath.row].description 

     var error: NSError? 

     do { 
      try managedObjectContext?.save() 
     } catch let error1 as NSError { 
      error = error1 
     } 

     if let err = error { 
      print(err.localizedFailureReason) 
     } else { 
      print("Saved") 
     } 

Должен ли я напрямую использовать ячейку для добавления значений в CoreData? Например: cart.pName = cell.pName.text! или есть лучший способ сделать это? Кто-нибудь знает, как это решить?

ответ

0

Вам необходимо найти существующий объект Cart с правильным именем; если нет соответствующей корзины, то создайте новую. Что-то вроде этого:

var cart : Cart 
    let requiredName = pNam[indexPath.row].description 
    let entityDescription = NSEntityDescription.entityForName("Cart", inManagedObjectContext: managedObjectContext!) 
    let fetchRequest = NSFetchRequest() 
    fetchRequest.entity = entityDescription! 
    fetchRequest.predicate = NSPredicate(format:"pName == %@",requiredName) 
    do { 
     let results = try self.managedObjectContext?.executeFetchRequest(fetchRequest) as! [Cart] 
     if results.count == 0 { // not found, so create new... 
      cart = Cart(entity: entityDescription!, insertIntoManagedObjectContext: managedObjectContext) 
      cart.pName = requiredName 
     } else { // found at least one, so use the first... 
      cart = results[0] 
     } 
     // Now update the other attribute values: 
     cart.pCost = pCst[indexPath.row].integerValue! 
     cart.pQuantity = pQty[indexPath.row].integerValue! 
     cart.orderID = pObjectID[indexPath.row].description 
    } catch { 
     print("Error fetching") 
    } 

Что касается вашего вопроса вторичного, лично я хотел бы использовать свой текущий подход: использовать строку в качестве индекса на ваше DATASOURCE массивов, то есть не напрямую использовать значение из лейбл клеточных и т.д.

+0

Не могли бы вы рассказать мне, почему метод indexPath лучше, чем метод меток ячейки? Любые плюсы и минусы? Спасибо за код, я скоро его проверю и обновлю. –

+1

@VickyArora На практике я уверен, что использование ярлыков ячеек можно заставить работать, но я думаю, что это немного не соответствует дизайну модели Apple Model-View-Controller (см. [Здесь] (https://developer.apple. ком/библиотека/ИОС/документация/Общие/Концептуальная/DevPedia-CocoaCore/MVC.html # // apple_ref/DOC/UID/TP40008195-CH32-SW1)). Пример того, что может пойти не так: предположим, что позже вы захотите создать интернационализированную версию своего приложения. Все метки должны быть переведены, тогда как ваши данные могут оставаться на базовом языке. Вам нужно будет «непереводить» метки в приведенном выше коде. – pbasdf

1

Ваша установка данных абсурдна. У вас есть 4 массива для 4 атрибутов объектов n. Если по какой-либо причине сортировка массива изменяется или элемент отбрасывается или добавляется, вы должны убедиться, что это происходит со всеми остальными массивами, кошмар для обслуживания! Как вы расширяете эту модель, если позже у вас есть 15 атрибутов. Использовать 15 массивов? Это совершенно безумие.

Вместо этого у вас должен быть массив объектов - идеально объектов Core Data - с соответствующими атрибутами, сгруппированными вместе. Вы всегда можете указать флаг, указывающий, что вы хотите отбросить эти элементы позже, а затем сохранить их в базе данных.

Теперь вам не нужно принимать решение о создании или обновлении: просто установите флаг удаления false.

+0

Не могли бы вы поделиться ссылкой?или пример кода? Я все еще новичок в программировании, и основные данные для меня совершенно новые. Я подумал о параметре массива по той же причине, что и вы, но я не смог увидеть тип массива в атрибутах. На данный момент я могу заставить все работать, но это долгая кривая обучения, чтобы знать правильный способ заставить все работать в мире программирования. Спасибо за ваше ценное предложение. Это действительно помогает. –

+0

Хм, я думаю, что это выходит за рамки этого вопроса. Возможно, лучшим советом будет сделать что-то более простое, если вы новичок в программировании. – Mundi

Смежные вопросы