Yerel bir SQLite.NET veritabanında veri depolama
Bu hızlı başlangıçta şunları nasıl yapacağınızı öğreneceksiniz:
- Verileri SQLite.NET veritabanında yerel olarak depolayın.
Hızlı başlangıçta, shell uygulamasından yerel bir SQLite.NET veritabanında Xamarin.Forms veri depolama adımları gösterilir. Son uygulama aşağıda gösterilmiştir:
Önkoşullar
Bu hızlı başlangıcı denemeden önce önceki hızlı başlangıcı başarıyla tamamlamanız gerekir.
Visual Studio ile uygulamayı güncelleştirme
Visual Studio'yu başlatın ve Notlar çözümünü açın.
Çözüm Gezgini'da Notlar çözümüne sağ tıklayın ve Çözüm için NuGet Paketlerini Yönet...:
NuGet Paket Yöneticisi Gözat sekmesini seçin ve sqlite-net-pcl NuGet paketini arayın.
Uyarı
Benzer adlara sahip birçok NuGet paketi vardır. Doğru paketi şu özelliklerle ayırt edebilirsiniz:
- Yazarlar: SQLite-net
- NuGet bağlantısı: sqlite-net-pcl
Adı farklı olsa da bu NuGet paketi .NET Standard projelerinde kullanılabilir.
NuGet Paket Yöneticisi doğru sqlite-net-pcl paketini seçin, Proje onay kutusunu işaretleyin ve Yükle düğmesine tıklayarak çözüme ekleyin:
Bu paket, veritabanı işlemlerini uygulamaya eklemek için kullanılır ve çözümdeki her projeye eklenir.
Önemli
SQLite.NET, praeclarum/sqlite-net deposunda desteklenen bir üçüncü taraf kitaplığıdır.
NuGet Paket Yöneticisi'ni kapatın.
Çözüm Gezgini, Notlar projesinde, Modeller klasöründe Note.cs açın ve var olan kodu aşağıdaki kodla değiştirin:
using System; using SQLite; namespace Notes.Models { public class Note { [PrimaryKey, AutoIncrement] public int ID { get; set; } public string Text { get; set; } public DateTime Date { get; set; } } }
Bu sınıf, uygulamadaki her notla ilgili verileri depolayacak bir
Note
model tanımlar.ID
özelliği, SQLite.NETAutoIncrement
veritabanındaki herNote
örneğin SQLite.NET tarafından sağlanan benzersiz bir kimliğe sahip olmasını sağlamak için ve öznitelikleriylePrimaryKey
işaretlenir.CTRL+S tuşlarına basarak Note.cs değişiklikleri kaydedin.
Uyarı
Uygulama, sonraki adımlarda düzeltilecek hatalar nedeniyle şu anda derlenmeyecektir.
Çözüm Gezgini'da, Notlar projesine Veri adlı yeni bir klasör ekleyin.
Çözüm Gezgini, Notes projesinde Data klasörüne NoteDatabase adlı yeni bir sınıf ekleyin.
NoteDatabase.cs'da var olan kodu aşağıdaki kodla değiştirin:
using System.Collections.Generic; using System.Threading.Tasks; using SQLite; using Notes.Models; namespace Notes.Data { public class NoteDatabase { readonly SQLiteAsyncConnection database; public NoteDatabase(string dbPath) { database = new SQLiteAsyncConnection(dbPath); database.CreateTableAsync<Note>().Wait(); } public Task<List<Note>> GetNotesAsync() { //Get all notes. return database.Table<Note>().ToListAsync(); } public Task<Note> GetNoteAsync(int id) { // Get a specific note. return database.Table<Note>() .Where(i => i.ID == id) .FirstOrDefaultAsync(); } public Task<int> SaveNoteAsync(Note note) { if (note.ID != 0) { // Update an existing note. return database.UpdateAsync(note); } else { // Save a new note. return database.InsertAsync(note); } } public Task<int> DeleteNoteAsync(Note note) { // Delete a note. return database.DeleteAsync(note); } } }
Bu sınıf, veritabanını oluşturmak, veritabanından veri okumak, veri yazmak ve veritabanından veri silmek için kod içerir. Kod, veritabanı işlemlerini arka plandaki iş parçacıklara taşıyan zaman uyumsuz SQLite.NET API'lerini kullanır. Ayrıca
NoteDatabase
oluşturucusu, veritabanı dosyasının yolunu bir bağımsız değişken olarak alır. Bu yol, sonraki adımda sınıf tarafındanApp
sağlanacaktır.CTRL+S tuşlarına basarak değişiklikleri NoteDatabase.cs kaydedin.
Uyarı
Uygulama, sonraki adımlarda düzeltilecek hatalar nedeniyle şu anda derlenmeyecektir.
Çözüm Gezgini Notlar projesinde App.xaml'i genişletin ve App.xaml.cs çift tıklayarak açın. Ardından mevcut kodu aşağıdaki kodla değiştirin:
using System; using System.IO; using Notes.Data; using Xamarin.Forms; namespace Notes { public partial class App : Application { static NoteDatabase database; // Create the database connection as a singleton. public static NoteDatabase Database { get { if (database == null) { database = new NoteDatabase(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Notes.db3")); } return database; } } public App() { InitializeComponent(); MainPage = new AppShell(); } protected override void OnStart() { } protected override void OnSleep() { } protected override void OnResume() { } } }
Bu kod, veritabanının dosya adını oluşturucuya bağımsız değişken
NoteDatabase
olarak geçirerek tekil olarak yeniNoteDatabase
bir örnek oluşturan bir özelliği tanımlarDatabase
. Veritabanını tekil olarak belirtmenin avantajı, uygulama çalışırken tek bir veritabanı bağlantısının oluşturulup açık tutulması ve bu sayede her veritabanı işlemi gerçekleştirildiğinde veritabanı dosyasını açma ve kapatma gereksiniminin ortadan kaldırılmasıdır.CTRL+S tuşlarına basarak App.xaml.cs değişiklikleri kaydedin.
Uyarı
Uygulama, sonraki adımlarda düzeltilecek hatalar nedeniyle şu anda derlenmeyecektir.
Çözüm Gezgini,Notes projesinde Views klasöründe NotesPage.xaml dosyasını genişletin ve NotesPage.xaml.cs açın. Ardından ve
OnSelectionChanged
yöntemlerini aşağıdaki kodla değiştirinOnAppearing
:protected override async void OnAppearing() { base.OnAppearing(); // Retrieve all the notes from the database, and set them as the // data source for the CollectionView. collectionView.ItemsSource = await App.Database.GetNotesAsync(); } async void OnSelectionChanged(object sender, SelectionChangedEventArgs e) { if (e.CurrentSelection != null) { // Navigate to the NoteEntryPage, passing the ID as a query parameter. Note note = (Note)e.CurrentSelection.FirstOrDefault(); await Shell.Current.GoToAsync($"{nameof(NoteEntryPage)}?{nameof(NoteEntryPage.ItemId)}={note.ID.ToString()}"); } }
yöntemi,
OnAppearing
veritabanında depolanan notlarla doldururCollectionView
.OnSelectionChanged
yöntemi, seçiliNote
nesneninID
özelliğini sorgu parametresi olarak geçirerek öğesine giderNoteEntryPage
.CTRL+S tuşlarına basarak NotesPage.xaml.cs değişiklikleri kaydedin.
Uyarı
Uygulama, sonraki adımlarda düzeltilecek hatalar nedeniyle şu anda derlenmeyecektir.
Çözüm Gezgini Görünümler klasöründe NoteEntryPage.xaml öğesini genişletin ve NoteEntryPage.xaml.cs açın. Ardından ,
OnSaveButtonClicked
veOnDeleteButtonClicked
yöntemlerini aşağıdaki kodla değiştirinLoadNote
:async void LoadNote(string itemId) { try { int id = Convert.ToInt32(itemId); // Retrieve the note and set it as the BindingContext of the page. Note note = await App.Database.GetNoteAsync(id); BindingContext = note; } catch (Exception) { Console.WriteLine("Failed to load note."); } } async void OnSaveButtonClicked(object sender, EventArgs e) { var note = (Note)BindingContext; note.Date = DateTime.UtcNow; if (!string.IsNullOrWhiteSpace(note.Text)) { await App.Database.SaveNoteAsync(note); } // Navigate backwards await Shell.Current.GoToAsync(".."); } async void OnDeleteButtonClicked(object sender, EventArgs e) { var note = (Note)BindingContext; await App.Database.DeleteNoteAsync(note); // Navigate backwards await Shell.Current.GoToAsync(".."); }
NoteEntryPage
, veritabanındanLoadNote
kimliği sayfaya sorgu parametresi olarak geçirilen notu almak ve sayfada birNote
nesneBindingContext
olarak depolamak için yöntemini kullanır.OnSaveButtonClicked
Olay işleyicisi yürütürken örnekNote
veritabanına kaydedilir ve uygulama önceki sayfaya geri döner.OnDeleteButtonClicked
Olay işleyicisi yürütürken,Note
örnek veritabanından silinir ve uygulama önceki sayfaya geri döner.CTRL+S tuşlarına basarak NoteEntryPage.xaml.cs değişiklikleri kaydedin.
Projeyi her platformda derleyin ve çalıştırın. Daha fazla bilgi için bkz . Hızlı başlangıç oluşturma.
NotLarSayfasında Ekle düğmesine basarak NoteEntryPage'e gidin ve bir not girin. Not kaydedildikten sonra uygulama NotesPage'e geri döner.
Uygulama davranışını gözlemlemek için farklı uzunlukta birkaç not girin. Girdiğiniz notların veritabanına kaydedildiğinden emin olmak için uygulamayı kapatın ve yeniden başlatın.
Uygulamayı Mac için Visual Studio ile güncelleştirme
Mac için Visual Studio başlatın ve Notlar çözümünü açın.
Çözüm Bölmesi'nde Notlar çözümüne sağ tıklayın ve NuGet Paketlerini Yönet... öğesini seçin:
NuGet Paketlerini Yönet iletişim kutusunda Gözat sekmesini seçin ve sqlite-net-pcl NuGet paketini arayın.
Uyarı
Benzer adlara sahip birçok NuGet paketi vardır. Doğru paketi şu özelliklerle ayırt edebilirsiniz:
- Yazarlar: SQLite-net
- NuGet bağlantısı: sqlite-net-pcl
Adı farklı olsa da bu NuGet paketi .NET Standard projelerinde kullanılabilir.
NuGet Paketlerini Yönet iletişim kutusunda sqlite-net-pcl paketini seçin ve paket ekle düğmesine tıklayarak çözüme ekleyin:
Bu paket, uygulamaya veritabanı işlemlerini eklemek için kullanılacaktır.
Proje Seç iletişim kutusunda, her onay kutusunun işaretli olduğundan emin olun ve Tamam düğmesine basın:
Bu, çözümdeki her projeye NuGet paketini ekler.
Çözüm Bölmesi'ndeki Notlar projesinde, Modeller klasöründe Note.cs açın ve var olan kodu aşağıdaki kodla değiştirin:
using System; using SQLite; namespace Notes.Models { public class Note { [PrimaryKey, AutoIncrement] public int ID { get; set; } public string Text { get; set; } public DateTime Date { get; set; } } }
Bu sınıf, uygulamadaki her notla ilgili verileri depolayacak bir
Note
model tanımlar.ID
özelliği, SQLite.NETAutoIncrement
veritabanındaki herNote
örneğin SQLite.NET tarafından sağlanan benzersiz bir kimliğe sahip olmasını sağlamak için ve öznitelikleriylePrimaryKey
işaretlenir.Dosya > Kaydet'i seçerek (veya ⌘ + S tuşlarına basarak) Note.cs değişiklikleri kaydedin.
Uyarı
Uygulama, sonraki adımlarda düzeltilecek hatalar nedeniyle şu anda derlenmeyecektir.
Çözüm Bölmesi'nde, Notlar projesine Data adlı yeni bir klasör ekleyin.
Çözüm Bölmesi'ndeki Notlar projesinde, Data klasörüne NoteDatabase adlı yeni bir sınıf ekleyin.
NoteDatabase.cs'da var olan kodu aşağıdaki kodla değiştirin:
using System.Collections.Generic; using System.Threading.Tasks; using SQLite; using Notes.Models; namespace Notes.Data { public class NoteDatabase { readonly SQLiteAsyncConnection database; public NoteDatabase(string dbPath) { database = new SQLiteAsyncConnection(dbPath); database.CreateTableAsync<Note>().Wait(); } public Task<List<Note>> GetNotesAsync() { //Get all notes. return database.Table<Note>().ToListAsync(); } public Task<Note> GetNoteAsync(int id) { // Get a specific note. return database.Table<Note>() .Where(i => i.ID == id) .FirstOrDefaultAsync(); } public Task<int> SaveNoteAsync(Note note) { if (note.ID != 0) { // Update an existing note. return database.UpdateAsync(note); } else { // Save a new note. return database.InsertAsync(note); } } public Task<int> DeleteNoteAsync(Note note) { // Delete a note. return database.DeleteAsync(note); } } }
Bu sınıf, veritabanını oluşturmak, veritabanından veri okumak, veri yazmak ve veritabanından veri silmek için kod içerir. Kod, veritabanı işlemlerini arka plandaki iş parçacıklara taşıyan zaman uyumsuz SQLite.NET API'lerini kullanır. Ayrıca
NoteDatabase
oluşturucusu, veritabanı dosyasının yolunu bir bağımsız değişken olarak alır. Bu yol, sonraki adımda sınıf tarafındanApp
sağlanacaktır.Dosya > Kaydet'i seçerek (veya ⌘ + S tuşlarına basarak) değişiklikleri NoteDatabase.cs kaydedin.
Uyarı
Uygulama, sonraki adımlarda düzeltilecek hatalar nedeniyle şu anda derlenmeyecektir.
Çözüm Bölmesi'ndeki Notlar projesinde App.xaml'i genişletin ve App.xaml.cs çift tıklayarak açın. Ardından mevcut kodu aşağıdaki kodla değiştirin:
using System; using System.IO; using Notes.Data; using Xamarin.Forms; namespace Notes { public partial class App : Application { static NoteDatabase database; // Create the database connection as a singleton. public static NoteDatabase Database { get { if (database == null) { database = new NoteDatabase(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "Notes.db3")); } return database; } } public App() { InitializeComponent(); MainPage = new AppShell(); } protected override void OnStart() { } protected override void OnSleep() { } protected override void OnResume() { } } }
Bu kod, veritabanının dosya adını oluşturucuya bağımsız değişken
NoteDatabase
olarak geçirerek tekil olarak yeniNoteDatabase
bir örnek oluşturan bir özelliği tanımlarDatabase
. Veritabanını tekil olarak belirtmenin avantajı, uygulama çalışırken tek bir veritabanı bağlantısının oluşturulup açık tutulması ve bu sayede her veritabanı işlemi gerçekleştirildiğinde veritabanı dosyasını açma ve kapatma gereksiniminin ortadan kaldırılmasıdır.Dosya > Kaydet'i seçerek (veya ⌘ + S tuşlarına basarak) değişiklikleri App.xaml.cs kaydedin.
Uyarı
Uygulama, sonraki adımlarda düzeltilecek hatalar nedeniyle şu anda derlenmeyecektir.
Çözüm Bölmesi'ndeki Notlar projesinde, Görünümler klasöründeki NotesPage.xaml dosyasını genişletin ve NotesPage.xaml.cs açın. Ardından ve
OnSelectionChanged
yöntemlerini aşağıdaki kodla değiştirinOnAppearing
:protected override async void OnAppearing() { base.OnAppearing(); // Retrieve all the notes from the database, and set them as the // data source for the CollectionView. collectionView.ItemsSource = await App.Database.GetNotesAsync(); } async void OnSelectionChanged(object sender, SelectionChangedEventArgs e) { if (e.CurrentSelection != null) { // Navigate to the NoteEntryPage, passing the ID as a query parameter. Note note = (Note)e.CurrentSelection.FirstOrDefault(); await Shell.Current.GoToAsync($"{nameof(NoteEntryPage)}?{nameof(NoteEntryPage.ItemId)}={note.ID.ToString()}"); } }
yöntemi,
OnAppearing
veritabanında depolanan notlarla doldururCollectionView
.OnSelectionChanged
yöntemi, seçiliNote
nesneninID
özelliğini sorgu parametresi olarak geçirerek öğesine giderNoteEntryPage
.Dosya > Kaydet'i seçerek (veya ⌘ + S tuşlarına basarak) değişiklikleri NotesPage.xaml.cs kaydedin.
Uyarı
Uygulama, sonraki adımlarda düzeltilecek hatalar nedeniyle şu anda derlenmeyecektir.
Çözüm Bölmesi'nde, Görünümler klasöründeki NoteEntryPage.xaml öğesini genişletin ve NoteEntryPage.xaml.cs açın. Ardından ,
OnSaveButtonClicked
veOnDeleteButtonClicked
yöntemlerini aşağıdaki kodla değiştirinLoadNote
:async void LoadNote(string itemId) { try { int id = Convert.ToInt32(itemId); // Retrieve the note and set it as the BindingContext of the page. Note note = await App.Database.GetNoteAsync(id); BindingContext = note; } catch (Exception) { Console.WriteLine("Failed to load note."); } } async void OnSaveButtonClicked(object sender, EventArgs e) { var note = (Note)BindingContext; note.Date = DateTime.UtcNow; if (!string.IsNullOrWhiteSpace(note.Text)) { await App.Database.SaveNoteAsync(note); } // Navigate backwards await Shell.Current.GoToAsync(".."); } async void OnDeleteButtonClicked(object sender, EventArgs e) { var note = (Note)BindingContext; await App.Database.DeleteNoteAsync(note); // Navigate backwards await Shell.Current.GoToAsync(".."); }
NoteEntryPage
, veritabanındanLoadNote
kimliği sayfaya sorgu parametresi olarak geçirilen notu almak ve sayfada birNote
nesneBindingContext
olarak depolamak için yöntemini kullanır.OnSaveButtonClicked
Olay işleyicisi yürütürken örnekNote
veritabanına kaydedilir ve uygulama önceki sayfaya geri döner.OnDeleteButtonClicked
Olay işleyicisi yürütürken,Note
örnek veritabanından silinir ve uygulama önceki sayfaya geri döner.Dosya > Kaydet'i seçerek (veya ⌘ + S tuşlarına basarak) NoteEntryPage.xaml.cs değişiklikleri kaydedin.
Projeyi her platformda derleyin ve çalıştırın. Daha fazla bilgi için bkz . Hızlı başlangıç oluşturma.
NotLarSayfasında Ekle düğmesine basarak NoteEntryPage'e gidin ve bir not girin. Not kaydedildikten sonra uygulama NotesPage'e geri döner.
Uygulama davranışını gözlemlemek için farklı uzunlukta birkaç not girin. Girdiğiniz notların veritabanına kaydedildiğinden emin olmak için uygulamayı kapatın ve yeniden başlatın.
Sonraki adımlar
Bu hızlı başlangıçta şunları öğrendiniz:
- Verileri SQLite.NET veritabanında yerel olarak depolayın.
Uygulamayı XAML stilleriyle biçimlendirmek için sonraki hızlı başlangıçla devam edin.