领域中的属性结果为零
Properties in Realm results are nil
我不明白为什么我无法打印出我的领域结果的属性。当我打印 existingCart[i].${属性} 时,它总是给我所有迭代 i.
的默认值
语句print(existingCart)
没有问题。它在属性中包含非默认值。它returns:
Results<Product> <0x7fe5d8f3a770> (
[0] Product {
itemImage = <ffd8ffe0 00104a46 49460001 01000048 00480000 ffe10058 — 232200 total bytes>;
itemName = Ground Beef;
price = 6.53;
unit = 450 g;
quantity = 1;
isInCart = 0;
},
[1] Product {
itemImage = <ffd8ffe0 00104a46 49460001 01000048 00480000 ffe1004c — 153015 total bytes>;
itemName = Chicken Drumsticks;
price = 9.06;
unit = 1.25 kg;
quantity = 1;
isInCart = 0;
},
[2] Product {
itemImage = <ffd8ffe0 00104a46 49460001 01000048 00480000 ffe10058 — 242980 total bytes>;
itemName = Ground Turkey;
price = 6.91;
unit = 450 g;
quantity = 2;
isInCart = 0;
},
[3] Product {
itemImage = <ffd8ffe0 00104a46 49460001 01000048 00480000 ffe10058 — 224128 total bytes>;
itemName = Canned Beans;
price = 1.79;
unit = 398 mL;
quantity = 1;
isInCart = 0;
},
[4] Product {
itemImage = <ffd8ffe0 00104a46 49460001 01000048 00480000 ffe10058 — 252231 total bytes>;
itemName = Frosted Flakes;
price = 9.49;
unit = 1.06 kg;
quantity = 1;
isInCart = 0;
},
[5] Product {
itemImage = <ffd8ffe0 00104a46 49460001 01000048 00480000 ffe1004c — 165948 total bytes>;
itemName = Gouda Cheese;
price = 4.99;
unit = 300 g;
quantity = 1;
isInCart = 0;
}
)
这是我尝试从 Realm 加载数据的方式:
private func loadExistingCart() {
let realm = try! Realm()
let existingCart = realm.objects(Product.self)
print(existingCart) // see above
for i in 0..<existingCart.count {
print(existingCart[i].itemName) // empty string
print(existingCart[i].price) // 0.0
print(existingCart[i].quantity) // 0
print(existingCart[i].unit) // empty string
cart.addItem(existingCart[i]) // adds
}
}
这是产品 class:
import UIKit
import Foundation
import Realm
import RealmSwift
class Product : Object {
// MARK: Properties
@objc var itemImage = Data()
@objc var itemName: String = ""
@objc var price: Float = 0.0
@objc var unit: String = ""
@objc var quantity: Int = 0
@objc var isInCart: Bool = false
convenience init?(itemImage: UIImage?, itemName: String, price: Float, unit: String, quantity: Int, isInCart: Bool = false) {
self.init()
// itemName, unit, category should not be empty
guard (!itemName.isEmpty && !unit.isEmpty) else {
return nil
}
// price should not be a negative number
guard (price >= 0) else {
return nil
}
// Initialize stored properties
self.itemImage = UIImageJPEGRepresentation(itemImage!, 0.9)!
self.itemName = itemName
self.price = price
self.unit = unit
self.quantity = quantity
self.isInCart = isInCart
}
override class func primaryKey() -> String? {
return "itemName"
}
}
产品就是这样保存的
private func saveToCart(product: Product, update: Bool) {
let realm = try! Realm()
print(product)
try! realm.write {
realm.add(product, update: true)
}
}
我对 Realm 的工作方式还不够熟悉,无法说明为什么您似乎无法通过索引访问对象,但也许您可以尝试将它们作为 Sequence 的一部分访问?
let existingCart = realm.objects(Product.self)
for item in existingCart {
print(item.itemName)
print(item.price)
print(item.quantity)
print(item.unit)
}
你在那里的产品声明中犯了一个小错误 class,这只是使用 Realm 的一个常见问题。
如果您回顾一下文档中的所有 Realm 示例,您会发现每个成员字段都应声明为如下更正的字段:
@objc dynamic var itemImage = Data()
是的,您错过了每个属性的 dynamic
修饰符。返回并将其添加到每个 属性,它应该会开始工作。为了完整起见,这应该是属性 declaration:_
// MARK: Properties
@objc dynamic var itemImage = Data()
@objc dynamic var itemName: String = ""
@objc dynamic var price: Float = 0.0
@objc dynamic var unit: String = ""
@objc dynamic var quantity: Int = 0
@objc dynamic var isInCart: Bool = false
您可以google dynamic
关键字进行解释。它基于这样一个事实,即您拥有的对象只是数据库对象的代理,而 Realm 需要拦截 属性 访问以实际查询数据库并检索 属性 的值。如果您尝试查看调试器中的对象,您会看到与您的问题相同的效果 - 它只是充满了默认值。
我不明白为什么我无法打印出我的领域结果的属性。当我打印 existingCart[i].${属性} 时,它总是给我所有迭代 i.
的默认值语句print(existingCart)
没有问题。它在属性中包含非默认值。它returns:
Results<Product> <0x7fe5d8f3a770> (
[0] Product {
itemImage = <ffd8ffe0 00104a46 49460001 01000048 00480000 ffe10058 — 232200 total bytes>;
itemName = Ground Beef;
price = 6.53;
unit = 450 g;
quantity = 1;
isInCart = 0;
},
[1] Product {
itemImage = <ffd8ffe0 00104a46 49460001 01000048 00480000 ffe1004c — 153015 total bytes>;
itemName = Chicken Drumsticks;
price = 9.06;
unit = 1.25 kg;
quantity = 1;
isInCart = 0;
},
[2] Product {
itemImage = <ffd8ffe0 00104a46 49460001 01000048 00480000 ffe10058 — 242980 total bytes>;
itemName = Ground Turkey;
price = 6.91;
unit = 450 g;
quantity = 2;
isInCart = 0;
},
[3] Product {
itemImage = <ffd8ffe0 00104a46 49460001 01000048 00480000 ffe10058 — 224128 total bytes>;
itemName = Canned Beans;
price = 1.79;
unit = 398 mL;
quantity = 1;
isInCart = 0;
},
[4] Product {
itemImage = <ffd8ffe0 00104a46 49460001 01000048 00480000 ffe10058 — 252231 total bytes>;
itemName = Frosted Flakes;
price = 9.49;
unit = 1.06 kg;
quantity = 1;
isInCart = 0;
},
[5] Product {
itemImage = <ffd8ffe0 00104a46 49460001 01000048 00480000 ffe1004c — 165948 total bytes>;
itemName = Gouda Cheese;
price = 4.99;
unit = 300 g;
quantity = 1;
isInCart = 0;
}
)
这是我尝试从 Realm 加载数据的方式:
private func loadExistingCart() {
let realm = try! Realm()
let existingCart = realm.objects(Product.self)
print(existingCart) // see above
for i in 0..<existingCart.count {
print(existingCart[i].itemName) // empty string
print(existingCart[i].price) // 0.0
print(existingCart[i].quantity) // 0
print(existingCart[i].unit) // empty string
cart.addItem(existingCart[i]) // adds
}
}
这是产品 class:
import UIKit
import Foundation
import Realm
import RealmSwift
class Product : Object {
// MARK: Properties
@objc var itemImage = Data()
@objc var itemName: String = ""
@objc var price: Float = 0.0
@objc var unit: String = ""
@objc var quantity: Int = 0
@objc var isInCart: Bool = false
convenience init?(itemImage: UIImage?, itemName: String, price: Float, unit: String, quantity: Int, isInCart: Bool = false) {
self.init()
// itemName, unit, category should not be empty
guard (!itemName.isEmpty && !unit.isEmpty) else {
return nil
}
// price should not be a negative number
guard (price >= 0) else {
return nil
}
// Initialize stored properties
self.itemImage = UIImageJPEGRepresentation(itemImage!, 0.9)!
self.itemName = itemName
self.price = price
self.unit = unit
self.quantity = quantity
self.isInCart = isInCart
}
override class func primaryKey() -> String? {
return "itemName"
}
}
产品就是这样保存的
private func saveToCart(product: Product, update: Bool) {
let realm = try! Realm()
print(product)
try! realm.write {
realm.add(product, update: true)
}
}
我对 Realm 的工作方式还不够熟悉,无法说明为什么您似乎无法通过索引访问对象,但也许您可以尝试将它们作为 Sequence 的一部分访问?
let existingCart = realm.objects(Product.self)
for item in existingCart {
print(item.itemName)
print(item.price)
print(item.quantity)
print(item.unit)
}
你在那里的产品声明中犯了一个小错误 class,这只是使用 Realm 的一个常见问题。
如果您回顾一下文档中的所有 Realm 示例,您会发现每个成员字段都应声明为如下更正的字段:
@objc dynamic var itemImage = Data()
是的,您错过了每个属性的 dynamic
修饰符。返回并将其添加到每个 属性,它应该会开始工作。为了完整起见,这应该是属性 declaration:_
// MARK: Properties
@objc dynamic var itemImage = Data()
@objc dynamic var itemName: String = ""
@objc dynamic var price: Float = 0.0
@objc dynamic var unit: String = ""
@objc dynamic var quantity: Int = 0
@objc dynamic var isInCart: Bool = false
您可以google dynamic
关键字进行解释。它基于这样一个事实,即您拥有的对象只是数据库对象的代理,而 Realm 需要拦截 属性 访问以实际查询数据库并检索 属性 的值。如果您尝试查看调试器中的对象,您会看到与您的问题相同的效果 - 它只是充满了默认值。