Xamarin.Forms Yerel veritabanları
SQLite veritabanı altyapısı, Xamarin.Forms uygulamaların paylaşılan koddaki veri nesnelerini yüklemesine ve kaydetmesine izin verir. Örnek uygulama, Todo öğelerini depolamak için bir SQLite veritabanı tablosu kullanır. Bu makalede, yerel bir veritabanında bilgi depolamak ve almak için paylaşılan koddaki SQLite.Net 'in nasıl kullanılacağı açıklanır.
İOS
iOS ve Android ekran görüntüleri üzerinde ToDoList uygulaması
Aşağıdaki adımları izleyerek SQLite.NET 'i mobil uygulamalarla tümleştirin:
- NuGet paketini yükler.
- Sabitleri yapılandırın.
- Veritabanı erişim sınıfı oluşturun.
- Access data in Xamarin.Forms.
- Gelişmiş yapılandırma.
SQLite NuGet paketini yükler
NuGet paket yöneticisini kullanarak sqlite-net-pcl aramak ve en son sürümü paylaşılan kod projesine eklemek için kullanın.
Benzer ada sahip birden fazla NuGet paketi olabilir. Doğru paketi şu özelliklerle ayırt edebilirsiniz:
- Kimlik: sqlite-net-pcl
- Yazarlar: SQLite-net
- Sahipler: praeclarum
- NuGet bağlantısı:sqlite-net-pcl
Not
paket adına rağmen, .NET Standard projelerinde bile sqlite-net-pcl NuGet paketini kullanın.
Uygulama sabitleri yapılandırma
Örnek proje, ortak yapılandırma verileri sağlayan bir sabitler. cs dosyası içerir:
public static class Constants
{
public const string DatabaseFilename = "TodoSQLite.db3";
public const SQLite.SQLiteOpenFlags Flags =
// open the database in read/write mode
SQLite.SQLiteOpenFlags.ReadWrite |
// create the database if it doesn't exist
SQLite.SQLiteOpenFlags.Create |
// enable multi-threaded database access
SQLite.SQLiteOpenFlags.SharedCache;
public static string DatabasePath
{
get
{
var basePath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
return Path.Combine(basePath, DatabaseFilename);
}
}
}
Sabitler dosyası, SQLiteOpenFlag veritabanı bağlantısını başlatmak için kullanılan varsayılan Enum değerlerini belirtir. SQLiteOpenFlagSabit listesi şu değerleri destekler:
Create: Bağlantı yoksa, bağlantı veritabanı dosyası otomatik olarak oluşturulur.FullMutex: Bağlantı serileştirilmiş iş parçacığı modunda açıldı.NoMutex: Bağlantı çok iş parçacıklı modda açıldı.PrivateCache: Bağlantı, etkin olsa bile paylaşılan önbellekte yer almayacak.ReadWrite: Bağlantı, verileri okuyabilir ve yazabilir.SharedCache: Bağlantı etkinleştirilirse, bağlantı paylaşılan önbellekte yer alacak.ProtectionComplete: Cihaz kilitliyken dosya şifrelenir ve erişilemez olur.ProtectionCompleteUnlessOpen: Dosya açılana kadar şifrelenir ancak Kullanıcı cihazı kilitlese bile erişilebilir.ProtectionCompleteUntilFirstUserAuthentication: Kullanıcı cihazı önyükleyip kilitlene kadar dosya şifrelenir.ProtectionNone: Veritabanı dosyası şifrelenmedi.
Veritabanınızın nasıl kullanılacağına bağlı olarak farklı bayraklar belirtmeniz gerekebilir. Hakkında daha fazla bilgi için SQLiteOpenFlags bkz. SQLite.org üzerinde SQLiteOpenFlags .
Veritabanı erişim sınıfı oluşturma
Veritabanı sarmalayıcı sınıfı, veri erişim katmanını uygulamanın geri kalanından soyutlar. Bu sınıf sorgu mantığını merkezileştirerek veritabanı başlatmanın yönetimini basitleştirir, böylece uygulama büyüdükçe veri işlemlerini yeniden düzenleme veya genişletmeyi kolaylaştırır. ToDo uygulaması TodoItemDatabase Bu amaç için bir sınıf tanımlar.
Yavaş başlatma
, TodoItemDatabaseAsyncLazy<T> İlk erişilene kadar veritabanının başlatılmasını geciktirmek için özel sınıf tarafından temsil edilen zaman uyumsuz yavaş başlatmayı kullanır:
public class TodoItemDatabase
{
static SQLiteAsyncConnection Database;
public static readonly AsyncLazy<TodoItemDatabase> Instance = new AsyncLazy<TodoItemDatabase>(async () =>
{
var instance = new TodoItemDatabase();
CreateTableResult result = await Database.CreateTableAsync<TodoItem>();
return instance;
});
public TodoItemDatabase()
{
Database = new SQLiteAsyncConnection(Constants.DatabasePath, Constants.Flags);
}
//...
}
InstanceAlanı, zaten mevcut değilse nesnenin veritabanı tablosunu oluşturmak için kullanılır TodoItem ve TodoItemDatabase tek olarak bir olarak döndürür. InstanceTürü, AsyncLazy<TodoItemDatabase> ilk kez beklediğinde oluşturulur. Birden çok iş parçacığı alana aynı anda erişmeyi dener, hepsi tek oluşturma 'yı kullanacaktır. Sonra, oluşturma tamamlandığında tüm await işlemler tamamlanır. Ayrıca, await oluşturma tamamlandıktan sonra tüm işlemler, değer kullanılabilir olduğundan hemen devam eder.
Not
Veritabanı bağlantısı, uygulamanın ömrü boyunca tek bir veritabanı bağlantısının kullanılmasını sağlayan statik bir alandır. Kalıcı bir statik bağlantı kullanarak, tek bir uygulama oturumunda bağlantıları birden çok kez açıp kapatmayı kıyasla daha iyi performans sunar.
Zaman uyumsuz yavaş başlatma
Veritabanı başlangıcını başlatmak için yürütmeyi engellemeyi önleyin ve özel durumları yakalama fırsatına sahip olmak için örnek uygulama, sınıf tarafından temsil edilen zaman uyumsuz yavaş örneklemeyi kullanır AsyncLazy<T> :
public class AsyncLazy<T>
{
readonly Lazy<Task<T>> instance;
public AsyncLazy(Func<T> factory)
{
instance = new Lazy<Task<T>>(() => Task.Run(factory));
}
public AsyncLazy(Func<Task<T>> factory)
{
instance = new Lazy<Task<T>>(() => Task.Run(factory));
}
public TaskAwaiter<T> GetAwaiter()
{
return instance.Value.GetAwaiter();
}
}
AsyncLazySınıfı, Lazy<T>Task<T> bir kaynağın başlatılmasını temsil eden yavaş başlatılmış bir görev oluşturmak için ve türlerini birleştirir. Oluşturucuya geçirilen fabrika temsilcisi, zaman uyumlu ya da zaman uyumsuz olabilir. Fabrika temsilcileri bir iş parçacığı havuzu iş parçacığında çalışır ve birden çok kez yürütülecektir (birden fazla iş parçacığı aynı anda başlatılmaya çalıştığında bile). Bir fabrika temsilcisi tamamlandığında, yavaş başlatılan değer kullanılabilir olur ve örneği bekleyen tüm yöntemler AsyncLazy<T> değeri alır. Daha fazla bilgi için bkz. Asynclazy.
Veri işleme yöntemleri
TodoItemDatabaseSınıfı dört tür veri düzenlemesi için yöntemler içerir: oluşturma, okuma, düzenleme ve silme. SQLite.NET kitaplığı, SQL deyimlerini yazmadan nesneleri depolamanızı ve almanızı sağlayan basit bir nesne ilişkisel haritası (ORM) sağlar.
public class TodoItemDatabase
{
// ...
public Task<List<TodoItem>> GetItemsAsync()
{
return Database.Table<TodoItem>().ToListAsync();
}
public Task<List<TodoItem>> GetItemsNotDoneAsync()
{
// SQL queries are also possible
return Database.QueryAsync<TodoItem>("SELECT * FROM [TodoItem] WHERE [Done] = 0");
}
public Task<TodoItem> GetItemAsync(int id)
{
return Database.Table<TodoItem>().Where(i => i.ID == id).FirstOrDefaultAsync();
}
public Task<int> SaveItemAsync(TodoItem item)
{
if (item.ID != 0)
{
return Database.UpdateAsync(item);
}
else
{
return Database.InsertAsync(item);
}
}
public Task<int> DeleteItemAsync(TodoItem item)
{
return Database.DeleteAsync(item);
}
}
İçindeki verilere erişin Xamarin.Forms
TodoItemDatabaseSınıfı Instance , içindeki veri erişim işlemlerinin çağrılabilecek alanını kullanıma sunar TodoItemDatabase :
async void OnSaveClicked(object sender, EventArgs e)
{
var todoItem = (TodoItem)BindingContext;
TodoItemDatabase database = await TodoItemDatabase.Instance;
await database.SaveItemAsync(todoItem);
// Navigate backwards
await Navigation.PopAsync();
}
Gelişmiş yapılandırma
SQLite, bu makalede ve örnek uygulamada ele alınanlara kıyasla daha fazla özelliği olan sağlam bir API sağlar. Aşağıdaki bölümlerde ölçeklenebilirlik için önemli olan özellikler ele alınmaktadır.
Daha fazla bilgi için bkz. sqlite.org üzerinde SQLite belgeleri .
Önceden yazma günlüğü
Varsayılan olarak, SQLite geleneksel bir geri alma günlüğü kullanır. Değiştirilmemiş veritabanı içeriğinin bir kopyası ayrı bir geri alma dosyasına yazılır, sonra değişiklikler doğrudan veritabanı dosyasına yazılır. Geri alma günlüğü silindiğinde, kayıt gerçekleşir.
Write-Ahead Logging (WAL), önce değişiklikleri ayrı bir WAL dosyasına yazar. WAL modunda bir Işleme, WAL dosyasına eklenen ve tek bir WAL dosyasında birden çok işlemin oluşmasına izin veren özel bir kayıttır. Bir WAL dosyası, denetim noktasıadlı özel bir işlemde veritabanı dosyasına geri birleştirilir.
Okuyucular ve yazarlar birbirini engellemediğinden, okuma ve yazma işlemlerinin eşzamanlı olmasını sağlayan yerel veritabanları için WAL daha hızlı olabilir. Ancak, WAL modu sayfa boyutundadeğişikliğe izin vermez, veritabanına ek dosya ilişkilendirmeleri ekler ve ek checkişaretleme işlemini ekler.
SQLite.NET içinde WAL 'ı etkinleştirmek için EnableWriteAheadLoggingAsync örneğinde yöntemi çağırın SQLiteAsyncConnection :
await Database.EnableWriteAheadLoggingAsync();
Daha fazla bilgi için bkz. SQLite Write-Ahead günlüğe kaydetme SQLite.org.
Veritabanı kopyalama
Bir SQLite veritabanını kopyalamak için gerekli olabilecek birkaç durum vardır:
- Bir veritabanı uygulamanızla birlikte gönderilir, ancak mobil cihazdaki yazılabilir depolamaya kopyalanması veya taşınması gerekir.
- Veritabanının bir yedeğini veya kopyasını oluşturmanız gerekir.
- Veritabanı dosyasını sürüm, taşıma veya yeniden adlandırma yapmanız gerekir.
Genel olarak, bir veritabanı dosyasını taşıma, yeniden adlandırma veya kopyalama işlemi, bazı ek noktalara sahip diğer dosya türleri ile aynı işlemdir:
- Veritabanı dosyasını taşımaya çalışmadan önce tüm veritabanı bağlantıları kapatılmalıdır.
- Sonradan yazma günlüğükullanıyorsanız, SQLite bir paylaşılan bellek erişimi (. SHD) dosyası ve (bir ön günlük dosyası) (. Wal) dosyası oluşturur. Bu dosyalarda yapılan değişiklikleri de Uygulamanızı sağlayın.
Daha fazla bilgi için bkz. File Handling in Xamarin.Forms.
Örneği indirin