swift - Realm 结果中的属性为零

标签 swift realm

我不明白为什么我无法打印出 Realm 结果的属性。当我打印existingCart[i].${property}时,它总是给我所有迭代i的默认值。

语句print(existingCart)没有问题。它包含属性中的非默认值。它返回:

    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
    }
}

这是产品类别:

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)
    }
}

最佳答案

您在 Product 类的声明中犯了一个小错误,这只是使用 Realm 时的一个常见问题。

如果您回顾文档中的所有 Realm 示例,您会发现每个成员字段都应声明为更正后的字段:

@objc dynamic var itemImage = Data()

是的,您错过了每个属性的dynamic修饰符。返回并将其添加到每个属性中,它应该就会开始工作。为了完整起见,这应该是属性声明:_

// 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 需要拦截属性访问以实际询问数据库并检索属性的值。如果您尝试查看调试器中的对象,您可以看到与您的问题相同的效果 - 它只是充满了默认值。

关于swift - Realm 结果中的属性为零,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56215616/

相关文章:

swift - 基于 uid 交叉 randomKey 从 firebase 获取数据的好解决方案

ios - Swift,在键盘后面移动内容不会在关闭后重置

ios - 使用 Swift 3 #keyPath 引用 UIView 子类 .center

ios - 如何使用 cocoapod 包含 ios 应用程序和 watch 扩展的共享框架

java - RealmObject 中的 RealList 不会自动加载

swift - dyld : Library not loaded: @rpath/RxSwift. 框架/RxSwift

swift - 无法使用 Fairplay HLS 从 AVPlayer 获取视频缩略图

Android Realm.io 迁移 : Fallback to . deleteRealmIfMigrationNeeded()

android - 使用 RxJava 测试 Android Realm - "opened from a thread without a Looper"异常

ios - LinkingObject 的用法