قواعد البيانات اسرع في التعامل مع البيانات من حفظ وتعديل وحذف وعرض وايضاً افضل للتعامل مع البيانات الكبيرة. في Flutter هناك الكثير من الباكجات للتعامل مع قواعد البياتات لكن هنا سنستخدم الافضل والاسهل منها وهو sqflite
. سننشئ تطبيق بسيط يقوم بحفظ قائمة المهام للمستخدم مع امكانية الاضافة والحذف والتعديل وايضاً العرض.
تثبيت المتطلبات :
للبدء في العمل على هذا التطبيق نحتاج الى اضافة باكجين الى ملف pubspec.yaml
وهما sqflite
و path
كل باكج له مهمة معينة.
- sqfite : يحتوي على جميع المتطلبات التي نحتاجها للتعامل مع قواعد البيانات من انشاء وحذف وتعديل الخ..
- path : يستخدم لتحديد المسار لقواعد البيانات في النظام.
dependencies:
flutter:
sdk: flutter
sqflite: ^1.3.1
path: ^1.6.4
انشاء كائن لقائمة المهام :
قبل البدء في عملية تحديد مسار قاعدة البيانات وحفظها نحتاج الى تعريف data model
للتعامل مع المهام وايضا لحفظها في قاعدة البيانات.
class Todo {
int id;
String title;
bool done;
Map<String, dynamic> toMap() {
var map = <String, dynamic>{
'title': title,
'done': done == true ? 1 : 0
};
if (id != null) {
map['id'] = id;
}
return map;
}
Todo();
Todo.fromMap(Map<String, dynamic> map) {
id = map['id'];
title = map['title'];
done = map['done'] == 1;
}
}
انشاء قاعدة البيانات :
قبل التعامل مع قواعد البيانات نحتاج الى انشائها والتواصل معها لاتاحة امكانية القراءة منها والكتابة عليها، وللقيام بذلك نحتاج الى القيام بخطوتين :
- تحديد المسار لقاعدة البيانات باستخدام
getDatabasePath()
. - واستخدام
openDatabase()
للفتح التواصل معها.
// Open the database and store the reference.
final Future<Database> database = openDatabase(
// Set the path to the database. Note: Using the `join` function from the
// `path` package is best practice to ensure the path is correctly
// constructed for each platform.
join(await getDatabasesPath(), 'doggie_database.db'),
);
انشاء جدول المهام في قاعدة البيانات :
الان بعد ان اصيح الاتصال مفتوح مع قاعدة البيانات سنبدا في انشاء جدول يحفظ مهام مختلفة للمستخدم. هذا الجدول في التطبيق نحتاج جدول بسيط يحتوي على ثلاث حقول :
- id : متغير
int
من Dart, ويعرف فيSQLITE
كمتغيرINTEGER
وسنقوم بتهيئة هذا الحقل كمفاح اساسي للجدول للتعامل مع الجدول بسرعة اثناء الاستعلام. - titile : متغير
String
في Dart, لكن فيSQLITE
يتم حفظة كـTEXT
. - done : متغير
int
فيDart
, ويتم تخزينة فيSQLITE
كـINTEGER
.
final Future<Database> database = openDatabase(
// Set the path to the database.
join(await getDatabasesPath(), 'todo_database.db'),
// When the database is first created, create a table to store todo.
onCreate: (db, version) {
// Run the CREATE TABLE statement on the database.
return db.execute(
"CREATE TABLE todo(id INTEGER PRIMARY KEY, title TEXT not null, done INTEGER not null)",
);
},
// Set the version. This executes the onCreate function and provides a
// path to perform database upgrades and downgrades.
version: 1,
);
اضافة مهمة الى قاعدة البيانات:
الان اصبح لديك قاعدة بيانات تحتوي على جدول المهام ، حان الوقت للبدء في قراءة وتعديل الجدول. عند البدء في اضافة مهمة تحتاج الى امرين :
- استخدام دالة
insert()
من باكجsqflite
. - تحول الكائن الى
map
باستخدامtoMap
.
Future<Todo> insert(Todo todo) async {
todo.id = await db.insert(tableTodo, todo.toMap());
return todo;
}
عرض جميع المهام:
اذا اردت في تطبيق عرض جميع المهام للمستخدم ستحتاج الى استخدام دالة query
لعرض جميع المهام او المهام المنجزة فقط. للقيام بهذه المهمة تحتاج:
- استخدام دالة
query
على جدول المهامtodo
. - تحويل الناتج من
List<Map>
الىList<Todo>
.
// A method that retrieves all the todo from the todo table.
Future<List<Todo>> todo() async {
// Get a reference to the database.
final Database db = await database;
// Query the table for all The todo.
final List<Map<String, dynamic>> maps = await db.query('todo');
// Convert the List<Map<String, dynamic> into a List<todo>.
return List.generate(maps.length, (i) {
return Todo(
id: maps[i]['id'],
name: maps[i]['title'],
age: maps[i]['done'],
);
});
}
تحديث مهمة في قاعدة البيانات :
قد تحتاج الى تعديل مهمة بعد اضافتها او اذا قام المستخدم بانجازها. يمكنك ذلك باستخدام دالة update
ولكن قبل ذلك تحتاج الى خطوتين:
- تحويل
todo
الىMap
. - استخدام
where
لتحديد المهمة المطلوبة.
Future<void> updateTodo(Todo todo) async {
// Get a reference to the database.
final db = await database;
// Update the given Todo.
await db.update(
'todo',
todo.toMap(),
// Ensure that the Todo has a matching id.
where: "id = ?",
// Pass the Todo's id as a whereArg to prevent SQL injection.
whereArgs: [todo.id],
);
}
حذف مهمة من قاعدة البيانات :
بالاضافة الى الاضافة والتعديل يمكنك ايضاً حذف مهمة من الجدول باستخدام دالة delete
وذلك بتمرير id
للمهمة الى دالة الحذف وستقوم قاعدة البيانات بحذفها مباشرة.
Future<void> deleteTodo(int id) async {
// Get a reference to the database.
final db = await database;
// Remove the Todo from the Database.
await db.delete(
'todo',
// Use a `where` clause to delete a specific todo.
where: "id = ?",
// Pass the Todo's id as a whereArg to prevent SQL injection.
whereArgs: [id],
);
}
الان اصبح لديك تطبيق كامل للتعامل مع المهام للمستخدم مع جميع مهام الاضافة والتعديل والحذف والعرض.
ووين افتح الكونكشن؟ هل يكون داخل كلاس database.dart او فالmain؟ او فوين؟
و باقي الفنكشن ل insert and delete and update هل اسويهم ف database.dart?
مرحباً،
يعتمد على طريقة بناء المشروع تقدر تستخدم class منفصل لكل العمليات حتى لفتح القاعدة
مثل موجود هنا
https://pub.dev/packages/sqflite
ياناس انا بجنن اريد اعرف متى اسوي قاعد بيانات للتطبيق فاير بيس ومتى sqlite????????????????????
انا مبتدا
sqlite هي قاعدة بيانات تعمل داخل جهازك فقط ولا تتطلب اتصال بالإنترنت، فإن كان تطبيقك لا يتطلب اتصال بالإنترنت، ولا تحتاجها أن تكون موجودة خارج جهازك.. فأفضل حل هو sqlite (أكثر سرعة ولا تتطلب سيرفر أو خدمة مثل فايربيس)
كيف يتم تخصيص مجلد لمسار قاعده بيانات غير الافتراضي
اريد اعر ف مكان ملف ال database على الجهاز وشكرا
انا عملت تطبيق واستخدمت SQLite كيف اتحكم في ملف Dbase اريد اعرف مكانه على الجهاز وكيف احمله على التطبيق على الموبايل