ورود و عضویت
0
سبد خرید شما خالی است
0
سبد خرید شما خالی است

کار با SQLite و دیتابیس آفلاین در فلاتر

8 دیدگاه
موضوع این نوشته را وارد کنید
10 دقیقه برای مطالعه

در این آموزش قراره با دیتابیس محلی SQLite کار کنیم و وارد کردن ,آپدیت کردن و پاک کردن داده از دیتابیس محلی را یاد بگیریم چون خیلی مواقع به آن نیاز داریم که اطلاعات را در حالت افلاین ذخیره کنیم به طور مثال اپلیکیشن های کتاب یا اپ های انلاین که گاهی نیاز داریم یک سری اطلاعاتش در دیتابیس محلی ذخیره کنیم پس بی وقفه سراغ یادگیری ان می رویم.

مراحل آموزش به شرح زیر است

  1. اضافه کردن وابستگی ها
  2. تعریف مدل Dog
  3. باز کردن دیتابیس
  4. ساخت جدول dogs
  5. وارد کردن اطلاعات در دیتابیس
  6. بازیابی لیستی از اطلاعات
  7. آپدیت اطلاعات از دیتابیس
  8. پاک کردن از دیتابیس

1) اضافه کردن وابستگی ها

پکیج sqflite در فلاتر برای کار با دیتابیس کلاس ها و متد هایی را ارائه می دهد پس به قسمت dependencies رفته و پکیج را به صورت زیر وارد کنید.

علاوه بر آن به پکیج path نیز نیاز داریم.

dependencies:
  flutter:
    sdk: flutter
  sqflite:
  path:

برای اینکه بتوانید از این پکیج استفاده کنید باید در کلاس مورد نظر آن را import کنید.

import 'dart:async';
import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';

2)تعریف مدل Dog

قبل از ساخت جدول و ذخیره ی اطلاعات نیاز به داشتن مدلی از داده ها داریم که در نمونه ی ما Dog است که دارای یک ایدی منحصر به فرد , نام و سن نیز می باشد پس کلاس مورد نظر برای ساخت این مدل را مطابق با زیر می سازیم.

class Dog {
  final int id;
  final String name;
  final int age;

  Dog({this.id, this.name, this.age});
}

3)باز کردن دیتابیس

قبل از انکه بتوانید اطلاعاتی را از دیتابیس بخوانید با بنویسید باید ان را باز کنید برای اینکار ادرس دیتابیس را تعریف کرده و نام دیتابیس مورد نظر را به آن می دهیم.

final Future<Database> database = openDatabase(
  
  join(await getDatabasesPath(), 'doggie_database.db'),
);

4)ساخت جدول dogs

خوب بریم سراغ ساخت جدول مورد نظر که دارای id که منحصر به فرد است یک name و در نهایت age

final Future<Database> database = openDatabase(
  
  join(await getDatabasesPath(), 'doggie_database.db'),
 
  onCreate: (db, version) {
   
    return db.execute(
      "CREATE TABLE dogs(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)",
    );
  },
 
  version: 1,
);

با استفاده از INTEGER PRIMARY KEY متغیر را منحصر به فرد کرده و Version مورد نظر را به ان می دهیم که آن عملگرد oncreate را اجرا می کند و مسیر انجام ارتقا داده را هدایت می کند.

5)وارد کردن اطلاعات در دیتابیس

حالا که یک جدول با یک دیتابیس داریم نیاز داریم که اطلاعاتی را وارد آن کنیم در مرحله ی اول باید مدل ساخته شده خود را به Map تبدیل کنیم سپس از متد insert برای ذخیره در جدول مورد نظر dogs استفاده کنیم.

class Dog {
  final int id;
  final String name;
  final int age;

  Dog({this.id, this.name, this.age});

  
  Map<String, dynamic> toMap() {
    return {
      'id': id,
      'name': name,
      'age': age,
    };
  }
}


Future<void> insertDog(Dog dog) async {
 
  final Database db = await database;

  await db.insert(
    'dogs',
    dog.toMap(),
    conflictAlgorithm: ConflictAlgorithm.replace,
  );
}

final fido = Dog(
  id: 0,
  name: 'Fido',
  age: 35,
);

await insertDog(fido);

6)بازیابی لیستی از اطلاعات

حالا که یک Dog در دیتابیس مورد نظر وارد کردیم بیایید آن را از دیتابیس بازیابی کنیم که در نهایت اطلاعات بیرون کشیده شود.

در مرحله ی اول لیستی از Map ایجاد میکنیم و اطلاعات را داخل ان قرار می دهیم سپس ان را به لیست مورد نظر یعنی مدل مان تبدیل می کنیم.

Future<List<Dog>> dogs() async {

  final Database db = await database;


  final List<Map<String, dynamic>> maps = await db.query('dogs');


  return List.generate(maps.length, (i) {
    return Dog(
      id: maps[i]['id'],
      name: maps[i]['name'],
      age: maps[i]['age'],
    );
  });
}


