التصنيفات
Flutter

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

يكاد لايخلوا تطبيق من قواعد البيانات لادارة وتخزين قواعد البيانات للمستخدم كقائمة مهام او تخزين البيانات من قواعد بيانات خارجية الى الجوال باستخدام المزامنة مثل تويتر وانستقرام وغيرهم. اليوم ساكتب عن طريقة استخدام قواعد بيانات SQLlite في تطبيقات 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],
  );
}

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

sqflite

Persist data with SQLite

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

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

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني.