Comment insert des éléments à 0 index dans le conteneur Realm

Est-il possible d'insert de nouveaux éléments à l'index 0 du conteneur Realm ? Je ne vois pas une méthode d'insertion dans la class Realm .

Dois-je utiliser List s? Si la réponse est oui, comment puis-je restructurer le code suivant pour pouvoir utiliser List et garder la list en synchro constante avec le conteneur Realm . En d'autres termes, j'ai du mal à find un bon moyen de conserver le conteneur de domaine et la List avec les mêmes éléments lors de l'ajout et de la suppression.

Dans le code suivant, de nouveaux éléments sont entrés au dernier index. Comment puis-je le restructurer pour pouvoir insert des éléments à l'index 0?

Classe de model

 import RealmSwift class Item:Object { dynamic var productName = "" } 

Main ViewController

 let realm = try! Realm() var items : Results<Item>? var item:Item? override func viewDidLoad() { super.viewDidLoad() self.items = realm.objects(Item.self) } func addNewItem(){ item = Item(value: ["productName": productNameField.text!]) try! realm.write { realm.add(item!) } } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return self.items!.count } func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let cell = tableView.dequeueReusableCell(withIdentifier: "reusableCell", for: indexPath) let data = self.items![indexPath.row] cell.textLabel?.text = data.productName return cell } func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { if editingStyle == UITableViewCellEditingStyle.delete{ if let item = items?[indexPath.row] { try! realm.write { realm.delete(item) } tableView.deleteRows(at: [indexPath], with: UITableViewRowAnimation.automatic) } } } 

Idéalement, c'est ce que je voudrais pouvoir faire lors de l'insertion de nouveaux éléments dans la méthode addNewItem () …

  item = Item(value: ["productName": inputItem.text!]) try! realm.write { realm.insert(item!, at:0) } 

L'ajout d'une propriété entier sortedIndex qui vous permet de contrôler manuellement l'ordre des objects est certainement l'une des manières les plus populaires de order des objects dans Realm, mais elle est tout à fait inefficace. Pour insert un object à 0, vous devrez alors parcourir tous les autres objects et incrémenter son numéro de command de 1, ce qui signifie que vous devrez toucher tous les objects de ce type dans votre database pour le faire. .

La meilleure pratique pour ce type d'implémentation consiste à créer une autre sous-class de model Object qui contient une propriété List , en conserver une instance dans Realm, puis append chaque object à cette propriété. List propriétés de List se comportent comme des arrays normaux, il est donc très rapide et efficace d'organiser les objects de cette façon:

 import RealmSwift class ItemList: Object { let items = List<Item>() } class Item: Object { dynamic var productName = "" } let realm = try! Realm() // Get the list object let itemList = realm.objects(ItemList.self).first! // Add a new item to it let newItem = Item() newItem.productName = "Item Name" try! realm.write { itemList.items.insert(newItem, at: 0) } 

Vous pouvez ensuite utiliser directement l'object ItemList.items en tant que source de données pour votre vue de table.

Ils sont au less deux façons de le faire:

vous pouvez append manuellement la priorité en tant que numéro dans votre class pour.ex:

 class Task: Item { dynamic var something = "" dynamic var priority = 0 } 

append au royaume:

 //you can make priority 2,3,4 etc - 0 will be at the top let task = Task(something: "Something", priority: 0) 

et après avoir récupéré des objects:

 var tasks: Results<Task>! viewdidLoad(){ let realm = try! Realm() tasks = realm.objects(Task.self).sorted(byKeyPath: "priority") } 

ou vous pouvez faire une date comme ceci:

 class Task: Item { dynamic var something = "" dynamic var created = Date() override class func indexedPriority() -> [Ssortingng]{ return ["created"] } } 

append au royaume:

 let task = Task(something: "Something") 

et après avoir récupéré des objects:

 var tasks: Results<Task>! viewdidLoad(){ let realm = try! Realm() tasks = realm.objects(Task.self).sorted(byKeyPath: "created") } 

premier, vous devez vous mettre à jour pour atsortingbuer la priorité, le second sera automatiquement mis à jour