แบบฝึกหัด: จัดเก็บข้อมูลภายในเครื่องด้วย 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 ล่าสุด
เปิดโซลูชันเริ่มต้น
ลอกแบบหรือดาวน์โหลดที่เก็บแบบฝึกหัดของ
โน้ต
เป็นการดีที่สุดที่จะโคลนเนื้อหาแบบทดสอบไปยังเส้นทางโฟลเดอร์สั้น ๆ เช่น C:\dev เพื่อหลีกเลี่ยงไฟล์ที่สร้างขึ้นซึ่งเกินความยาวเส้นทางสูงสุด
ใช้ Visual Studio เพื่อเปิดโซลูชัน People.sln ซึ่งคุณพบใน mslearn-dotnetmaui-store-store-ข้อมูลภายในเครื่อง>บุคคลหรือโฟลเดอร์เริ่มต้นใน Visual Studio Code
โน้ต
อย่าเพิ่งลองเรียกใช้แอปพลิเคชัน แต่โค้ดไม่สมบูรณ์และจะแสดงข้อยกเว้นจนกว่าคุณจะเพิ่มองค์ประกอบที่ขาดหายไปในภายหลังในแบบฝึกหัดนี้
กําหนดเอนทิตี SQLite
เปิดไฟล์ Person.cs ในโฟลเดอร์ แบบจําลอง
เพิ่มคุณสมบัติ
intที่เรียกว่าIdไปยังคลาสPersonเพิ่มคุณสมบัติ
stringที่เรียกว่าNameคลาสควรมีลักษณะดังนี้:namespace People.Models; public class Person { public int Id { get; set; } public string Name { get; set; } }บันทึกไฟล์ Person.cs
เพิ่มไลบรารี SQLite
คลิกขวาบนโหนดโครงการ บุคคล จาก ของ Solution Explorer ใน Visual Studio
ในเมนูบริบทที่ปรากฏขึ้น เลือก จัดการแพคเกจ NuGet
ค้นหาและเลือก sqlite-net-pclจากนั้นเลือก ติดตั้ง
หากใช้ Visual Studio Code ให้เปิดเทอร์มินัลและแพคเกจเหล่านี้ด้วยคําสั่งต่อไปนี้:
dotnet add package sqlite-net-pcl
เพิ่มแอตทริบิวต์ SQLite
ในไฟล์ Person.cs ให้เพิ่มคําสั่ง
usingสําหรับเนมสเปซของSQLiteไปยังไฟล์สําหรับระดับPersonคําสั่งนี้ช่วยให้คุณใช้แอตทริบิวต์ SQLiteusing SQLite; namespace People.Models; public class Person { ... }ใส่คําอธิบายประกอบคลาส
Personด้วยแอตทริบิวต์[Table]และระบุชื่อตารางเป็นpeopleระบุคุณสมบัติ
Idเป็นคีย์หลัก ใส่คําอธิบายประกอบด้วยแอตทริบิวต์[PrimaryKey]และ[AutoIncrement]เพิ่มคําอธิบายประกอบลงในคุณสมบัติ
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; } }บันทึกไฟล์ Person.cs
เชื่อมต่อกับฐานข้อมูล
เปิดไฟล์ PersonRepository.cs
ตรวจสอบคลาส
PersonRepositoryคลาสนี้ประกอบด้วยโค้ดโครงกระดูกที่ไม่สมบูรณ์พร้อมด้วยตัวทําเครื่องหมายTODOที่คุณเพิ่มฟังก์ชันการทํางานเพื่อเข้าถึงฐานข้อมูลเพิ่มคําสั่ง
usingสําหรับSQLiteและPeople.Modelsnamespace ไปยังไฟล์สําหรับระดับPersonRepository.csเพิ่มเขตข้อมูล
SQLiteConnectionส่วนตัวที่ชื่อconnไปยังคลาส เหนือฟังก์ชันInitในฟังก์ชัน
Initให้ตรวจสอบว่าconnไม่เท่ากับnullหรือไม่ ถ้าเป็นเช่นนั้น ส่งกลับทันทีif (conn != null) return;ด้วยวิธีนี้ รหัสการเตรียมใช้งานสําหรับฐานข้อมูล SQLite จะทํางานเพียงครั้งเดียว
เตรียมใช้งานเขตข้อมูล
connเพื่อเชื่อมต่อกับฐานข้อมูลโดยใช้ตัวแปร_dbPathใช้วิธีการ
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>(); }
แทรกแถวลงในฐานข้อมูล
ในคลาส
PersonRepositoryให้ค้นหาวิธีAddNewPersonหากต้องการแทรกออบเจ็กต์
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 }); ... } ... }
ดึงข้อมูลแถวจากฐานข้อมูล
ในคลาส
PersonRepositoryให้ค้นหาวิธีGetAllPeopleเรียกใช้
Initเพื่อตรวจสอบว่ามีการเตรียมใช้งานฐานข้อมูลใช้วิธีการ
Table\<T>ทั่วไปเพื่อดึงข้อมูลแถวทั้งหมดในตาราง ระบุPersonเป็นพารามิเตอร์ชนิดใช้วิธีการขยาย
ToList()เพื่อเปลี่ยนผลลัพธ์เป็นคอลเลกชันList\<Person>และส่งกลับคอลเลกชันนี้เพิ่มการจัดการข้อผิดพลาดโดยการครอบโค้ดของคุณในบล็อก
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>(); }บันทึกไฟล์ PersonRepository.cs
รวมที่เก็บลงใน UI
เปิดไฟล์ MauiProgram.cs
ในฟังก์ชัน
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(); }บันทึกไฟล์ MauiProgram.cs
ขยาย app.xaml ในตัวสํารวจโซลูชัน แล้วเปิดไฟล์ App.xaml.cs
เพิ่มคุณสมบัติ
publicstaticที่เรียกว่าPersonRepoคุณสมบัตินี้จะเก็บวัตถุPersonRepositoryไว้ในคลาสAppเตรียมใช้งานคุณสมบัติ
PersonRepoในคอนสตรักเตอร์โดยการเพิ่มพารามิเตอร์PersonRepositoryในคอนสตรักเตอร์ และตั้งค่าคุณสมบัติ 'PersonRepo' เป็นค่าในพารามิเตอร์นี้ คลาสAppที่เสร็จสมบูรณ์ควรมีลักษณะดังนี้:public partial class App : Application { public static PersonRepository PersonRepo { get; private set; } public App(PersonRepository repo) { InitializeComponent(); PersonRepo = repo; } }
โน้ต
กระบวนการฉีดแบบขึ้นต่อกันจะเติมพารามิเตอร์ repo ไปยังคอนสตรักเตอร์โดยอัตโนมัติ
ทดสอบแอปพลิเคชัน
สร้างโซลูชันโดยใช้ CTRL+Shift+B
เมื่อรุ่นเสร็จสมบูรณ์ เริ่มการดีบัก โดยใช้ F5 เมื่อ UI ปรากฏ ให้ใส่ชื่อของคุณ และเลือก เพิ่มบุคคล
เลือก รับบุคคลทั้งหมด และตรวจสอบว่าชื่อของคุณปรากฏขึ้น
ทดลองโดยการเพิ่มชื่อเพิ่มเติมและดึงรายการของบุคคลที่จัดเก็บไว้
กลับไปยัง Visual Studio หรือ Visual Studio Code และหยุดการดีบักโดยใช้ Shift +F5
รีสตาร์ทแอปและเลือก รับบุคคลทั้งหมด ตรวจสอบว่าชื่อที่คุณเก็บไว้ก่อนหน้านี้จะยังคงถูกเก็บไว้ในฐานข้อมูลหรือไม่ ปิดแอปเมื่อคุณทําเสร็จแล้ว