แบบฝึกหัด: จัดเก็บข้อมูลภายในเครื่องด้วย SQLite

เสร็จสมบูรณ์เมื่อ

ในแบบฝึกหัดนี้ คุณใช้ SQLite เพื่อจัดเก็บข้อมูลภายในเครื่องกับแอปพลิเคชัน ในสถานการณ์ตัวอย่าง คุณตัดสินใจแคชข้อมูลสําหรับแอปสื่อสังคมเพื่อปรับปรุงการตอบสนอง แบบฝึกหัดนี้สร้างและใช้ฐานข้อมูล SQLite ภายในเครื่องเพื่อจัดเก็บข้อมูลเกี่ยวกับบุคคล คุณบันทึกแฟ้มฐานข้อมูลจริงในที่เก็บข้อมูลภายใน

โมดูลนี้ใช้ .NET 10.0 SDK ตรวจสอบให้แน่ใจว่าคุณได้ติดตั้ง .NET 10.0 โดยเรียกใช้คําสั่งต่อไปนี้ในเทอร์มินัลคําสั่งที่คุณต้องการ:

dotnet --list-sdks

ผลลัพธ์จะคล้ายกับตัวอย่างต่อไปนี้ปรากฏขึ้น:

9.0.100 [C:\Program Files\dotnet\sdk]
10.0.100 [C:\Program Files\dotnet\sdk]

ตรวจสอบให้แน่ใจว่าเวอร์ชันที่เริ่มต้นด้วย 10 อยู่ในรายการ หากไม่มีรายการหรือไม่พบคําสั่ง ให้ติดตั้ง .NET 10.0 SDK ล่าสุด

เปิดโซลูชันเริ่มต้น

  1. ลอกแบบหรือดาวน์โหลดที่เก็บแบบฝึกหัดของ

    โน้ต

    เป็นการดีที่สุดที่จะโคลนเนื้อหาแบบทดสอบไปยังเส้นทางโฟลเดอร์สั้น ๆ เช่น C:\dev เพื่อหลีกเลี่ยงไฟล์ที่สร้างขึ้นซึ่งเกินความยาวเส้นทางสูงสุด

  2. ใช้ Visual Studio เพื่อเปิดโซลูชัน People.sln ซึ่งคุณพบใน mslearn-dotnetmaui-store-store-ข้อมูลภายในเครื่อง>บุคคลหรือโฟลเดอร์เริ่มต้นใน Visual Studio Code

    โน้ต

    อย่าเพิ่งลองเรียกใช้แอปพลิเคชัน แต่โค้ดไม่สมบูรณ์และจะแสดงข้อยกเว้นจนกว่าคุณจะเพิ่มองค์ประกอบที่ขาดหายไปในภายหลังในแบบฝึกหัดนี้

กําหนดเอนทิตี SQLite

  1. เปิดไฟล์ Person.cs ในโฟลเดอร์ แบบจําลอง

  2. เพิ่มคุณสมบัติ int ที่เรียกว่า Id ไปยังคลาส Person

  3. เพิ่มคุณสมบัติ string ที่เรียกว่า Name คลาสควรมีลักษณะดังนี้:

    namespace People.Models;
    
    public class Person
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    
  4. บันทึกไฟล์ Person.cs

เพิ่มไลบรารี SQLite

  1. คลิกขวาบนโหนดโครงการ บุคคล จาก ของ Solution Explorer ใน Visual Studio

  2. ในเมนูบริบทที่ปรากฏขึ้น เลือก จัดการแพคเกจ NuGet

  3. ค้นหาและเลือก sqlite-net-pclจากนั้นเลือก ติดตั้ง

    สกรีนช็อตที่แสดงตัวจัดการแพคเกจ NuGet พร้อมไลบรารี sqlite-net-pcl ที่เลือก

หากใช้ Visual Studio Code ให้เปิดเทอร์มินัลและแพคเกจเหล่านี้ด้วยคําสั่งต่อไปนี้:

dotnet add package sqlite-net-pcl

