---
title: 'Créer une application mobile avec .NET MAUI et une base de données SQLite'
description: "Un gestionnaire de mots de passe en .NET MAUI avec une base SQLite locale : le paquet sqlite-net-pcl, SQLiteAsyncConnection, l'injection du singleton et les opérations CRUD."
pubDate: 2022-11-12
updatedDate: 2026-10-04
family: 'dotnet-csharp'
tags: []
heroImage: /images/creer-une-application-mobile-avec-net-maui-et-une-base-de-donnees-sqlite.webp
videoUrl: 'https://youtu.be/M_gJHgolGLk'
faq:
  - question: 'Faut-il utiliser sqlite-net-pcl ou Microsoft.Data.Sqlite ?'
    answer: 'La documentation .NET MAUI recommande sqlite-net-pcl, qui fournit un ORM simple pour les opérations CRUD. Microsoft.Data.Sqlite est une alternative ADO.NET, utile si tu préfères écrire ton SQL ou passer par EF Core.'
  - question: 'Quelle version de .NET et de .NET MAUI viser ?'
    answer: ".NET 10 est la version LTS en cours et .NET MAUI 10 la version supportée. Attention : le support de MAUI est plus court que celui de .NET — .NET MAUI 9 est hors support depuis le 12 mai 2026 alors que .NET 9 reste supporté jusqu'en novembre 2026."
  - question: 'Où stocker le fichier de base de données ?'
    answer: "Dans le dossier applicatif, via FileSystem.AppDataDirectory combiné à Path.Combine. C'est le chemin que la documentation recommande pour une base locale."
  - question: 'Comment accéder à la base depuis plusieurs pages ?'
    answer: "En enregistrant la classe d'accès comme singleton dans MauiProgram.cs, puis en l'injectant dans le constructeur de tes pages ou de tes view models."
  - question: "Que faut-il copier si j'active le write-ahead logging ?"
    answer: 'Le WAL crée des fichiers annexes .shm et .wal. Si tu déplaces ou copies la base, ferme toutes les connexions et copie ces fichiers avec le fichier principal, sinon tu perds des écritures.'
---

SQLite est le choix par défaut pour une base locale dans une application .NET MAUI : pas de serveur, pas de configuration réseau, et le fichier vit dans le dossier applicatif. Ce tutoriel reprend la mécanique complète, du paquet NuGet aux opérations CRUD.

La vidéo en bas de page date de 2022, à l'époque de .NET 7 : les API montrées ici n'ont pas changé, mais le choix de version mérite une mise au point (et le vouvoiement de la vidéo devient un tutoiement dans cet article).

## Quelle version viser aujourd'hui

.NET 10 est la version LTS en cours, publiée le 11 novembre 2025, et .NET MAUI 10 est la version supportée. Un piège à connaître : **le support de MAUI est plus court que celui de .NET**. Une version majeure de MAUI reçoit au minimum six mois de support après la sortie de sa remplaçante, à cause des dépendances externes comme Xcode ou les Android SDK Tools. Résultat concret : .NET MAUI 9 est hors support depuis le 12 mai 2026, alors que .NET 9 reste supporté jusqu'en novembre 2026. Se caler sur la version .NET ne suffit donc pas.

## Installer le paquet

```
dotnet add package sqlite-net-pcl
```

Un mot sur ce paquet, parce que son nom trompe : malgré le suffixe « pcl », c'est bien lui que la documentation .NET MAUI recommande. Ce n'est **pas** une bibliothèque Microsoft — elle est maintenue dans le dépôt `praeclarum/sqlite-net` et s'appuie sur SQLitePCLRaw pour embarquer une version de SQLite indépendante de la plateforme.

`Microsoft.Data.Sqlite` existe aussi : c'est un fournisseur ADO.NET léger, à préférer si tu veux écrire ton SQL à la main ou passer par EF Core. Pour un CRUD simple, `sqlite-net-pcl` demande nettement moins de code.

## Le modèle et l'ouverture de la base

Le chemin se construit une fois, dans le dossier applicatif :

