Yerel bir SQLite.NET veritabanında veri depolama

Download Sample Örneği indirme

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:

Notes PageNote Entry Page

Önkoşullar

Bu hızlı başlangıcı denemeden önce önceki hızlı başlangıcı başarıyla tamamlamanız gerekir. Alternatif olarak, önceki hızlı başlangıç örneğini indirin ve bu hızlı başlangıcın başlangıç noktası olarak kullanın.

Visual Studio ile uygulamayı güncelleştirme

  1. Visual Studio'yu başlatın ve Notlar çözümünü açın.

  2. Çözüm Gezgini'da Notlar çözümüne sağ tıklayın ve Çözüm için NuGet Paketlerini Yönet...:

    Manage NuGet Packages

  3. 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:

    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:

    Select sqlite-net-pcl

    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.

  4. Çözüm Gezgini, Notlar projesinde, Modeller klasöründe Note.csaçı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.NET AutoIncrement veritabanındaki her Note örneğin SQLite.NET tarafından sağlanan benzersiz bir kimliğe sahip olmasını sağlamak için ve öznitelikleriyle PrimaryKey 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.

  5. Çözüm Gezgini'da, Notlar projesine Veri adlı yeni bir klasör ekleyin.

  6. Çözüm Gezgini, Notes projesinde Data klasörüne NoteDatabaseadlı yeni bir sınıf ekleyin.

  7. 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ından App 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.

  8. Çö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 yeni NoteDatabase 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.

  9. Çözüm Gezgini,Notes projesinde Views klasöründe NotesPage.xamldosyası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 doldurur CollectionView . OnSelectionChanged yöntemi, seçili Note nesnenin ID ö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.

  10. Çözüm Gezgini Görünümler klasöründe NoteEntryPage.xaml öğesini genişletin ve NoteEntryPage.xaml.cs açın. Ardından , OnSaveButtonClickedve OnDeleteButtonClicked 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ından LoadNote kimliği sayfaya sorgu parametresi olarak geçirilen notu almak ve sayfada bir Note nesne BindingContext olarak depolamak için yöntemini kullanır. OnSaveButtonClicked Olay işleyicisi yürütürken örnek Note 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.

  11. 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'egidin 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

  1. Mac için Visual Studio başlatın ve Notlar çözümünü açın.

  2. Çözüm Bölmesi'nde Notlar çözümüne sağ tıklayın ve NuGet Paketlerini Yönet... öğesini seçin:

    Manage NuGet Packages

  3. 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:

    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:

    Select sqlite-net-pcl

    Bu paket, uygulamaya veritabanı işlemlerini eklemek için kullanılacaktır.

  4. Proje Seç iletişim kutusunda, her onay kutusunun işaretli olduğundan emin olun ve Tamam düğmesine basın:

    Add Package to All Projects

    Bu, çözümdeki her projeye NuGet paketini ekler.

  5. Çözüm Bölmesi'ndeki Notlar projesinde, Modeller klasöründe Note.csaçı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.NET AutoIncrement veritabanındaki her Note örneğin SQLite.NET tarafından sağlanan benzersiz bir kimliğe sahip olmasını sağlamak için ve öznitelikleriyle PrimaryKey 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.

  6. Çözüm Bölmesi'nde, Notlar projesine Data adlı yeni bir klasör ekleyin.

  7. Çözüm Bölmesi'ndeki Notlar projesinde, Data klasörüne NoteDatabaseadlı yeni bir sınıf ekleyin.

  8. 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ından App 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.

  9. Çö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 yeni NoteDatabase 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.

  10. Çö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 doldurur CollectionView . OnSelectionChanged yöntemi, seçili Note nesnenin ID ö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.

  11. Çö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 , OnSaveButtonClickedve OnDeleteButtonClicked 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ından LoadNote kimliği sayfaya sorgu parametresi olarak geçirilen notu almak ve sayfada bir Note nesne BindingContext olarak depolamak için yöntemini kullanır. OnSaveButtonClicked Olay işleyicisi yürütürken örnek Note 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.

  12. 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'egidin 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.