Gegevens lokaal opslaan met SQLite

Voltooid

SQLite is handig wanneer u relationele gegevens hebt. Stel dat u een app voor sociale media bouwt. U moet informatie opslaan over abonnees van de app. Deze gegevens bevatten een unieke id voor elke gebruiker en hun naam. U kunt dit soort relaties eenvoudig modelleren in een SQLite-database.

In deze les leert u hoe u SQLite gebruikt in een .NET MAUI-toepassing met behulp van SQLite-net.

Wat is SQLite?

SQLite is een lichtgewicht, platformoverschrijdende lokale database die een industriestandaard is voor mobiele toepassingen. SQLite vereist geen server. De database wordt opgeslagen in één schijfbestand in het bestandssysteem van het apparaat. Alle lees- en schrijfbewerkingen worden rechtstreeks uitgevoerd op het SQLite-schijfbestand.

De systeemeigen SQLite-bibliotheken zijn standaard ingebouwd in Android en iOS; De engine ondersteunt echter alleen een C/C++-API. Dit scenario is niet ideaal voor .NET-ontwikkelaars die op een of andere manier willen communiceren met SQLite en .NET.

Wat is SQLite-net?

Er zijn verschillende C#-wrappers rond de systeemeigen SQLite-engine die .NET-ontwikkelaars kunnen gebruiken. Veel .NET-ontwikkelaars gebruiken een populaire C#-wrapper met de naam SQLite-net.

SQLite-net is een object-relationele mapper. Het vereenvoudigt het proces van het definiëren van databaseschema's door u de modellen te laten gebruiken die in uw projecten zijn gedefinieerd om te fungeren als het schema.

Diagram waarin wordt getoond hoe SQLite-net een .NET-wrapper en de SQLite C/C++-engine biedt.

Bekijk bijvoorbeeld de volgende klasse die een User:

class User
{
    public int Id { get; set; }
    public string Username { get; set; }
    ...
}

Met behulp van een object-relationele mapper kunt u deze eerste User klasse nemen en een databasetabel maken met de naam User kolommen voor de Id en Username velden in deze klasse.

SQLite-net wordt geleverd als een NuGet-pakket. U moet het sqlite-net-pcl-pakket toevoegen aan uw apps om het te kunnen gebruiken.

Verbinding maken met een SQLite-database

U kunt een verbinding tot stand brengen met een SQLite-database vanuit een app via een SQLiteConnection object. Deze klasse wordt gedefinieerd in de SQLite naamruimte, samen met de andere typen en methoden die SQLite biedt. Wanneer u dit object instantieert, geeft u de bestandsnaam voor het databasebestand door. De constructor opent vervolgens het bestand als het bestaat of maakt het als het niet aanwezig is.

In de volgende code ziet u een voorbeeld:

using SQLite;
...
string filename = ...
SQLiteConnection conn = new SQLiteConnection(filename);

Houd er rekening mee dat filename deze moet verwijzen naar een locatie in de sandbox van de app.

Een tabel maken

Zoals u weet, is SQLite-net een object-relationele mapper, wat betekent dat u uw databaseschema kunt bouwen vanuit C#-klassen. SQLite-net kan een databasetabel maken van een gewone C#-klasse, maar er zijn veel kenmerken die u aan een klasse kunt toevoegen om meer metagegevens te bieden. Deze metagegevens helpen SQLite bij het afdwingen van functies zoals uniekheid en het toepassen van beperkingen op uw gegevens.

De beschikbare kenmerken zijn:

  • Table: Geef de naam van de tabel op als u wilt dat deze iets anders is dan de naam van de klasse.
  • PrimaryKey: Geef op dat een kolom de primaire sleutel is.
  • AutoIncrement: Geef op dat een kolom automatisch in waarde moet toenemen wanneer een nieuwe rij wordt ingevoegd.
  • Column: Geef de naam van een kolom op als u wilt dat deze iets anders is dan de naam van de eigenschap.
  • MaxLength: Geef het maximum aantal tekens op dat in de kolom kan worden gebruikt.
  • Unique: Geef op dat de waarde in de kolom uniek moet zijn uit alle andere rijen.

