استخدام قواعد البيانات في Flutter

قواعد البيانات اسرع في التعامل مع البيانات من حفظ وتعديل وحذف وعرض وايضاً افضل للتعامل مع البيانات الكبيرة. في 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],
  );
}

الان اصبح لديك تطبيق كامل للتعامل مع المهام للمستخدم مع جميع مهام الاضافة والتعديل والحذف والعرض.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *

8 أفكار عن “استخدام قواعد البيانات في Flutter”

  1. ووين افتح الكونكشن؟ هل يكون داخل كلاس database.dart او فالmain؟ او فوين؟
    و باقي الفنكشن ل insert and delete and update هل اسويهم ف database.dart?

    1. sqlite هي قاعدة بيانات تعمل داخل جهازك فقط ولا تتطلب اتصال بالإنترنت، فإن كان تطبيقك لا يتطلب اتصال بالإنترنت، ولا تحتاجها أن تكون موجودة خارج جهازك.. فأفضل حل هو sqlite (أكثر سرعة ولا تتطلب سيرفر أو خدمة مثل فايربيس)

  2. انا عملت تطبيق واستخدمت SQLite كيف اتحكم في ملف Dbase اريد اعرف مكانه على الجهاز وكيف احمله على التطبيق على الموبايل