```
private const SQLiteOpenFlags Flags =
    SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.Create | SQLiteOpenFlags.SharedCache;

public static string DatabasePath =>
    Path.Combine(FileSystem.AppDataDirectory, "Passwords.db3");
```

`Create` crée le fichier au premier lancement, `ReadWrite` autorise les écritures, `SharedCache` active le cache partagé. La connexion se fait en asynchrone, et la création des tables suit la même logique paresseuse : on ouvre, on crée la table si elle n'existe pas, et on ne le refait plus.

```
private SQLiteAsyncConnection? _database;

private async Task<SQLiteAsyncConnection> GetDatabaseAsync()
{
    if (_database is not null)
    {
        return _database;
    }

    _database = new SQLiteAsyncConnection(DatabasePath, Flags);
    await _database.CreateTableAsync<PasswordEntry>();

    return _database;
}
```

## Les opérations CRUD

Avec `SQLiteAsyncConnection`, les opérations se lisent presque comme du pseudo-code, sans une ligne de SQL :

```
await database.InsertAsync(entry);
await database.UpdateAsync(entry);
await database.DeleteAsync(entry);

var all = await database.Table<PasswordEntry>().ToListAsync();
```

Pour une condition précise, `Table<T>()` accepte un filtre par expression, et `GetAsync<T>(id)` récupère une entité par sa clé primaire. La propriété `Id` de ton modèle, marquée avec l'attribut `PrimaryKey` et `AutoIncrement`, est ce qui relie les deux.

## Injecter la base dans l'application

La bonne pratique est d'enregistrer la classe d'accès comme singleton dans `MauiProgram.cs`, puis de l'injecter :

```
builder.Services.AddSingleton<PasswordDatabase>();
```

Chaque page ou view model reçoit l'instance par son constructeur. Une seule connexion pour toute l'application, et pas de `new` dispersé dans le code.

## Un mot sur le write-ahead logging

Sur une base locale sollicitée, `EnableWriteAheadLoggingAsync()` peut améliorer les performances : lecteurs et écrivains ne se bloquent plus mutuellement. En contrepartie, SQLite crée deux fichiers annexes, `.shm` et `.wal`. Si tu déplaces ou copies la base, ferme toutes les connexions et **copie ces fichiers avec le fichier principal**, sinon tu laisses des écritures derrière toi.

La [documentation officielle de l'accès aux données SQLite dans .NET MAUI](https://learn.microsoft.com/en-us/dotnet/maui/data-cloud/database-sqlite?view=net-maui-10.0) détaille ces points, et la [page NuGet de sqlite-net-pcl](https://www.nuget.org/packages/sqlite-net-pcl) donne les versions publiées.

## Questions fréquentes

**Faut-il utiliser sqlite-net-pcl ou Microsoft.Data.Sqlite ?**

La documentation .NET MAUI recommande sqlite-net-pcl, qui fournit un ORM simple pour les opérations CRUD. Microsoft.Data.Sqlite est une alternative ADO.NET, utile si tu préfères écrire ton SQL ou passer par EF Core.

**Quelle version de .NET et de .NET MAUI viser ?**

.NET 10 est la version LTS en cours et .NET MAUI 10 la version supportée. Attention : le support de MAUI est plus court que celui de .NET — .NET MAUI 9 est hors support depuis le 12 mai 2026 alors que .NET 9 reste supporté jusqu'en novembre 2026.

**Où stocker le fichier de base de données ?**

Dans le dossier applicatif, via FileSystem.AppDataDirectory combiné à Path.Combine. C'est le chemin que la documentation recommande pour une base locale.

**Comment accéder à la base depuis plusieurs pages ?**

En enregistrant la classe d'accès comme singleton dans MauiProgram.cs, puis en l'injectant dans le constructeur de tes pages ou de tes view models.

**Que faut-il copier si j'active le write-ahead logging ?**

Le WAL crée des fichiers annexes .shm et .wal. Si tu déplaces ou copies la base, ferme toutes les connexions et copie ces fichiers avec le fichier principal, sinon tu perds des écritures.
