[Tindakan GitHub] [Laporan Cakupan Kode]
Gunakan salah satu paket berikut:
Versi | Kemasan | Keterangan |
---|---|---|
sqlite-net-pcl | Perpustakaan Standar .NET | |
sqlite-net-sqlcipher | Dengan Dukungan Enkripsi | |
sqlite-net-statis | Versi khusus yang menggunakan P/Invokes ke sqlite3 yang disediakan platform | |
sqlite-net-base | tanpa bundel SQLitePCLRaw sehingga Anda dapat memilih penyedia Anda sendiri |
SQLite-net adalah pustaka minimal sumber terbuka yang memungkinkan aplikasi .NET, .NET Core, dan Mono menyimpan data dalam database SQLite 3. Ini pertama kali dirancang untuk bekerja dengan Xamarin.iOS, namun kemudian berkembang untuk bekerja pada semua platform (Xamarin.*, .NET, UWP, Azure, dll.).
SQLite-net dirancang sebagai lapisan database yang cepat dan nyaman. Desainnya mengikuti tujuan berikut:
Sangat mudah untuk diintegrasikan dengan proyek yang ada dan berjalan di semua platform .NET.
Pembungkus tipis pada SQLite yang cepat dan efisien. (Perpustakaan ini tidak boleh menjadi penghambat kinerja kueri Anda.)
Metode yang sangat sederhana untuk menjalankan operasi dan kueri CRUD dengan aman (menggunakan parameter) dan untuk mengambil hasil kueri tersebut dengan cara yang sangat diketik.
Bekerja dengan model data Anda tanpa memaksa Anda mengubah kelas. (Berisi lapisan ORM kecil yang digerakkan oleh refleksi.)
Instal sqlite-net-pcl dari NuGet.
Penting: Anda perlu menambahkan paket NuGet ke proyek perpustakaan .NET Standard dan proyek aplikasi yang bergantung pada platform Anda.
SQLite-net semuanya terkandung dalam 1 file (saya tahu, keren sekali kan?) dan mudah untuk ditambahkan ke proyek Anda. Cukup tambahkan SQLite.cs ke proyek Anda, dan Anda siap untuk mulai membuat tabel. Implementasi asinkron dapat ditemukan di SQLiteAsync.cs.
Ini adalah proyek sumber terbuka yang menerima kontribusi/saran/laporan bug dari mereka yang menggunakannya. Jika Anda mempunyai ide tentang cara meningkatkan perpustakaan, silakan posting masalah di sini di GitHub. Silakan lihat Cara Berkontribusi.
Silakan berkonsultasi dengan Wiki untuk, ahem, dokumentasi lengkap.
Pustaka berisi atribut sederhana yang bisa Anda gunakan untuk mengontrol konstruksi tabel. Dalam program stok sederhana, Anda mungkin menggunakan:
public class Stock
{
[ PrimaryKey , AutoIncrement ]
public int Id { get ; set ; }
public string Symbol { get ; set ; }
}
public class Valuation
{
[ PrimaryKey , AutoIncrement ]
public int Id { get ; set ; }
[ Indexed ]
public int StockId { get ; set ; }
public DateTime Time { get ; set ; }
public decimal Price { get ; set ; }
[ Ignore ]
public string IgnoreField { get ; set ; }
}
Setelah Anda mendefinisikan objek dalam model, Anda memiliki pilihan API. Anda dapat menggunakan "API sinkron" di mana panggilan diblokir satu per satu, atau Anda dapat menggunakan "API asinkron" di mana panggilan tidak diblokir. Anda mungkin ingin menggunakan API asinkron untuk aplikasi seluler guna meningkatkan daya tanggap.
Kedua API tersebut dijelaskan dalam dua bagian di bawah.
Setelah Anda mendefinisikan entitas, Anda dapat secara otomatis membuat tabel di database Anda dengan memanggil CreateTable
:
// Get an absolute path to the database file
var databasePath = Path . Combine ( Environment . GetFolderPath ( Environment . SpecialFolder . MyDocuments ) , " MyData.db " ) ;
var db = new SQLiteConnection ( databasePath ) ;
db . CreateTable < Stock > ( ) ;
db . CreateTable < Valuation > ( ) ;
Anda dapat menyisipkan baris ke dalam database menggunakan Insert
. Jika tabel berisi kunci utama yang bertambah secara otomatis, maka nilai kunci tersebut akan tersedia untuk Anda setelah penyisipan:
public static void AddStock ( SQLiteConnection db , string symbol ) {
var stock = new Stock ( ) {
Symbol = symbol
} ;
db . Insert ( stock ) ;
Console . WriteLine ( " {0} == {1} " , stock . Symbol , stock . Id ) ;
}
Ada metode serupa untuk Update
dan Delete
.
Cara paling mudah untuk mengkueri data adalah menggunakan metode Table
. Ini dapat mengambil predikat untuk membatasi melalui klausa WHERE dan/atau menambahkan klausa ORDER BY:
var query = db . Table < Stock > ( ) . Where ( v => v . Symbol . StartsWith ( " A " ) ) ;
foreach ( var stock in query )
Console . WriteLine ( " Stock: " + stock . Symbol ) ;
Anda juga bisa melakukan kueri database pada tingkat rendah menggunakan metode Query
:
public static IEnumerable < Valuation > QueryValuations ( SQLiteConnection db , Stock stock ) {
return db . Query < Valuation > ( " select * from Valuation where StockId = ? " , stock . Id ) ;
}
Parameter generik pada metode Query
menentukan tipe objek yang akan dibuat untuk setiap baris. Ini bisa berupa salah satu kelas tabel Anda, atau kelas lain yang properti publiknya cocok dengan kolom yang dikembalikan oleh kueri. Misalnya, kita dapat menulis ulang kueri di atas sebagai:
public class Val
{
public decimal Money { get ; set ; }
public DateTime Date { get ; set ; }
}
public static IEnumerable < Val > QueryVals ( SQLiteConnection db , Stock stock ) {
return db . Query < Val > ( " select " Price " as " Money " , " Time " as " Date " from Valuation where StockId = ? " , stock . Id ) ;
}
Anda dapat melakukan pembaruan database tingkat rendah menggunakan metode Execute
.
Perpustakaan asinkron menggunakan Task Parallel Library (TPL). Dengan demikian, penggunaan normal objek Task
, dan kata kunci async
dan await
akan bekerja untuk Anda.
Setelah Anda mendefinisikan entitas, Anda dapat secara otomatis membuat tabel dengan memanggil CreateTableAsync
:
// Get an absolute path to the database file
var databasePath = Path . Combine ( Environment . GetFolderPath ( Environment . SpecialFolder . MyDocuments ) , " MyData.db " ) ;
var db = new SQLiteAsyncConnection ( databasePath ) ;
await db . CreateTableAsync < Stock > ( ) ;
Console . WriteLine ( " Table created! " ) ;
Anda dapat menyisipkan baris ke dalam database menggunakan Insert
. Jika tabel berisi kunci utama yang bertambah secara otomatis, maka nilai kunci tersebut akan tersedia untuk Anda setelah penyisipan:
var stock = new Stock ( )
{
Symbol = " AAPL "
} ;
await db . InsertAsync ( stock ) ;
Console . WriteLine ( " Auto stock id: {0} " , stock . Id ) ;
Metode serupa ada untuk UpdateAsync
dan DeleteAsync
.
Meminta data paling mudah dilakukan dengan menggunakan metode Table
. Ini akan mengembalikan instance AsyncTableQuery
, dimana Anda dapat menambahkan predikat untuk membatasi melalui klausa WHERE dan/atau menambahkan ORDER BY. Basis data tidak disentuh secara fisik hingga salah satu metode pengambilan khusus - ToListAsync
, FirstAsync
, atau FirstOrDefaultAsync
- dipanggil.
var query = db . Table < Stock > ( ) . Where ( s => s . Symbol . StartsWith ( " A " ) ) ;
var result = await query . ToListAsync ( ) ;
foreach ( var s in result )
Console . WriteLine ( " Stock: " + s . Symbol ) ;
Ada sejumlah metode tingkat rendah yang tersedia. Anda juga dapat menanyakan database secara langsung melalui metode QueryAsync
. Selain operasi perubahan yang disediakan oleh InsertAsync
dll, Anda dapat mengeluarkan metode ExecuteAsync
untuk mengubah kumpulan data secara langsung di dalam database.
Metode bermanfaat lainnya adalah ExecuteScalarAsync
. Ini memungkinkan Anda mengembalikan nilai skalar dari database dengan mudah:
var count = await db . ExecuteScalarAsync < int > ( " select count(*) from Stock " ) ;
Console . WriteLine ( string . Format ( " Found '{0}' stock items. " , count ) ) ;
sqlite-net biasanya digunakan sebagai ORM ringan (object-relational-mapper) menggunakan metode CreateTable
dan Table
. Namun, Anda juga dapat menggunakannya sebagai cara mudah untuk mengeksekusi kueri secara manual.
Berikut adalah contoh pembuatan tabel, memasukkan ke dalamnya (dengan perintah berparameter), dan menanyakannya tanpa menggunakan fitur ORM.
db . Execute ( " create table Stock(Symbol varchar(100) not null) " ) ;
db . Execute ( " insert into Stock(Symbol) values (?) " , " MSFT " ) ;
var stocks = db . Query < Stock > ( " select * from Stock " ) ;
Anda dapat menggunakan database terenkripsi dengan menggunakan paket NuGet sqlite-net-sqlcipher.
Kunci database diatur dalam SqliteConnectionString
yang diteruskan ke konstruktor koneksi:
var options = new SQLiteConnectionString ( databasePath , true ,
key : " password " ) ;
var encryptedDb = new SQLiteAsyncConnection ( options ) ;
Jika Anda perlu mengatur pragma untuk mengontrol enkripsi, tindakan dapat diteruskan ke string koneksi:
var options2 = new SQLiteConnectionString ( databasePath , true ,
key : " password " ,
preKeyAction : db => db . Execute ( " PRAGMA cipher_default_use_hmac = OFF; " ) ,
postKeyAction : db => db . Execute ( " PRAGMA kdf_iter = 128000; " ) ) ;
var encryptedDb2 = new SQLiteAsyncConnection ( options2 ) ;
Terima kasih kepada komunitas .NET yang telah menerima proyek ini, dan terima kasih kepada semua kontributor yang telah membantu menjadikan proyek ini hebat.
Terima kasih juga kepada Tirza van Dijk (@tirzavdijk) untuk logo hebatnya!