Область - Как удалить объекты без каких-либо связанных объектов? - PullRequest
0 голосов
/ 08 июля 2019

В моем приложении я загружаю сохраненные данные из Realm, а затем вызываю API для получения самого текущего состояния объектов пользователя. После этого я фильтрую, какие объекты являются новыми, а какие следует удалить, например:

// tracks is an array of objects downloaded from API and passed to the method
    let result = realm.objects(RealmTrack.self)

    print("Discovering new tracks")
    // Discover new tracks
    let new = tracks.filter({ track in
        !result.contains(where: { $0.trackUid == track.trackUid })
    })

    print("Discovering old tracks")
    // Discover old tracks in database
    let old = result.filter({ track in
        !tracks.contains(where: { $0.trackUid == track.trackUid })
    })

Затем я выполняю транзакцию записи в область, она проходит без ошибок.

    print("Modifying database")
        try realm.write {
            //realm.create(RealmTrack.self, value: realms, update: .modified)
            realm.add(realms, update: Realm.UpdatePolicy.modified)
            //realm.add(realms)
            realm.delete(old)
        }

Моя проблема в том, что каждый RealmTrack может иметь другие связанные объекты Realm:

dynamic var _primaryAlbum: RealmAlbum?

dynamic var _primaryArtist: RealmArtist?

И оба RealmAlbum и RealmArtist имеют список RealmTrack объектов:

let tracks = List<RealmTrack>()

После удаления старых треков, как я могу получить оставшиеся RealmAlbum и RealmArtist, которые не имеют связанных с ними RealmTrack? Я тоже должен их удалить

То, что я пробовал, это сразу после блока записи транзакции, проверить, какие объекты имеют пустой список, но, что удивительно, это всегда 0:

//realm.objects(RealmAlbum.self).count always returns 0 here
        let invalidatedAlbums = realm.objects(RealmAlbum.self).filter {
            $0.tracks.count == 0
            //$0.isInvalidated == true
        }

        let invalidatedArtists = realm.objects(RealmArtist.self).filter {
            $0.tracks.count == 0
            //$0.isInvalidated == true
        }

        try realm.write {
            realm.delete(invalidatedAlbums)
            realm.delete(invalidatedArtists)
        }

РЕДАКТИРОВАТЬ: Добавлены объявления класса

RealmTrack

@objcMembers class RealmTrack: Object, AWTrack {

        dynamic var _source: String = ""
        var source: AWMediaSource {
            return AWMediaSource(rawValue: _source)!
        }

        dynamic var _trackName: String = ""
        var trackName: String {
            return _trackName
        }

        dynamic var _trackUid: String = ""
        var trackUid: String {
            return _trackUid
        }

        dynamic var _playableUrl: String? = ""
        var playableUrl: String? {
            return _playableUrl
        }

        dynamic var _duration: TimeInterval = 0
        var duration: TimeInterval {
            return _duration
        }

        dynamic var _albumTrackNumber: Int = 0
        var albumTrackNumber: Int {
            return _albumTrackNumber
        }

        dynamic var _localizedTitle: String = ""
        var localizedTitle: String {
            return _localizedTitle
        }

        dynamic var _localizedAlbumTitle: String = ""
        var localizedAlbumTitle: String {
            return _localizedAlbumTitle
        }

        dynamic var _localizedAlbumArtist: String = ""
        var localizedAlbumArtist: String {
            return _localizedAlbumArtist
        }

        dynamic var _localizedArtist: String = ""
        var localizedArtist: String {
            return _localizedArtist
        }

        dynamic var _albumUid: String = ""
        var albumUid: String {
            return _albumUid
        }

        dynamic var _artistUid: String = ""
        var artistUid: String {
            return _artistUid
        }

        dynamic var _primaryAlbum: RealmAlbum?
        var primaryAlbum: AWAlbum? {
            return _primaryAlbum
        }

        dynamic var _primaryArtist: RealmArtist?
        var primaryArtist: AWArtist? {
            return _primaryArtist
        }

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

RealmAlbum

@objcMembers class RealmAlbum: Object, AWAlbum {

dynamic var _source: String = ""
var source: AWMediaSource {
    return AWMediaSource(rawValue: _source)!
}

dynamic var _albumName: String = ""
var albumName: String {
    return _albumName
}

dynamic var _albumUid: String = ""
var albumUid: String {
    return _albumUid
}

dynamic var _artistName: String = ""
var artistName: String {
    return _artistName
}

let tracks = List<RealmTrack>()

dynamic var _primaryArtist: RealmArtist?
var primaryArtist: AWArtist? {
    return _primaryArtist
}

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

RealmArtist

@objcMembers class RealmArtist: Object, AWArtist {

dynamic var _source: String = ""
var source: AWMediaSource {
    return AWMediaSource(rawValue: _source)!
}

dynamic var _artistUid: String = ""
var artistUid: String {
    return _artistUid
}

dynamic var _artistName: String = ""
var artistName: String {
    return _artistName
}


let tracks = List<RealmTrack>()

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

1 Ответ

0 голосов
/ 08 июля 2019

Полный объем вопроса немного неясен для меня, поэтому я, возможно, не совсем понимаю, о чем идет речь, поэтому позвольте мне попытаться ответить на этот вопрос:

Как я могу запросить объекты, которые не имеют ничего в свойстве списка.

Если у вас есть объект, у которого есть свойство списка других объектов, например:

class PersonClass: Object {
   @objc dynamic var person_name = ""
   let dogs = List<DogClass>()
}

class DogClass: Object {
   @objc dynamic var dog_name = ""
}

и предположим, что у вас есть человек с двумя собаками в списке, а затем человек без собак в списке. Ваша цель - опросить всех людей, у которых в списке нет собак.

let personResults = realm.objects(PersonClass.self).filter("dogs.@count == 0")

@ count - агрегатное выражение, поддерживаемое в свойствах List и Results.

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