אחסון נתונים באופן מקומי באמצעות SQLite

הושלמה

SQLite שימושי כאשר יש לך נתונים יחסיים. נניח שאתה בונה אפליקציה של מדיה חברתית. עליך לאחסן מידע אודות מנויים לאפליקציה. נתונים אלה כוללים מזהה ייחודי עבור כל משתמש ואת שמו. באפשרותך ליצור מודל של קשר גומלין מסוג זה בקלות במסד נתונים של SQLite.

ביחידה זו, תלמדו כיצד להשתמש ב- SQLite ביישום .NET MAUI באמצעות SQLite-net.

מהו SQLite?

SQLite הוא מסד נתונים מקומי קל משקל חוצ פלטפורמות, שהוא תקן תעשייה עבור אפליקציות למכשירים ניידים. SQLite אינו דורש שרת. מסד הנתונים מאוחסן בקובץ דיסק יחיד במערכת הקבצים של המכשיר. כל פעולות הקריאה והכתיבה יופעלו ישירות מול קובץ הדיסק של SQLite.

ספריות המקוריות של SQLite מוכללות ב- Android וב- iOS כברירת מחדל; עם זאת, המנוע תומך ב- API של C/C++ בלבד. תרחיש זה אינו אידיאלי למפתחי .NET, הברצונך לקיים אינטראקציה עם SQLite ו- .NET.

מהו SQLite-net?

יש כמה עטיפות C# סביב מנוע SQLite המקורי שבו מפתחי .NET יכולים להשתמש. מפתחי .NET רבים משתמשים בעטיפה פופולרית של C# שנקראת SQLite-net.

SQLite-net הוא ממפה יחסי של אובייקטים. היא עוזרת לפשט את תהליך הגדרת סכימות מסד הנתונים בכך שהיא מאפשרת לך להשתמש במודלים המוגדרים בפרוייקטים שלך לשמש כסכימה.

המציגה כיצד SQLite-net מספק עטיפת .NET ומנוע SQLite C/C++ .

לדוגמה, שקול את המחלקה הבאה שמדגמים User:

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

באמצעות ממפה יחסי של אובייקטים, באפשרותך לקחת את המחלקה הראשונה User וליצור טבלת מסד נתונים בשם User הכוללת עמודות עבור השדות Id ו- Username מסוג זה.

SQLite-net נשלח כחבילה של NuGet. עליך להוסיף את sqlite-net-pcl לאפליקציות שלך כדי להשתמש בה.

כיצד להתחבר למסד נתונים SQLite

באפשרותך ליצור חיבור למסד נתונים SQLite מתוך יישום באמצעות SQLiteConnection אחר. מחלקה זו מוגדרת במרווח השמות SQLite, יחד עם הסוגים ופעולות השירות האחרים ש- SQLite מספקת. בעת יצירת מופעים של אובייקט זה, אתה מעביר את שם הקובץ עבור קובץ מסד הנתונים. לאחר מכן, בנאי פותח את הקובץ אם הוא קיים או יוצר אותו אם הוא אינו קיים.

הקוד הבא מציג דוגמה:

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

זכור כי filename להצביע על מיקום בארגז החול של היישום.

כיצד ליצור טבלה

זכור כי SQLite-net הוא ממפה יחסי של אובייקטים, כלומר, באפשרותך לבנות את סכימת מסד הנתונים שלך ממחלקות C#. SQLite-net יכול לבנות טבלת מסד נתונים ממחלקה רגילה של C#, אך קיימות תכונות רבות שניתן להוסיף לכיתה כדי לספק מטה-נתונים נוספים. מטה-נתונים אלה עוזרים ל- SQLite לאכוף תכונות כגון ייחודיות ולהחיל אילוצים על הנתונים שלך.

התכונות הזמינות כוללות:

  • Table: ציין את שם הטבלה אם ברצונך שהיא תהיה שם שאינו שם הכיתה.
  • PrimaryKey: ציין שעמודה היא המפתח הראשי.
  • AutoIncrement: ציין שעמודה צריכה להגדיל ערך באופן אוטומטי בעת הוספת שורה חדשה.
  • Column: ציין שם של עמודה אם ברצונך שהיא תהיה שם שאינו שם המאפיין.
  • MaxLength: ציין את מספר התווים המרבי שבו ניתן להשתמש בעמודה.
  • Unique: ציין שהערך בעמודה חייב להיות ייחודי מכל השורות האחרות.

הקוד הבא מציג גירסה מעודכנת של מחלקת User שמחלה תכונות אלה:

[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; }
    ...
}

לאחר שתגדיר את מחלקת C# שלך, CreateTable הכללית ברמה SQLiteConnection כדי ליצור את הטבלה במסד הנתונים. ציין את המחלקה כפרמטר הסוג. להלן דוגמה:

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

אם הטבלה כבר קיימת במסד הנתונים, שיטת CreateTable בודקת את הסכימה כדי לראות אם קיימים שינויים כלשהם. אם ישנם, הפעולה תנסה לעדכן את סכימת מסד הנתונים.

כיצד לבצע פעולות קריאה וכתיבה בסיסיות

לאחר יצירת טבלה, באפשרותך להתחיל לקיים אינטראקציה עם הטבלה. כדי להוסיף שורה, השתמש Insert השירות הבאה במופע SQLiteConnection וספק אובייקט מהסוג המתאים המכיל את הנתונים להוספה. הקוד הבא מראה כיצד להוסיף שורה חדשה לטבלה User הבאה:

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

פעולת Insert הבאה מחזירה int, המייצג את מספר השורות שנוספו לטבלה. במקרה זה, מספר זה הוא אחד.

כדי לאחזר שורות מטבלה, השתמש בפעולת Table זו. פעולת שירות זו מחזירה אוסף של אובייקטים (שעשויים להיות ריקים):

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

פעולת Table הבאה מחזירה TableQuery\<T> חדש. כדי לקבל List, השתמש ToList הבאה, כפי שמוצג בדוגמה הקודמת.

ביצוע שאילתת SQLite באמצעות LINQ

פעולת Table הבאה מאחזרת את כל השורות מטבלה. ברוב הזמנים, ברצונך להחזיר רק קבוצת משנה של השורות התואמות לקבוצת קריטריונים שצוינו. עבור משימות אלה, השתמש ב- LINQ עם SQLite-net.

SQLite-net תומך בשאילתות LINQ נפוצות רבות, כולל:

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

בשיטות אלה, באפשרותך להשתמש בתחביר שיטת ההרחבה או בתחביר LINQ C#. לדוגמה, להלן מקטע קוד המאפשר לך לאחזר את הפרטים של משתמש שצוין:

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

עדכון ומחיקה של שורות

אתה מעדכן שורה באמצעות SQLiteConnection של האובייקט Update זו. עליך לספק אובייקט המעדכן את השורה עם הערכים החדשים שלה. פעולת Update משנה את השורה הכוללת ערך מפתח ראשי זהה לזה של האובייקט שסופק. הערך המוחזר הוא מספר השורות שהשתנו. אם ערך זה הוא אפס, לא נמצאו שורות עם מפתח ראשי תואם, ושום דבר לא עודכן. המקטע הבא מציג שיטה זו בפעולה:

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

הסר שורות מטבלה באמצעות SQLiteConnection השירות Delete האובייקט. הדרך הפשוטה ביותר של שיטה זו לוקחת את המפתח הראשי של הפריט להימחק בפרמטר, כפי שמוצג בדוגמה הבאה. צורה זו של פעולת Delete כללית, והיא דורשת פרמטר סוג. הערך המוחזר הוא מספר השורות שהוסרו מהטבלה:

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