[การดำเนินการ GitHub] [รายงานการครอบคลุมโค้ด]
ใช้หนึ่งในแพ็คเกจเหล่านี้:
เวอร์ชัน | บรรจุุภัณฑ์ | คำอธิบาย |
---|---|---|
sqlite-net-บมจ | .NET ไลบรารีมาตรฐาน | |
sqlite-net-sqlcipher | ด้วยการสนับสนุนการเข้ารหัส | |
sqlite-สุทธิ-คงที่ | เวอร์ชันพิเศษที่ใช้ P/Inriggs กับ sqlite3 ที่ได้รับจากแพลตฟอร์ม | |
sqlite-net-base | โดยไม่ต้องใช้ชุด SQLitePCLRaw เพื่อให้คุณสามารถเลือกผู้ให้บริการของคุณเองได้ |
SQLite-net เป็นไลบรารีโอเพ่นซอร์สขนาดเล็กที่สุดที่อนุญาตให้แอปพลิเคชัน .NET, .NET Core และ Mono จัดเก็บข้อมูลในฐานข้อมูล SQLite 3 ได้รับการออกแบบครั้งแรกให้ทำงานกับ Xamarin.iOS แต่ตั้งแต่นั้นมาก็เติบโตขึ้นมาเพื่อทำงานบนทุกแพลตฟอร์ม (Xamarin.*, .NET, UWP, Azure ฯลฯ)
SQLite-net ได้รับการออกแบบให้เป็นเลเยอร์ฐานข้อมูลที่รวดเร็วและสะดวกสบาย การออกแบบเป็นไปตาม เป้าหมาย เหล่านี้:
ง่ายมากที่จะรวมเข้ากับโครงการที่มีอยู่และทำงานบนแพลตฟอร์ม .NET ทั้งหมด
wrapper แบบบางบน SQLite ที่รวดเร็วและมีประสิทธิภาพ (ไลบรารีนี้ไม่ควรเป็นจุดคอขวดด้านประสิทธิภาพของข้อความค้นหาของคุณ)
วิธีการง่ายๆ สำหรับการดำเนินการ CRUD และการสืบค้นอย่างปลอดภัย (โดยใช้พารามิเตอร์) และสำหรับการดึงผลลัพธ์ของการสืบค้นเหล่านั้นในรูปแบบที่พิมพ์อย่างยิ่ง
ทำงานร่วมกับโมเดลข้อมูลของคุณโดยไม่ต้องบังคับให้คุณเปลี่ยนชั้นเรียน (ประกอบด้วยชั้น ORM ที่ขับเคลื่อนด้วยการสะท้อนขนาดเล็ก)
ติดตั้ง sqlite-net-pcl จาก NuGet
สิ่งสำคัญ: คุณจะต้องเพิ่มแพ็คเกจ NuGet ให้กับ ทั้ง โครงการไลบรารี .NET Standard และ โครงการแอปที่ขึ้นอยู่กับแพลตฟอร์ม ของคุณ
SQLite-net ทั้งหมดรวมอยู่ในไฟล์เดียว (ฉันรู้ เจ๋งมากเลยใช่ไหม) และง่ายต่อการเพิ่มลงในโปรเจ็กต์ของคุณ เพียงเพิ่ม SQLite.cs ในโครงการของคุณ เพียงเท่านี้คุณก็พร้อมที่จะเริ่มสร้างตารางแล้ว การใช้งานแบบอะซิงโครนัสสามารถพบได้ใน SQLiteAsync.cs
นี่เป็นโครงการโอเพ่นซอร์สที่ยินดีรับการมีส่วนร่วม/ข้อเสนอแนะ/รายงานข้อผิดพลาดจากผู้ที่ใช้งาน หากคุณมีความคิดเห็นเกี่ยวกับวิธีปรับปรุงห้องสมุด โปรดโพสต์ปัญหาที่นี่บน GitHub โปรดตรวจสอบวิธีการมีส่วนร่วม
โปรดปรึกษา Wiki เพื่อขอเอกสารฉบับสมบูรณ์
ไลบรารีประกอบด้วยคุณลักษณะแบบง่ายที่คุณสามารถใช้เพื่อควบคุมการสร้างตาราง ในโปรแกรมหุ้นธรรมดา คุณอาจใช้:
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 ; }
}
เมื่อคุณกำหนดออบเจ็กต์ในโมเดลของคุณแล้ว คุณจะมีตัวเลือก API คุณสามารถใช้ "Asynchronous API" โดยที่การโทรจะบล็อกทีละรายการ หรือคุณสามารถใช้ "Asynchronous API" โดยที่การโทรจะไม่บล็อก คุณอาจสนใจที่จะใช้ API แบบอะซิงโครนัสสำหรับแอปพลิเคชันมือถือเพื่อเพิ่มการตอบสนอง
API ทั้งสองมีการอธิบายไว้ในสองส่วนด้านล่าง
เมื่อคุณกำหนดเอนทิตีของคุณแล้ว คุณสามารถสร้างตารางในฐานข้อมูลของคุณโดยอัตโนมัติโดยการเรียก 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 > ( ) ;
คุณสามารถแทรกแถวในฐานข้อมูลโดยใช้ Insert
หากตารางมีคีย์หลักที่เพิ่มค่าอัตโนมัติ ค่าของคีย์นั้นจะพร้อมใช้งานสำหรับคุณหลังจากการแทรก:
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 ) ;
}
มีวิธีการที่คล้ายกันสำหรับ Update
และ Delete
วิธีที่ตรงไปตรงมาที่สุดในการค้นหาข้อมูลคือการใช้วิธี Table
ซึ่งสามารถใช้เพรดิเคตสำหรับการจำกัดผ่าน WHERE clauses และ/หรือเพิ่ม ORDER BY clauses:
var query = db . Table < Stock > ( ) . Where ( v => v . Symbol . StartsWith ( " A " ) ) ;
foreach ( var stock in query )
Console . WriteLine ( " Stock: " + stock . Symbol ) ;
คุณยังสามารถสืบค้นฐานข้อมูลในระดับต่ำโดยใช้วิธี Query
:
public static IEnumerable < Valuation > QueryValuations ( SQLiteConnection db , Stock stock ) {
return db . Query < Valuation > ( " select * from Valuation where StockId = ? " , stock . Id ) ;
}
พารามิเตอร์ทั่วไปของวิธี Query
จะระบุประเภทของออบเจ็กต์ที่จะสร้างสำหรับแต่ละแถว อาจเป็นคลาสหนึ่งของตารางของคุณ หรือคลาสอื่นที่มีคุณสมบัติสาธารณะตรงกับคอลัมน์ที่ส่งคืนมาจากคิวรี ตัวอย่างเช่น เราสามารถเขียนแบบสอบถามข้างต้นใหม่เป็น:
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 ) ;
}
คุณสามารถดำเนินการอัปเดตฐานข้อมูลระดับต่ำโดยใช้วิธี Execute
ไลบรารีแบบอะซิงโครนัสใช้ Task Parallel Library (TPL) ด้วยเหตุนี้ การใช้งานออบเจ็กต์ Task
ตามปกติ และคีย์เวิร์ด async
และ await
จึงเหมาะกับคุณ
เมื่อคุณกำหนดเอนทิตีของคุณแล้ว คุณสามารถสร้างตารางโดยอัตโนมัติโดยการเรียก 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! " ) ;
คุณสามารถแทรกแถวในฐานข้อมูลโดยใช้ Insert
หากตารางมีคีย์หลักที่เพิ่มค่าอัตโนมัติ ค่าของคีย์นั้นจะพร้อมใช้งานสำหรับคุณหลังจากการแทรก:
var stock = new Stock ( )
{
Symbol = " AAPL "
} ;
await db . InsertAsync ( stock ) ;
Console . WriteLine ( " Auto stock id: {0} " , stock . Id ) ;
มีวิธีการที่คล้ายกันสำหรับ UpdateAsync
และ DeleteAsync
การสืบค้นข้อมูลทำได้ตรงไปตรงมาที่สุดโดยใช้วิธี Table
สิ่งนี้จะส่งคืนอินสแตนซ์ AsyncTableQuery
กลับมา จากนั้นคุณสามารถเพิ่มเพรดิเคตสำหรับการจำกัดผ่านส่วนคำสั่ง WHERE และ/หรือเพิ่ม ORDER BY ฐานข้อมูลไม่ได้ถูกสัมผัสทางกายภาพจนกว่าจะมีการเรียกวิธีการดึงข้อมูลแบบพิเศษอย่างใดอย่างหนึ่ง - ToListAsync
, FirstAsync
หรือ FirstOrDefaultAsync
-
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 ) ;
มีวิธีการระดับต่ำหลายวิธีให้เลือก คุณยังสามารถสืบค้นฐานข้อมูลได้โดยตรงผ่านวิธี QueryAsync
เหนือการดำเนินการการเปลี่ยนแปลงที่จัดทำโดย InsertAsync
ฯลฯ คุณสามารถออกวิธี ExecuteAsync
เพื่อเปลี่ยนชุดข้อมูลโดยตรงภายในฐานข้อมูล
อีกวิธีที่เป็นประโยชน์คือ ExecuteScalarAsync
สิ่งนี้ช่วยให้คุณส่งกลับค่าสเกลาร์จากฐานข้อมูลได้อย่างง่ายดาย:
var count = await db . ExecuteScalarAsync < int > ( " select count(*) from Stock " ) ;
Console . WriteLine ( string . Format ( " Found '{0}' stock items. " , count ) ) ;
โดยปกติ sqlite-net จะใช้เป็น light ORM (object-relational-mapper) โดยใช้วิธี CreateTable
และ Table
อย่างไรก็ตาม คุณยังสามารถใช้วิธีนี้เป็นวิธีที่สะดวกในการดำเนินการสืบค้นด้วยตนเองได้
ต่อไปนี้เป็นตัวอย่างของการสร้างตาราง การแทรกตาราง (ด้วยคำสั่งแบบกำหนดพารามิเตอร์) และการสืบค้นตารางโดยไม่ต้องใช้คุณลักษณะ 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 " ) ;
คุณสามารถใช้ฐานข้อมูลที่เข้ารหัสได้โดยใช้แพ็คเกจ sqlite-net-sqlcipher NuGet
คีย์ฐานข้อมูลถูกตั้งค่าใน SqliteConnectionString
ที่ส่งผ่านไปยังตัวสร้างการเชื่อมต่อ:
var options = new SQLiteConnectionString ( databasePath , true ,
key : " password " ) ;
var encryptedDb = new SQLiteAsyncConnection ( options ) ;
หากคุณต้องการตั้งค่า Pragmas เพื่อควบคุมการเข้ารหัส คุณสามารถส่งการดำเนินการไปยังสตริงการเชื่อมต่อได้:
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 ) ;
ขอขอบคุณชุมชน .NET ที่สนับสนุนโครงการนี้ และขอขอบคุณผู้ร่วมให้ข้อมูลทุกคนที่มีส่วนช่วยทำให้โครงการนี้ยิ่งใหญ่ขึ้น
ขอขอบคุณ Tirza van Dijk (@tirzavdijk) สำหรับโลโก้ที่ยอดเยี่ยม!