เพิ่มแอตทริบิวต์ SQLite

  1. ในไฟล์ Person.cs ให้เพิ่มคําสั่ง using สําหรับเนมสเปซของ SQLite ไปยังไฟล์สําหรับระดับ Person คําสั่งนี้ช่วยให้คุณใช้แอตทริบิวต์ SQLite

    using SQLite;
    
    namespace People.Models;
    
    public class Person
    {
        ...
    }
    
  2. ใส่คําอธิบายประกอบคลาส Person ด้วยแอตทริบิวต์ [Table] และระบุชื่อตารางเป็น people

  3. ระบุคุณสมบัติ Id เป็นคีย์หลัก ใส่คําอธิบายประกอบด้วยแอตทริบิวต์ [PrimaryKey] และ [AutoIncrement]

  4. เพิ่มคําอธิบายประกอบลงในคุณสมบัติ Name ระบุ MaxLength เป็น 250 ระบุว่าแต่ละค่าในคอลัมน์ควร Unique

    คลาสที่เสร็จสมบูรณ์ควรมีลักษณะดังนี้:

    using SQLite;
    
    namespace People.Models;
    
    [Table("people")]
    public class Person
    {
        [PrimaryKey, AutoIncrement]
        public int Id { get; set; }
    
        [MaxLength(250), Unique]
        public string Name { get; set; }
    }
    
  5. บันทึกไฟล์ Person.cs

เชื่อมต่อกับฐานข้อมูล

  1. เปิดไฟล์ PersonRepository.cs

  2. ตรวจสอบคลาส PersonRepository คลาสนี้ประกอบด้วยโค้ดโครงกระดูกที่ไม่สมบูรณ์พร้อมด้วยตัวทําเครื่องหมาย TODO ที่คุณเพิ่มฟังก์ชันการทํางานเพื่อเข้าถึงฐานข้อมูล

  3. เพิ่มคําสั่ง using สําหรับ SQLite และ People.Models namespace ไปยังไฟล์สําหรับระดับ PersonRepository.cs

  4. เพิ่มเขตข้อมูล SQLiteConnection ส่วนตัวที่ชื่อ conn ไปยังคลาส เหนือฟังก์ชัน Init

  5. ในฟังก์ชัน Init ให้ตรวจสอบว่า conn ไม่เท่ากับ nullหรือไม่ ถ้าเป็นเช่นนั้น ส่งกลับทันที

    if (conn != null)
        return;
    

    ด้วยวิธีนี้ รหัสการเตรียมใช้งานสําหรับฐานข้อมูล SQLite จะทํางานเพียงครั้งเดียว

  6. เตรียมใช้งานเขตข้อมูล conn เพื่อเชื่อมต่อกับฐานข้อมูลโดยใช้ตัวแปร _dbPath

  7. ใช้วิธีการ conn.CreateTable เพื่อสร้างตารางเพื่อจัดเก็บข้อมูล Person ฟังก์ชัน Init ที่เสร็จสมบูรณ์ควรมีลักษณะดังนี้:

    using SQLite;
    using People.Models;
    ...
    
    private SQLiteConnection conn;
    ...
    private void Init()
    {
       if (conn != null)
          return;
    
       conn = new SQLiteConnection(_dbPath);
       conn.CreateTable<Person>();
    }
    

แทรกแถวลงในฐานข้อมูล

  1. ในคลาส PersonRepository ให้ค้นหาวิธี AddNewPerson

  2. หากต้องการแทรกออบเจ็กต์ Person ใหม่ ให้แทนที่ความคิดเห็น TODO ในวิธีนี้ด้วยรหัส โค้ดแรกเรียกใช้ Init เพื่อตรวจสอบว่ามีการเตรียมใช้งานฐานข้อมูล จากนั้นใช้วิธีการ SQLiteConnection ของวัตถุ Insert ตั้งค่าตัวแปร result เป็นค่าที่วิธีการ Insert ส่งกลับ ดังที่แสดงในโค้ดต่อไปนี้:

    public void AddNewPerson(string name)
    {
        int result = 0;
        try
        {
            // enter this line
            Init();
    
            // basic validation to ensure a name was entered
            if (string.IsNullOrEmpty(name))
                throw new Exception("Valid name required");
    
            // enter this line
            result = conn.Insert(new Person { Name = name });
            ...
        }
        ...
    }
    

ดึงข้อมูลแถวจากฐานข้อมูล

  1. ในคลาส PersonRepository ให้ค้นหาวิธี GetAllPeople

  2. เรียกใช้ Init เพื่อตรวจสอบว่ามีการเตรียมใช้งานฐานข้อมูล

  3. ใช้วิธีการ Table\<T> ทั่วไปเพื่อดึงข้อมูลแถวทั้งหมดในตาราง ระบุ Person เป็นพารามิเตอร์ชนิด

  4. ใช้วิธีการขยาย ToList() เพื่อเปลี่ยนผลลัพธ์เป็นคอลเลกชัน List\<Person> และส่งกลับคอลเลกชันนี้

  5. เพิ่มการจัดการข้อผิดพลาดโดยการครอบโค้ดของคุณในบล็อก try-catch ถ้ามีข้อผิดพลาด ให้ตั้งค่าคุณสมบัติ StatusMessage เป็นคุณสมบัติ Message ของข้อยกเว้น และส่งกลับคอลเลกชันที่ว่างเปล่า วิธีการที่เสร็จสมบูรณ์ควรมีลักษณะดังนี้:

    public List<Person> GetAllPeople()
    {
       try
       {
          Init();
          return conn.Table<Person>().ToList();
       }
       catch (Exception ex)
       {
          StatusMessage = string.Format("Failed to retrieve data. {0}", ex.Message);
       }
    
       return new List<Person>();
    }
    
  6. บันทึกไฟล์ PersonRepository.cs

รวมที่เก็บลงใน UI

  1. เปิดไฟล์ MauiProgram.cs

  2. ในฟังก์ชัน CreateMauiApp หลังจากคําสั่งที่เพิ่มหน้า MainPage เป็นบริการ singleton ไปยังแอป ให้เพิ่มโค้ดเพื่อทํางานต่อไปนี้:

    • สร้างตัวแปรสตริงที่ชื่อว่า dbPath เตรียมใช้งานสตริงนี้ด้วยนิพจน์ FileAccessHelper.GetLocalFilePath("people.db3") ไฟล์ฐานข้อมูลที่แอปใช้เรียกว่า people.db3และแอปจะบันทึกไฟล์นี้ในที่เก็บข้อมูลภายในบนอุปกรณ์

    • ใช้การใส่การขึ้นต่อกันเพื่อเพิ่มคลาส PersonRepository เป็นบริการเดี่ยวไปยังแอป คลาส PersonRepository แสดงคอนสตรักเตอร์ที่ใช้เส้นทางไปยังไฟล์ฐานข้อมูลเป็นพารามิเตอร์สตริง

    โค้ดที่เสร็จสมบูรณ์สําหรับฟังก์ชัน CreateMauiApp ควรมีลักษณะดังนี้:

    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>()
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
            });
    
        // Add this code
        string dbPath = FileAccessHelper.GetLocalFilePath("people.db3");
        builder.Services.AddSingleton<PersonRepository>(s => ActivatorUtilities.CreateInstance<PersonRepository>(s, dbPath));
    
        return builder.Build();
    }
    
  3. บันทึกไฟล์ MauiProgram.cs

  4. ขยาย app.xaml ในตัวสํารวจโซลูชัน แล้วเปิดไฟล์ App.xaml.cs

  5. เพิ่มคุณสมบัติ publicstaticที่เรียกว่า PersonRepo คุณสมบัตินี้จะเก็บวัตถุ PersonRepository ไว้ในคลาส App

  6. เตรียมใช้งานคุณสมบัติ PersonRepo ในคอนสตรักเตอร์โดยการเพิ่มพารามิเตอร์ PersonRepository ในคอนสตรักเตอร์ และตั้งค่าคุณสมบัติ 'PersonRepo' เป็นค่าในพารามิเตอร์นี้ คลาส App ที่เสร็จสมบูรณ์ควรมีลักษณะดังนี้:

    public partial class App : Application
    {
        public static PersonRepository PersonRepo { get; private set; }
    
        public App(PersonRepository repo)
        {
            InitializeComponent();
            PersonRepo = repo;
        }
    }
    

โน้ต

กระบวนการฉีดแบบขึ้นต่อกันจะเติมพารามิเตอร์ repo ไปยังคอนสตรักเตอร์โดยอัตโนมัติ

ทดสอบแอปพลิเคชัน

  1. สร้างโซลูชันโดยใช้ CTRL+Shift+B

  2. เมื่อรุ่นเสร็จสมบูรณ์ เริ่มการดีบัก โดยใช้ F5 เมื่อ UI ปรากฏ ให้ใส่ชื่อของคุณ และเลือก เพิ่มบุคคล

    สกรีนช็อตของแอปด้วยข้อความที่ประสบความสําเร็จที่ระบุว่ามีการเพิ่มระเบียน

  3. เลือก รับบุคคลทั้งหมด และตรวจสอบว่าชื่อของคุณปรากฏขึ้น

    สกรีนช็อตของแอปที่มีรายการของเรกคอร์ดทั้งหมดในฐานข้อมูล

  4. ทดลองโดยการเพิ่มชื่อเพิ่มเติมและดึงรายการของบุคคลที่จัดเก็บไว้

  5. กลับไปยัง Visual Studio หรือ Visual Studio Code และหยุดการดีบักโดยใช้ Shift +F5

  6. รีสตาร์ทแอปและเลือก รับบุคคลทั้งหมด ตรวจสอบว่าชื่อที่คุณเก็บไว้ก่อนหน้านี้จะยังคงถูกเก็บไว้ในฐานข้อมูลหรือไม่ ปิดแอปเมื่อคุณทําเสร็จแล้ว