Mam obiekt realm (Swift), który istnieje w mojej aplikacji przez około rok. Model tego obiektu wygląda tak:

class ChatMessage: Object {

    @objc dynamic var messageId: Int = generateId()
    // other properties omitted

    override static func primaryKey() -> String? {
        return "messageId"
    }
}

Teraz, muszę skutecznie zmienić nazwę właściwości "Messageid" na "ID" i wykonaj "ID" klucz podstawowy. Muszę to zrobić, ponieważ potrzebuję tego obiektu, aby dostosować się do konkretnego protokołu (z ram, których nie kontroluję), a ten protokół określa, że potrzebuję właściwości ciągów "Messageid". Zmiana nazwy wydaje się być najbardziej prostym wyjaśnieniem, co próbuję zrobić, ale zdaję sobie sprawę, że może to również wyjaśnić, mówiąc, że chcę:

  1. Utwórz nowy właściwość "ID" (typu Int)
  2. Skopiuj istniejącą wartość "Messageid" do właściwości "ID" (podczas migracji)
  3. Zmień klucz podstawowy, aby użyć "ID" zamiast "Messageid"

W efekcie, czego chcę, aby obiekt wyglądał jak po zmianie:

class ChatMessage: Object {

    @objc dynamic var id: Int = generateId()
    // other properties omitted

    override static func primaryKey() -> String? {
        return "id"
    }
}

Mam zdefiniowany blok migracji i próbowałem kilku różnych sposobów osiągnięcia tego, ale do tej pory nie miałem szczęścia. Bez bloku migracyjnego otrzymuję następujące elementy w konsoli debugowania XCode:

ERROR - Failed to open Realm! Error Domain=io.realm Code=10 "Migration is required due to the following errors:
- Property 'ChatMessage.messageId' has been removed.
- Property 'ChatMessage.id' has been added.
- Primary Key for class 'ChatMessage' has changed from 'messageId' to 'id'.

Za co warto, używam Realm 5.50 i czytam przez Dokumenty w HTTPS: / /realm.io/docs/wift/latest/ i widzę to oświadczenie:

Once an object with a primary key is added to a Realm, the primary key cannot be changed.

To sprawia, że brzmi to tak, że nie można już zrobić z Realmem, ale zastanawiam się, czy ktoś może potwierdzić, czy też jest w rzeczywistości sposób, aby to osiągnąć? Dzięki!

0
bmt22033 26 październik 2020, 19:09

1 odpowiedź

Najlepsza odpowiedź

Możesz zmienić klucz podstawowy w bloku migracji. Przypuśćmy, że masz obiekt, który wygląda tak, z "lokalizacją" jest kluczowym kluczem

class TestClass: Object {
    @objc dynamic var localID = UUID().uuidString

    override static func primaryKey() -> String? {
        return "localID"
    }
}

I chcemy zmienić klucz podstawowy do _id. Blok migracji wyglądałby coś takiego

let vers = UInt64(3)
let config = Realm.Configuration( schemaVersion: vers, migrationBlock: { migration, oldSchemaVersion in
     print("oldSchemaVersion: \(oldSchemaVersion)")
     if (oldSchemaVersion < vers) {
        print("  performing migration")
        migration.enumerateObjects(ofType: TestClass.className()) { oldItem, newItem in
            let oldId = oldItem!["localID"]
            newItem!["_id"] = oldId

         }
     }
 })

Sugerowałbym użycie _id zamiast id, więc będzie zgodny z Mongodb Realm w przyszłości. Patrz Zdefiniuj schemat realu .

2
Jay 26 październik 2020, 19:29