繁体   English   中英

我应该使用存储库for Realm(ios)

[英]Should I use repository for Realm(ios)

首先,我在ios中相对较新,没有任何使用移动dbs的经验。

想要集成到我的应用程序Realm(swift),并想知道将服务层和存储库分开或者所有内容都包含在服务中是否有意义。

一些例子有一个很好的观点。

class UserService {

    var userRepository: UserRepository!

    func findById(userId: String) -> User? {
        return userRepository.findById(userId: userId)
    }
}

class UserRepository {

    private let realm = try! Realm()

    func findById(userId: String) -> User? {
        return realm.object(ofType: User.self, forPrimaryKey: userId)
    }
}

在数据库API顶部添加抽象层非常常见。 许多其他开发人员已经将Realm包装在他们自己的类中,以便将API隐藏在他们的业务逻辑代码中。

需要注意几个方面的考虑因素:

  1. 你需要保持小心,不要意外地伤害这种表现。 一些用户甚至将数据从Realm对象复制到他们自己的对象中。 这违背了Realm的“零拷贝”机制的目的,所以应用程序现在本身比本机使用Realm更糟糕。
  2. 这是“先发制人的工作”。 你事先做了很多工作, 以防万一你可能会改变主意。 我刚刚在一个相当大的应用程序中将Core Data转换为Realm,它只花了几个小时。 试图构建一个“通用”数据库解决方案,您可能永远不会最终使用它可能无法获得回报的声音。
  3. 您正在增加应用复杂性。 这意味着更多的漏洞可能需要更严格的测试,以确保您的API和数据库API保持同步。

只要您要移动的新数据库也包含管理对象(即核心数据),从一个数据库转换到另一个数据库通常不是很多工作。 因此,我建议在必要时避免不必要的工作。

免责声明:我为Realm工作,但这是我的观点,因为过去曾使用Core Data,原始SQLite和Realm发布个人应用程序。

您可以使用扩展来添加提取方法。 您可以为数据库中的每个实体添加Object子类,然后在需要时为这些方法添加扩展。 例:

import RealmSwift

// Dog model
class Dog: Object {
    dynamic var name = ""
    dynamic var owner: Person? // Properties can be optional
}

对于你的提取方法:

extension Dog {
    class func fetch(with name: String) -> Dog? {
        return try! Realm().objects(Dog.self).filter("name == %@", name).first
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM