2016-11-11 9 views
0

So in:Swift Realm - Schreiben eines generi Primary Key Autoinkrement Funktion

  1. How do I set a auto increment key in Realm?
  2. Realm and auto increment Behavior (Android)
  3. https://github.com/realm/realm-java/issues/469

es sagt, dass Primärschlüssel Auto Increment nicht auf Realm unterstützt wird . Ok, also möchte ich das selbst hinzufügen. Die verlinkten Posts zeigen Möglichkeiten, dies zu tun.

Problem: Die vorgeschlagenen Lösungen müssen manuell eine getNextPrimaryId() - Funktion für jede Modellklasse selbst hinzufügen. Das scheint extrem dumm zu sein. Ich habe selbst versucht, in Swift ein generisches zu schreiben, also muss ich das nur einmal machen und es wird automatisch auf alle meine Modellklassen angewendet, aber ich habe versagt - da ich in Swift nicht so gut bin.

Versuch 1:

extension Object { 
    func autoIncId() -> Int { 
     let objects = Database.realm.objects(self).sorted("id") 
     // Filter the max id here and return + 1 
    } 
} 

Versuch 2:

class Database {  
    static func autoIncId(type: Object) -> Int { 
     let currentId = Database.realm.objects(type.self).map{$0.id}.maxElement ?? 0 
     return currentId + 1 
    } 
} 

Beide nicht kompilieren, weil "Cannot convert value of type "Object" to expected argument type "Object.Type""

Wer noch keine Ahnung hat, wie generische Funktion zu schreiben, die ALL gilt. Modelle automatisch? Ich möchte einfach MyModelClass.autoIncId() anrufen, um die nächste ID zu erhalten ...

Antwort

1

Angenommen, Sie verwenden Swift 3, sollten Sie Folgendes verwenden:

type(of: self) 

aber warum wollen Sie ein selbstinkrementierende Feld? Wenn Sie einen eindeutigen Schlüssel wünschen, verwenden Sie einfach eine UUID. Das automatische Vergrößern von Feldern führt zu großen Problemen, wenn Ihre App auf mehreren Geräten (z. B. iPhone und iPad) synchronisiert werden soll.

+0

Hm, danke. Aber das bringt mich immer noch mit dem Problem, dass der Compiler die Eigenschaft "id" nicht kennt, weil "Object" keine hat. AFAIK gibt es kein "Get-Attribut von db des Objekts xy" in Realm. Wie kann ich die ID-Eigenschaft des ausgewählten Objekts erhalten, wenn ich aufgrund der Compiler-Typ-Einschränkungen nicht über die Eigenschaft darauf zugreifen kann? – Shiuyin

+0

Sie können es bekommen, da Realm-Objekte von NSObject erben - mit 'value (forKey:)', also würden Sie '$ 0.value (forKey:" id ")' verwenden. Wenn Sie jedoch die Methode 'sorted' verwenden, haben Sie sie trotzdem als String. Nichtsdestotrotz schlage ich vor, dass eine Autoinkrementierungseigenschaft eine schlechte Idee ist. – Michael

Verwandte Themen