آموزش استفاده از دیتابیس آماده در فلاتر
استفاده از دیتابیس و ذخیره سازی دائمی اطلاعات در بیشتر برنامه ها مورد استفاده قرار میگیرد. در فریمورک فلاتر هم امکان استفاده از ORM های مختلف برای کار با دیتابیس وجود دارد و هم به شکل مستقیم میتوانید با دیتابیس SQLite کار کنید و عملیات های مورد نظر را اجرا کنید.
در بعضی از اپلیکیشن ها یک پایگاه داده آماده از قبل در اختیار داریم و قصد داریم که از این دیتابیس در برنامه استفاده کنیم. برای مثال پایگاه داده ای شامل لغات یا دایرة المعارف در اختیار داریم و یک برنامه برای کار با این اطلاعات میخواهیم طراحی کنیم.
در این حالت روش کار بسیار شبیه به کار کردن با دیتابیس عادی SQLite در فلاتر میباشد و فقط کافیست به شکل صحیح مسیریابی را انجام دهیم تا برنامه به فایل دیتابیس دسترسی پیدا کند.
برای شروع ابتدا نیاز به یک فایل دیتابیس داریم که اگر چنین فایلی در اختیار ندارید میتوانید از فایل انتهای صفحه استفاده کنید.
این فایل شامل جدول های مختلفی است که برای آموزش فقط میخواهیم اطلاعات جدول album را واکشی کنیم.
اضافه کردن دیتابیس به پروژه
در اولین قدم باید فایل پایگاه داده را وارد پروژه کنیم. همانطور که میدونید فایل های خارجی که در فلاتر از آنها استفاده میکنیم را داخل پوشه assets قرار میدهیم.
flutter:
assets:
- assets/chinook.db
نام فایل پایگاه داده chinook.db است و به شکل بالا در فایل pubspec.yaml آن را قرار داده ایم. همچنین تمام پکیج هایی که در زمان کار با دیتابیس از آنها استفاده میکنیم را نیز در این پروژه باید اضافه کنید.
بروی دکمه Pub get کلیک کنید تا تنظیمات جدید در پروژه ثبت شود.
برای جدول album یک کلاس مدل همانند تصویر زیر ایجاد میکنیم.
class Album {
int? albumId;
String? title;
int? artistId;
Album({required this.albumId, required this.title, required this.artistId});
Album.fromJson(Map<dynamic, dynamic> json) {
albumId = json['AlbumId'];
title = json['Title'];
artistId = json['ArtistId'];
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = new Map<String, dynamic>();
data['AlbumId'] = this.albumId;
data['Title'] = this.title;
data['ArtistId'] = this.artistId;
return data;
}
}
متد جدیدی به نام CheckDB ایجاد میکنیم که وظیفه آن در ابتدا بررسی وجود داشتن دیتابیس است و سپس باز کردن فایل دیتابیس.
به دلیل اینکه این متد یک لیست بازگردانی میکند آن را از نوع Future قرار میدهیم.
Future<List<Album>> CheckDB() async{
var databasesPath = await getDatabasesPath();
var path = join(databasesPath, "chinook.db");
var exists = await databaseExists(path);
if (!exists) {
print("Creating new copy from asset");
try {
await Directory(dirname(path)).create(recursive: true);
} catch (_) {}
ByteData data = await rootBundle.load(join("assets", "chinook.db"));
List<int> bytes =
data.buffer.asUint8List(data.offsetInBytes, data.lengthInBytes);
await File(path).writeAsBytes(bytes, flush: true);
} else {
print("Opening existing database");
}
var db = await openDatabase(path, readOnly: true);
List<Map> result =await db.query("albums");
return result.map((e) => Album.fromJson(e)).toList();;
}
با استفاده از متد databaseExists بررسی میکنیم آیا چنین پایگاه داده ای وجود دارد یا خیر و در صورت وجود نداشتن یک پایگاه داده با همین نام فایلی ایجاد میکنیم.
سپس با کمک متد openDatabase فایل پایگاه داده را آماده کرده و یک نمونه از کلاس دیتابیس به نام db ایجاد میکنیم. با استفاده از این نمونه هر عملیاتی که نیاز داشته باشیم را میتوانیم روی دیتابیس انجام دهیم.
از دستور db.query برای دریافت لیست کامل رکورد های جدول album استفاده میکنیم و بعد از تبدیل آن به یک لیست عادی آن را به وسیله متد بازگردانی میکنیم.
در متد build از ویجت FutureBuilder برای نمایش اطلاعات استفاده میکنیم.
FutureBuilder(
future: CheckDB(),
builder: (context,AsyncSnapshot<List> snap){
if(snap.hasData){
return Center(child: Text(snap.data![0].title.toString()),);
}else{
return Center(child: Text("Waiting..."),);
}
},
)
به عنوان ویژگی future نام متدی که طراحی کردیم را قرار میدهیم سپس در بخش builder بررسی میکنیم آیا اطلاعاتی دریافت شده است یا خیر. اگر اطلاعاتی وجود داشت عنوان ایندکس اول را نمایش میدهیم.
شما میتوانید بجای نمایش فقط اطلاعات یک ایندکس از لیست ویو استفاده کنید و اطلاعات همه رکورد ها را نمایش دهید.
مطالب زیر را حتما مطالعه کنید
آموزش پیاده سازی دیتابیس ObjectBox در فلاتر
آموزش اتصال اپلیکیشن فلاتر به پرینتر بلوتوثی
آموزش پیاده سازی معماری MVVM در فلاتر
روش های افزایش امنیت اپلیکیشن در فلاتر
آموزش کار با پکیج Freezed در فلاتر
آموزش ویجت SafeArea در فلاتر
4 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
سلام
عالی بود. خیلی ممنون…
با تشکر
اگه فایل Json بود با همین روش میشه ؟
فایل جیسون و با دستور rootbundle.loadString(‘assets/file’) از داخل assets میشه فراخوانی کرد باقی موارد مثل تجزیه جیسون هست.
چرا این فایل دیتابیس دانلود نمیشه؟