Realm applychanges & sections multiples

Bonjour

J’ai une table view avec plusieurs sections et lorsque je modifie un objet realm, la fonction applychanges trouvée sur le site de realm plante (elle n’est pas conçue pour gérer plusieurs sections…)

J’ai essayé de créer un notificationToken par section mais ça continue de planter… Si quelqu’un a une idée, je suis preneur :wink:

Salut, en effet le code d’exemple de realm est fait pour gérer les tables simples et non les tables à 2 niveaux.
En fonction de tes données tu peux que surveiller séparément chacune des sous listes mais ça ne va pas être simple.
Un de mes étudiants sur une formation en personne avait justement galéré la dessus sur un tp mais je ne me rappelle plus s’il était allé jusqu’au bout (je crois me souvenir que c’était @gaveline )

Qu’essaye tu de faire exactement ? As tu un bout de code à nous montrer ?

Je n’avais pas de table views avec des section, mais le code que j’utilise est celui ci :

    notificationTokenTransactions = transactions!.observe { (changes) in
        switch changes {
        case .initial:
            self.uiTableView.reloadData()
        case .update(_, let deletions, let insertions, let modifications):
            self.uiTableView.beginUpdates()
            self.uiTableView.insertRows(at: insertions.map({ IndexPath(row: $0, section: 0) }), with: .automatic)
            self.uiTableView.deleteRows(at: deletions.map({ IndexPath(row: $0, section: 0)}), with: .automatic)
            self.uiTableView.reloadRows(at: modifications.map({ IndexPath(row: $0, section: 0) }), with: .automatic)
            self.uiTableView.endUpdates()
            
        case .error(let error):
            fatalError("\(error)")
        }
    }

Pour les méthodes viewTable.insertRows (etc) il faut lui passer en “at”, un IndexPath qui se construit avec la section.
Peut être que ce numéro de section peut être récupéré ou calculé.

Je tente d’aider a l’aveugle je fais peut être fausse route, n’hésite pas à donner plus d’infos si jamais je peux aider. :slight_smile:

Merci Maxime et Gaveline pour votre aide. Je pense effectivement qu’il faut récupérer le numéro de section et le passer à la fonction qui gère la mise à jour de la tableView, ça doit fonctionner.

Mais j’ai un autre problème. J’écris une application pour qu’un prof puisse communiquer avec ses élèves, et je n’arrive pas à configurer la base de données realm (je veux que les élèves puissent communiquer avec le prof mais pas entre eux, et que le prof puisse communiquer avec tous les élèves). Je résume:

  • le prof doit pouvoir accéder à tous ses messages ainsi qu’à tous ceux des élèves
  • un élève doit pouvoir accéder à ses propres messages ainsi qu’à ceux du prof qui lui sont adressés
  • le prof doit aussi pouvoir envoyer des infos à tous les élèves à la fois

Il me faut donc gérer des droits d’accès, et je n’arrive pas à trouver dans la doc de realm des exemples qui m’éclairent… La seule chose que j’ai réussi à faire fonctionner, c’est mettre tous les utilisateurs en mode admin, ce qui n’est vraiment pas top.

De plus, je ne comprends pas pourquoi realm studio ne permet pas de gérer les droits d’accès directement, ce serait tellement plus simple. Bref, je suis perdu et je me demande si, malgré tous les avantages que présente realm, je n’aurais pas dû rester sur firebase…

Dans mes souvenirs, chaque utilisateur peut avoir sa propre base avec le nom ‘~’ lors de la creation de la connexion.

//  this is a task Realm comptible with the fully version of RealmTasks for iOS/Android/C#
static let tasksRealmURL                       = URL(string: "realm://\(defaultSyncHost):9080/~/realmtasks")!

Seul le prof devrait être admin pour pouvoir tout lire.
Il y a aussi la possibilité de jouer avec les permissions mais je n’étais pas aller jusque la dans mon exploration.

Je sais que j’avais trouvé des applis proposées par realm de type showcase pour montrer les possibilité de leur bébé.

2 exemples qui pourront t’aider je pense :


Tout ceci étant sur le github de realm, je te laisse explorer les 60+ repos

Merci pour ta réponse. Je me suis plongé dans les deux projets github, mais rien de concluant pour l’instant :pensive:

Apres un utilitaire comme celui ci ne peux pas faire le café.
Si on reprend ton exemple, il te faut :

  • une class User
  • une class Message

Un message est associé a un User qui poste le message.
Realm gère l’authentification, donc tu sais qui fait quoi et qui est connecté.

Apres il faut travailler avec tes requêtes.

Selon qui fait l’action il faudra requêter différemment.
Ce n’est pas a l’ORM de connaitre à l’avance toutes tes règles de gestion.

Si tu est connecté en tant qu’élève :

var messages: Results<Message> = realm?.objects(Message.self).filter("user == [id de l'user]").sorted(byKeyPath: "createdAt", ascending: true)

Et si tu es le prof, tu ne met pas le filtre pour voir tout. (Par exemple et sans aucune précision dans le massage car je fais ca de tête.

Pour résumer, quelque soit le langage, l’orm ne peut pas tout faire à ta place. Il y a une grande part d’architecture à faire pour savoir ce que tu veux exactement. Ensuite, quelque soit le moteur de base utilisé, les principes sont les mêmes.

Par exemple, si on enleve le principe de prof/eleve et qu’on le remplace par un système d’age.

< 18 ans : pas de contenu violent
>= 18 ans : tu peux tout voir.

Est ce que firebase le gère ? Pas nativement. Mais en faisant la bonne requête, tu aura le meme résultat quelques soit ta solution technique.

Avec realm :

var messages: Results<Message> = realm?.objects(Message.self).filter("violent == false").sorted(byKeyPath: "createdAt", ascending: true)

:slight_smile:

Tu as raison, je peux effectivement créer une base globale à laquelle tout le monde a accès (en théorie), et gérer tout le berzingue avec des requêtes. Ce qui signifie, si j’ai bien compris, que l’objet message doit contenir une variable userID, afin de savoir qui l’a émis.

Du coup, plus de droit d’accès et autres permissions prises de tête à gérer: ça me frustre un peu de pas y être arrivé, mais bon le principal c’est quand même d’avancer.

Une question et un commentaire pour finir:

  • ça veut dire quoi, ORM ?
  • pour le café, j’ai une super machine saeco, pas besoin de realm :wink:

Pas de soucis :slight_smile:
Bon courage pour la suite du code n’hésite pas si t’as d’autres blocages, si on peut aider, on est la pour ça.

Cool, j’ai encore appris un truc. Merki :wink: