آموزش استفاده از دیتابیس آماده در فلاتر
استفاده از دیتابیس و ذخیره سازی دائمی اطلاعات در بیشتر برنامه ها مورد استفاده قرار میگیرد. در فریمورک فلاتر هم امکان استفاده از ORM های مختلف برای کار با دیتابیس وجود دارد و هم به شکل مستقیم میتوانید با دیتابیس SQLite کار کنید و عملیات های مورد نظر را اجرا کنید.
کاربرد دیتابیس در برنامه نویسی فلاتر
دیتابیس یک ابزار قدرتمند در برنامهنویسی است که به برنامهنویسان اجازه میدهد اطلاعات را به صورت ساختارمند ذخیره و مدیریت کنند. در اپلیکیشنها، دیتابیسها نقش بسیار مهمی ایفا میکنند و برای ذخیره و بهروزرسانی اطلاعات کاربران، تنظیمات، محتوا، اطلاعات مربوط به نرمافزار و غیره استفاده میشوند. برخی از کاربردهای دیتابیس در اپلیکیشنها عبارتند از:
- ذخیره دادههای کاربران: دیتابیسها به برنامهنویسانها امکان میدهند تا اطلاعات کاربران را به صورت امن و ساختارمند ذخیره کنند. اطلاعات مانند نام، ایمیل، رمزعبور و سایر جزئیات کاربری میتواند در دیتابیس ذخیره شود.
- ذخیره تنظیمات و ترجیحات: برنامهها ممکن است تنظیمات و ترجیحات کاربر را برای بهبود تجربه کاربری آنها ذخیره کنند. این اطلاعات معمولاً در دیتابیس ذخیره میشود تا بتواند پس از خروج و ورود مجدد کاربر به برنامه حفظ شود.
- ذخیره محتوا: اگر برنامهای محتوایی دارد مانند پستها، تصاویر، ویدئوها و غیره، این محتواها به طور معمول در دیتابیس ذخیره میشوند تا به سادگی بتوان به آنها دسترسی داشته و مدیریت کرد.
- سینک داده بین دستگاهها: برنامههایی که بر روی چندین دستگاه مختلف اجرا میشوند ممکن است نیاز به همگامسازی دادهها بین این دستگاهها داشته باشند. دیتابیسها بهعنوان یک مکان مشترک برای ذخیره دادهها عمل میکنند و سینک کردن دادهها بین دستگاهها را آسانتر میکنند.
- تحلیل دادهها: اپلیکیشنها ممکن است نیاز به جمعآوری و تحلیل دادههای مختلف داشته باشند. با استفاده از دیتابیسها، میتوان اطلاعات مربوط به رفتار کاربران، نحوه استفاده از برنامه و غیره را جمعآوری و تحلیل کرد.
در نتیجه، دیتابیسها نقش بسیار مهمی در اپلیکیشنها ایفا میکنند و برنامهنویسان برای مدیریت و ذخیره سازی دادهها از آنها بهرهمند میشوند.
انتخاب نوع دیتابیس مناسب براساس نیازها و محدودیتهای اپلیکیشن مهم است و ممکن است به یک دیتابیس SQL مانند MySQL یا PostgreSQL یا دیتابیس NoSQL مانند MongoDB یا Firebase توجه شود.
استفاده از دیتابیس آماده در اپلیکیشن
در بعضی از اپلیکیشن ها یک پایگاه داده آماده از قبل در اختیار داریم و قصد داریم که از این دیتابیس در برنامه استفاده کنیم. برای مثال پایگاه داده ای شامل لغات یا دایرة المعارف در اختیار داریم و یک برنامه برای کار با این اطلاعات میخواهیم طراحی کنیم.
در این حالت روش کار بسیار شبیه به کار کردن با دیتابیس عادی 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 بررسی میکنیم آیا اطلاعاتی دریافت شده است یا خیر. اگر اطلاعاتی وجود داشت عنوان ایندکس اول را نمایش میدهیم.
شما میتوانید بجای نمایش فقط اطلاعات یک ایندکس از لیست ویو استفاده کنید و اطلاعات همه رکورد ها را نمایش دهید.
برای کار با دیتابیس های آنلاین که بروی سرورهای ابری مستقر هستند نیاز به دسترسی اینترنت و ارتباط با سرور در فلاتر هستید.
مطالب زیر را حتما مطالعه کنید
آموزش پیاده سازی لینت Lint در برنامه نویسی فلاتر
آموزش الگوی تزریق وابستگی در فلاتر Dependency Injection
کتاب های آموزش برنامه نویسی فلاتر + دانلود PDF
آموزش نصب فلاتر و رفع خطاهای رایج ساخت پروژه + ویدیو
آموزش استفاده از نقشه در فلاتر
آموزش ساخت Navigation Drawer در فلاتر
4 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
سلام
عالی بود. خیلی ممنون…
با تشکر
اگه فایل Json بود با همین روش میشه ؟
فایل جیسون و با دستور rootbundle.loadString(‘assets/file’) از داخل assets میشه فراخوانی کرد باقی موارد مثل تجزیه جیسون هست.
چرا این فایل دیتابیس دانلود نمیشه؟