[إجراء GitHub] [تقرير تغطية التعليمات البرمجية]
استخدم إحدى هذه الحزم:
إصدار | طَرد | وصف |
---|---|---|
sqlite-net-pcl | مكتبة .NET القياسية | |
sqlite-net-sqlcipher | مع دعم التشفير | |
sqlite-net-static | إصدار خاص يستخدم P/Invoces إلى sqlite3 الذي توفره المنصة | |
sqlite-net-base | بدون حزمة SQLitePCLRaw حتى تتمكن من اختيار المزود الخاص بك |
SQLite-net عبارة عن مكتبة مفتوحة المصدر ومحدودة للسماح لتطبيقات .NET و.NET Core وMono بتخزين البيانات في قواعد بيانات SQLite 3. تم تصميمه في البداية للعمل مع Xamarin.iOS، ولكنه تطور منذ ذلك الحين ليعمل على جميع الأنظمة الأساسية (Xamarin.*، .NET، UWP، Azure، وما إلى ذلك).
تم تصميم SQLite-net كطبقة قاعدة بيانات سريعة ومريحة. ويتبع تصميمها هذه الأهداف :
من السهل جدًا التكامل مع المشاريع الحالية ويعمل على جميع منصات .NET.
غلاف رقيق فوق 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 ; }
}
بمجرد تحديد الكائنات في النموذج الخاص بك، سيكون لديك خيار بين واجهات برمجة التطبيقات (APIs). يمكنك استخدام "واجهة برمجة التطبيقات المتزامنة" حيث يتم حظر المكالمات واحدة تلو الأخرى، أو يمكنك استخدام "واجهة برمجة التطبيقات غير المتزامنة" حيث لا يتم حظر المكالمات. قد ترغب في استخدام واجهة برمجة التطبيقات غير المتزامنة لتطبيقات الهاتف المحمول من أجل زيادة الاستجابة.
تم شرح كلا واجهات برمجة التطبيقات في القسمين أدناه.
بمجرد تحديد الكيان الخاص بك، يمكنك إنشاء الجداول تلقائيًا في قاعدة البيانات الخاصة بك عن طريق استدعاء 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 و/أو إضافة عبارات ORDER BY:
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
.
تستخدم المكتبة غير المتزامنة مكتبة المهام الموازية (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 عادةً كـ ORM خفيف (مخطط كائن علائقي) باستخدام الطريقتين 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 " ) ;
يمكنك استخدام قاعدة بيانات مشفرة باستخدام حزمة NuGet sqlite-net-sqlcipher.
يتم تعيين مفتاح قاعدة البيانات في SqliteConnectionString
الذي تم تمريره إلى مُنشئ الاتصال:
var options = new SQLiteConnectionString ( databasePath , true ,
key : " password " ) ;
var encryptedDb = new SQLiteAsyncConnection ( options ) ;
إذا كنت بحاجة إلى ضبط البراغما للتحكم في التشفير، فيمكن تمرير الإجراءات إلى سلسلة الاتصال:
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) على الشعار الرائع!