Подзапросы / отношения в Realm Swift iOS - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть два объекта:

Account: Object {
    dynamic var id: String?
    dynamic var name: String?
    dynamic var valid: String?
}

Transaction: Object {
    dynamic var id: String?
    dynamic var desc: String?
    dynamic var accountId: String?
}

Я пытаюсь как-то связать два объекта, поэтому, когда я делаю запрос к «таблице» транзакций, я могу узнать, какие транзакции происходят от учетной записи valid.

. Я пытался связать их с let transactions = LinkingObjects(fromType: Transaction.self, property: "fromAccount") в объекте Account и делал обратное в объекте Transaction. Лучший результат, который я получаю - это пустой список или пустая запись.

Полагаю, следующий вопрос: есть ли способ сделать то, что я пытаюсь? Я также изучил подзапросы, но мне не повезло с ними (документация очень тонкая, как кажется для подзапросов).

В прошлом я делал, когда создавалась новая транзакция, он идет и получает полный объект учетной записи (используя accountId) и сохраняет его в этой записи, но я чувствую, что должен быть лучший способ. Конечно.

1 Ответ

0 голосов
/ 27 апреля 2020

Существует несколько решений, но ваш linkingObject - хороший вариант. Это действительно сводится к тому, какие запросы вы хотите выполнить.

Итак, давайте начнем с очень простого примера, который позволит вам запрашивать транзакции для любой, у которой есть родительский аккаунт, где valid - 'true' - это ответ на ваш вопрос.

class Account: Object {
    @objc dynamic var id: String?
    @objc dynamic var name: String?
    @objc dynamic var valid: String?
}

class Transaction: Object {
    @objc dynamic var id: String?
    @objc dynamic var desc: String?
    @objc dynamic var accountId: String?
    @objc dynamic var parent_account: Account?
}

затем создайте пару объектов

let a0 = Account()
a0.name = "account 0"
a0.valid = "true"

let a1 = Account()
a1.name = "account 1"
a1.valid = "false"

let t0 = Transaction()
t0.desc = "trans 0"

let t1 = Transaction()
t1.desc = "trans 1"

t0.parent_account = a0
t1.parent_account = a1

try! realm.write {
    realm.add([t0, t1])
}

после записи этих данных, если вы хотите транзакции, в которых действительное свойство parent_account == 'true'

let results = realm.objects(Transaction.self).filter("parent_account.valid == 'true'")

for account in results {
    print(account.desc)
}

и результат равен

Optional("trans 0")

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

Ох ... вероятно, превращение активного свойства в bool будет лучше, чем string.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...