print(await dogs()); 

7)اپدیت اطلاعات از دیتابیس

بعد از وارد کردن اطلاعات در دیتابیس بعدا شاید نیاز داشته باشیم ان را اپدیت کنیم برای این کار از متد update استفاده می کنیم که نیاز داریم ابتدا به Map اطلاعات جایگزین را تبدیل کنیم و سپس از این متد استفاده کنیم.

Future<void> updateDog(Dog dog) async {

  final db = await database;


  await db.update(
    'dogs',
    dog.toMap(),
 
    where: "id = ?",

    whereArgs: [dog.id],
  );
}


await updateDog(Dog(
  id: 0,
  name: 'Fido',
  age: 42,
));


print(await dogs()); 

البته یادمان باشه همیشه از whereArgs در این متد به کار بگیریم زیرا از حملات در برابر تزریق Sql محافظت می شود .

8)پاک کردن از دیتابیس

برای پاک کردن هم می تونید از متد delete استفاده کنید .

Future<void> deleteDog(int id) async {

  final db = await database;


  await db.delete(
    'dogs',
   
    where: "id = ?",
 
    whereArgs: [id],
  );
}

مثال کامل از مطالب بیان شده

دیتابیس SQLite
دیتابیس SQLite
import 'dart:async';

import 'package:path/path.dart';
import 'package:sqflite/sqflite.dart';

void main() async {
  final database = openDatabase(
    
    join(await getDatabasesPath(), 'doggie_database.db'),

    onCreate: (db, version) {
      return db.execute(
        "CREATE TABLE dogs(id INTEGER PRIMARY KEY, name TEXT, age INTEGER)",
      );
    },
   
    version: 1,
  );

  Future<void> insertDog(Dog dog) async {

    final Database db = await database;


    await db.insert(
      'dogs',
      dog.toMap(),
      conflictAlgorithm: ConflictAlgorithm.replace,
    );
  }

  Future<List<Dog>> dogs() async {

    final Database db = await database;


    final List<Map<String, dynamic>> maps = await db.query('dogs');


    return List.generate(maps.length, (i) {
      return Dog(
        id: maps[i]['id'],
        name: maps[i]['name'],
        age: maps[i]['age'],
      );
    });
  }

  Future<void> updateDog(Dog dog) async {

    final db = await database;


    await db.update(
      'dogs',
      dog.toMap(),

      where: "id = ?",

      whereArgs: [dog.id],
    );
  }

  Future<void> deleteDog(int id) async {

    final db = await database;


    await db.delete(
      'dogs',
  
      where: "id = ?",

      whereArgs: [id],
    );
  }

  var fido = Dog(
    id: 0,
    name: 'Fido',
    age: 35,
  );


  await insertDog(fido);


  print(await dogs());


  fido = Dog(
    id: fido.id,
    name: fido.name,
    age: fido.age + 7,
  );
  await updateDog(fido);


  print(await dogs());


  await deleteDog(fido.id);

 
  print(await dogs());
}

class Dog {
  final int id;
  final String name;
  final int age;

  Dog({this.id, this.name, this.age});

  Map<String, dynamic> toMap() {
    return {
      'id': id,
      'name': name,
      'age': age,
    };
  }


  @override
  String toString() {
    return 'Dog{id: $id, name: $name, age: $age}';
  }
}

امیدوارم از یکی دیگر از آموزش های فلاتر لذت برده باشید .

8 پاسخ به “کار با SQLite و دیتابیس آفلاین در فلاتر”

  1. mr گفت:

    خیلی خوب بود ♥ دمتون گرم

  2. amir گفت:

    سلام، برای یک اپ مثل تلگرام که وقتی واردش میشم بعدش ازمون شماره مگیره و کد … بعدش میرم تو برنامه . خب زمانی که برنامه رو میبندیم و میایم بیرون و دوباره وارد میشیم میبینیم که دیگه برنامه از ما شماره تلفت و … نمیخواد و مستقیم وارد میشه . این یعنی در دیتابیس داخلی برنامه سیو شده و با هر بار باز کردن برنماه دیگه از ما شماره و … نمیخواد …
    برای این کار میشه از sqlite استفاده کرد ، اگر میشه، لطفا میشه در بارش یک مثال بزنید. به ایمیلم یا همینجا یک پست در بارش بنویسید.

  3. Evbi گفت:

    سلام
    چطور دیتابیس افلاین خودمون رو در سورس قسمت assets قرار بدیم هیج جا اموزشی نیست
    تشمر

    • Hesam گفت:

      سلام
      کافی فقط دیتابیس رو داخل پروژه بذارید و داخل فایل pubspec در قسمت asset مسیر دیتابیس و را قرار دهید سپس در کلاس دیتابیس خودتون مسیری که فایل دیتابیس قرار داره را جایگزین کنید.

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

پژمان
10 مارس 2020
آموزش فارسی فلاتر
آموزش فارسی flutter