Mise en ligne : mardi 8 octobre 2024
Un modèle est une classe qui étend la classe Model et qui permet d'utiliser une table du schema dans notre application. Un modèle ne peut pas exister sans une table correspondante dans le schéma.
Créons un modèle Note, lié à une table notes.
La table notes :
src/database/model/schema.jstableSchema({
name: 'notes',
columns: [
{ name: 'title', type: 'string' },
{ name: 'content', type: 'string' },
{ name: 'is_pinned', type: 'boolean' },
{ name: 'created_at', type: 'number' },
{ name: 'updated_at', type: 'number' },
],
}),
src/database/model/Note.jsimport { Model } from '@nozbe/watermelondb'
export default class Note extends Model {
static table = 'notes'
}
Pour pouvoir l'utiliser, nous devons l'ajouter dans le modelClasses
de la database de notre fichier database.js :
src/database/database.jsimport Post from 'model/Note'
export const database = new Database({
modelClasses: [Note],
})
Pour garantir que les champs aient le même type que ceux que nous avons définis dans le schéma, watermelon met à notre disposition des decorateurs.
Le décorateur @field peut être utilisé pour les trois types de données.
Toutefois, watermelon met à notre disposition des décorateurs plus spécifiques.
Par exemple :
A la différence du schema où nous utilisions le snake_case, pour le modèle, nous utiliserons le camelCase.
Voici notre classe Note avec ses champs :
src/database/model/Note.jsimport { Model } from '@nozbe/watermelondb';
import { date, field, text } from '@nozbe/watermelondb/decorators';
export default class Note extends Model {
static table = 'notes';
@text('title') title;
@text('content') content;
@field('is_pinned') isPinned;
@date('created_at') createdAt;
@date('updated_at') updatedAt;
}
Vous pouvez aussi utilisé, dans certains cas, des champs avancés :
Le @readonly est utilisé pour le tracking automatique des dates (created_at et updated_at), car nous ne voulons pas modifier accidentellement leur contenu, mais nous voulons que watermelon les modifie lui-même, automatiquement (donc pas de @nochange).
Notre class Note après modification serait donc :
src/database/model/Note.jsimport { Model } from '@nozbe/watermelondb';
import { date, field, readonly, text } from '@nozbe/watermelondb/decorators';
export default class Note extends Model {
static table = 'notes';
@text('title') title;
@text('content') content;
@field('is_pinned') isPinned;
@readonly @date('created_at') createdAt;
@readonly @date('updated_at') updatedAt;
}
Nous n'avons vu ici que les bases de la classe Model, mais cela sera suffisant pour commencer à manipuler des données.