Как добавить элементы в соответствующую родительскую категорию с помощью realm, swift - PullRequest
0 голосов
/ 28 октября 2019

Как добавить элементы, когда я выбираю в dropDown, который я могу отобразить список категорий, и я могу выбрать его, но как связать этот связанный элемент с родительским классом и сохранить его.

Форма категории: -

import Foundation
import RealmSwift

class CategoryForm : Object {

@objc dynamic var categoryName : String = ""

let items = List<Items>()  

}

Класс товара: -

import  RealmSwift

class Items: Object {
   @objc dynamic var id = UUID().uuidString
   @objc dynamic var itemName : String = ""
   @objc dynamic var price : Int64 = 0

   var parentCategory = LinkingObjects(fromType: CategoryForm.self, property: "items")
   override class func primaryKey() -> String? {
       return "id"
      }
   }

enter image description here

Здесь, когда я выбираю категорию, мне нужно показать.

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

ItemViewController: -

 var itemArray = ItemVaraible.itemArry
 var categories = CategoryVaraible.categoryArray
 var idVar: String?         
    func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        categoryType.setTitle("\(categories![indexPath.row].categoryName)", for: .normal)
        animated(toogle: false)
           }

     @IBAction func saveAction(_ sender: UIButton) {
         let newArray = Items()
         newArray.itemName = itemName.text!//These two title and done are from core data entity
         let price = Int64(itemPrice.text!)
         newArray.price = price!
         if saveFlag == true {
              self.saveItems(category: newArray)
           } else {
              newArray.id = idVar!
              self.updateItems(category: newArray)//update
        }

      self.navigationController?.popViewController(animated: true)
     }
  }

     func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
        categoryType.setTitle("\(categories![indexPath.row].categoryName)", for: .normal)
        animated(toogle: false)
     }


     func saveItems(category: Items) {
          do{
            try realm.write {//Save/Create
            realm.add(category)
              }
            }catch {
             print("Error in saving \(error)")
             }
       }

      func updateItems(category: Items) {
         do{
            try realm.write {//Save/Create
            realm.add(category, update: .modified)
               }
             }catch {
               print("Error in saving \(error)")
               }
             }
       //Read the data after saving like displying again
         func displayItems() {
            itemArray = realm.objects(Items.self)
            }
         func displayCategories() {
            categories = realm.objects(CategoryForm.self)
             tableview.reloadData()
            }

1 Ответ

0 голосов
/ 29 октября 2019

Я думаю, вы спрашиваете, как добавить новый объект ItemClass к существующему ClassClass.

Во-первых, вы должны использовать первичные ключи для идентификации ваших предметов и категорий

class CategoryClass: Object {
   @objc dynamic var category_id = NSUUID().uuidString
   @objc dynamic var categoryName : String = ""
   let items = List<ItemClass>()

    override static func primaryKey() -> String? {
        return "category_id"
    }
}

то же самое с вашим ItemClass

class ItemClass: Object {
   @objc dynamic var item_id = NSUUID().uuidString
   @objc dynamic var itemName : String = ""
   @objc dynamic var price : Int64 = 0

   var parentCategory = LinkingObjects(fromType: CategoryClass.self, property: "items")
}

Похоже, вы пытаетесь сохранить класс var вашей категории

var categories = CategoryVaraible.categoryArray //not sure what this is

, но не делайте этоговыполните это

var categoryResults = Results<CategoryClass>? = nil

и используйте categoryResults в качестве источника данных для вашего tableView.

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

func saveItemToCategory() {
   let category = self.categoryResults[selectedIndexInPopup]
   let item = ItemClass()
   item.itemName = some_item_name
   item.price = some_item_price

   try realm.write {
      category.items.append(item)
   }
}
...