List SwiftUI avec Realm

Bonjour,

J’utilise ce que j’ai appris dans le cours pour monter une base de données Realm et SitesManager pour gérer les données pour un projet particulier. Ca ressemble beaucoup à CredentialsManager()

J’utilise un ForEach et un List pour afficher les données.
Au départ les données s’affichent correctement dans la liste mais lorsque j’ajoute un élément, il est bien ajouté à la base de données mais j’ai cette erreur qui s’affiche et l’élément n’est affiché.

orEach<Range, Int, Optional> count (2) != its initial count (3). ForEach(_:content:) should only be used for constant data. Instead conform data to Identifiable or use ForEach(_:id:content:) and provide an explicit id!

Lorsque je détruit un élément, il est n’est plus affiché mais j’ai toujours cette erreur.

Il semble y avoir un problème au niveau du count initial des données. Je ne sais plus quoi faire pour m’en sortir.

Voici le code d’affichage:

@ObservedObject var hostList = SitesManager()
List{
ForEach(0…<hostList._sitesList.count) { index in
if let site = hostList.getSiteConnexion(atIndex: index) {
ConnexionRow2(site: site)
}
}
}

Salut @slaverdu,

Vu l’erreur , il te dit d’utiliser un ForEach avec un id et un content, au lieu d’uniquement content ou de te conformé au protocole Identifiable.

Donc, utiliser un id de type UUID pour identifier tes données. Je n’ai pas encore suivi le cours SwiftUI complet, mais je crois que @mbritto a abordé cette partie.

Bonjour,

Quel est le format de la base de données? Contient elle un identifiant « id » précis?
J’ai l’impression qu’il s’emmêle les pinceaux car n’arrive pas à trouver cet « id ».
Tu peux soit ajouter un id (en utilisant UUID par exemple) ou alors spécifier dans ton Foreach la donnée que tu veux utiliser en Identifiant (et celle ci doit être unique à chaque élément) avec la commande (id: \.identifiant) dans ton Foreach. Maxime a fait un cours dessus, dans les lists SwiftUI notamment.

EDT : @ThonyF a été plus rapide que moi ^^.

Salut,

Voici ce que j’utilise comme class. Je comprends l’erreur mais dans la View je n’ai pas accès au id directement car c’est un objet de la class SitesManager que j’utilise.

class Sites1: Object , Identifiable {


** @objc dynamic var _id = «  »**
** @objc dynamic var _nom = «  »**
** @objc dynamic var _description = «  »**
** @objc dynamic var _host = «  »**


** override static func primaryKey() -> String? {**
** « _id »**
** }**


** override init() {**
** _id = UUID().uuidString**
** }**
}

class SitesManager : ObservableObject {


** let _realm:Realm**
** var _sitesList:Results**

** init() {**
** // La migration est nécessare si il y a changement dans la structure**
** let config = Realm.Configuration(deleteRealmIfMigrationNeeded: true)**
** _realm = try! Realm(configuration: config)**
** _sitesList = _realm.objects(Sites1.self)**
** }**

@slaverdu premièrement, ton override n’est pas utile, tu peux le mettre directement au début.

class Person: Object {
  dynamic var personID = UUID().uuidString
  dynamic var name = ""

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

Après, vu que, tu utilises la variable _sitesList de la class SitesManager, il faut que tu donnes la clé primaire, donc pour toi l’id.

Exemple de la doc de Realm :

let myPrimaryKey = "Primary-Key"
let realm = try! Realm()
let specificPerson = realm.object(ofType: Person.self, forPrimaryKey: myPrimaryKey)

Après ça, il faut voir s’il prend en compte le protocole Identifiable de ta class Site1 dans le ForEach sinon, il faudra préciser quelle variable utiliser comme ID dans celui-ci.

Comme dit, je n’ai pas encore assez utilisé SwiftUI, donc à voir. J’y vais au feeling la :joy:

Merci beaucoup pour tes réponses.
Je ne comprends pas où définir la PrimaryKey dans la class Sites1 ou SitesManager ?

La variable specificPerson est-elle utilisée ?

Salut,

Je ne vois pas vraiment comment utiliser ma variable SitesManager() dans le ForEach().
La seule façon que j’ai trouvé est par le count de l’objet.

ForEach( 0…<hostList._sitesList.count) {

}