De volgende code toont een bijgewerkte versie van de User klasse die deze kenmerken toepast:

[Table("user")]
public class User
{
    // PrimaryKey is typically numeric 
    [PrimaryKey, AutoIncrement, Column("_id")]
    public int Id { get; set; }

    [MaxLength(250), Unique]
    public string Username { get; set; }
    ...
}

Nadat u de C#-klasse hebt gedefinieerd, roept u de CreateTable algemene methode in de SQLiteConnection klasse aan om de tabel in de database te genereren. Geef de klasse op als de typeparameter. Hier volgt een voorbeeld:

SQLiteConnection conn = new SQLiteConnection(filename);
conn.CreateTable<User>();

Als de tabel al in de database bestaat, controleert de CreateTable methode het schema om te zien of er wijzigingen zijn. Als dat zo is, probeert de bewerking het databaseschema bij te werken.

Eenvoudige lees- en schrijfbewerkingen uitvoeren

Nadat u een tabel hebt gemaakt, kunt u ermee werken. Als u een rij wilt toevoegen, gebruikt u de Insert methode op het SQLiteConnection exemplaar en geeft u een object op van het juiste type dat de gegevens bevat die moeten worden ingevoegd. De volgende code laat zien hoe u een nieuwe rij aan de User tabel toevoegt:

public int AddNewUser(User user)
{
    int result = conn.Insert(user);
    return result;
}

De Insert methode retourneert een int, dat het aantal rijen aangeeft dat in de tabel is ingevoegd. In dit geval is dat getal één.

Als u rijen uit een tabel wilt ophalen, gebruikt u de Table methode. Met deze methode wordt een verzameling objecten geretourneerd (die mogelijk leeg zijn):

public List<User> GetAllUsers()
{
    List<User> users = conn.Table<User>().ToList();
    return users;
}

De methode Table retourneert een TableQuery\<T>-object. Als u een Listwilt ophalen, gebruikt u de ToList methode zoals wordt weergegeven in het voorgaande voorbeeld.

Een SQLite-query uitvoeren met behulp van LINQ

Met Table de methode worden alle rijen uit een tabel opgehaald. In de meeste gevallen wilt u alleen een subset van de rijen retourneren die voldoen aan een set opgegeven criteria. Gebruik LINQ voor deze taken met SQLite-net.

SQLite-net ondersteunt veel algemene LINQ-query's, waaronder:

  • Where
  • Take
  • Skip
  • OrderBy
  • OrderByDescending
  • ThenBy
  • ElementAt
  • First
  • FirstOrDefault
  • ThenByDescending
  • Count

Met deze methoden kunt u de syntaxis van de extensiemethode of de LINQ C#-syntaxis gebruiken. Hier volgt bijvoorbeeld een codefragment waarmee u de details van een opgegeven gebruiker kunt ophalen:

public User GetByUsername(string username)
{
    var user = from u in conn.Table<User>()
               where u.Username == username
               select u;
    return user.FirstOrDefault();
}

Rijen bijwerken en verwijderen

U werkt een rij bij met behulp van de methode van Update het SQLiteConnection object. U geeft een object op dat de rij definieert die moet worden bijgewerkt met de nieuwe waarden. De Update methode wijzigt de rij met dezelfde primaire sleutelwaarde als het opgegeven object. De geretourneerde waarde is het aantal rijen dat is gewijzigd. Als deze waarde nul is, zijn er geen rijen met een overeenkomende primaire sleutel gevonden en is er niets bijgewerkt. In het volgende fragment wordt deze methode in actie weergegeven:

public int UpdateUser(User user)
{
    int result = 0;
    result = conn.Update(user);
    return result;
}

Verwijder rijen uit een tabel met de methode van Delete het SQLiteConnection object. In de eenvoudigste vorm van deze methode wordt de primaire sleutel van het item verwijderd als de parameter, zoals wordt weergegeven in het volgende voorbeeld. Deze vorm van de Delete methode is algemeen en vereist een typeparameter. De geretourneerde waarde is het aantal rijen dat uit de tabel is verwijderd:

public int DeleteUser(int userID)
{
    int result = 0;
    result = conn.Delete<User>(userID);
    return result;
}