致力于开发库存应用程序。我正试图在领域中保存多个对象

时间:2016-03-07 00:12:36

标签: ios arrays swift sorting realm

处理库存应用程序。第一个视图控制器是所有站点的表视图。用户可以向表中添加位置。该列表将显示“位置名称”和“位置地址”。用户点击tableview中的项目后,他们有4个不同的类别,他们可以选择上传网站的广告资源。例如:

位置名称:公司办公室 位置地址:纽约州纽约

库存选项 1.清洁产品 2.工具 3.电气 4.家电

我正在试图弄清楚如何布局领域对象来保存所选站点的数据。我理解“列表”是关系,但仍然试图抓住它。请参阅下面的我的领域代码。

import Foundation
import RealmSwift

class Location: Object {

    dynamic var siteName = ""
    dynamic var siteAddress: String? = nil 
}


class ApplianceLocation: Object {

    dynamic var itemName: String = ""
    dynamic var quantity: Int = 0

    let siteInfo = List<Location>()
}

1 个答案:

答案 0 :(得分:1)

您当前的型号允许同一设备具有多个位置,并且它在所有这些位置以相同的数量出现。我不认为这很好地描述了家电在现实中的表现。

因此,假设设备以及其他项目可以在不同位置以不同数量独立发生,具有如下所示的微小变化的模型已经适合描述:

class Location: Object {    
    dynamic var name = ""
    dynamic var address: String? = nil

    // Note: This is read-only. But it might become helpful
    // to navigate your model.
    var appliances: [Appliance] {
         return linkingObjects(Appliance.self, forProperty: "location")
    }
}

class Appliance: Object {
    dynamic var name: String = ""
    dynamic var quantity: Int = 0
    dynamic var location: Location? // just a single location
}

但是这样做的缺点是你需要使用反向链接从一个位置导航到放置在那里的所有设备。反向链接提供的方便性仍然不如链接的定义方向。 (注意:这是我们的待办事项清单,将在不久的将来解决。) 所以现在让我们试着颠倒定义的方向。

class Location: Object {    
    dynamic var name = ""
    dynamic var address: String? = nil
    let appliances = List<Appliance>()
}

class Appliance: Object {
    dynamic var name: String = ""
    dynamic var quantity: Int = 0
    var location: Location? {
         return linkingObjects(Location.self, forProperty: "appliances").first
    }
}

好的,但如果我们现在想要添加其他类别呢? 您可以为每个人添加另一个独立的Object课程和来自Location的多对多链接。

class Location: Object {    
    dynamic var name = ""
    dynamic var address: String? = nil
    let appliances = List<Appliance>()
    let cleaningProducts = List<CleaningProduct>()
    let tools = List<Tool>()
    // …
}

class CleaningProduct: Object {
    dynamic var name: String = ""
    dynamic var quantity: Int = 0
    var location: Location? {
         return linkingObjects(Location.self, forProperty: "cleaningProducts").first
    }
}

但是,你会复制很多代码,这使得维护模型变得更加困难,对变更的灵活性也会降低。 第一个想法可能是使用继承并引入中间Object子类Item,它定义属性namequantity。 虽然Realm一般支持一种继承映射形式,但它还不支持多态关系,所以这里不是一个真正的选择。 另一种方法可能是删除所有特定的类别子类,并在一个链接到类别的Item类上进行推广。如果没有其他要存储的属性,这会将CleaningProductApplianceTool区分开。

class Location: Object {
    dynamic var name = ""
    dynamic var address: String? = nil
    let items = List<Item>()
}

class Category: Object {
    /// e.g. Cleaning products, Tools, …
    dynamic var name = ""

    override class func primaryKey() -> String {
        return "name"
    }
}

class Item: Object {
    dynamic var name: String = ""
    dynamic var quantity: Int = 0
    dynamic var category: Category?
    var location: Location? {
         return linkingObjects(Location.self, forProperty: "location").first
    }
}

创建对象

以下代码显示了如何为最后提出的模型创建对象。

let realm = try! Realm()

// Create all our categories
let categoryNames = ["Cleaning Product", "Tools", "Electrical", "Appliance"]
try! realm.write {
for categoryName in categoryNames {    
    realm.create(Category.self, value: [ name: categoryName], update: true)  
}

// Add a first location
let loc1 = Location()
loc1.name = "ABC office"
loc1.address = "Infinite Loop 2, Cupertino, CA"
try! realm.write {
    realm.add(loc1)
}
print(loc1.items.count) // => 0

// Add an appliance to the just created location
let item1 = Item()
item1.name = "Vacuum cleaner"
item1.category = realm.objects(Category).filter("name = ?", "Appliance").first!
try! realm.write {
    loc1.items.add(item1)
}
print(loc1.items.count) // => 1

// Add a new location
let loc2 = Location()
loc2.name = "ABC office #2"
loc2.address = "1338 Hacker Way, Menlo Park, CA"
try! realm.write {
    realm.add(loc2)
}
print(loc2.items.count) // => 0