تخزين البيانات في الذاكره المحليه للهاتف بشكل مؤقت باستخدام Flutter
الملف المسؤول عن تخزين البيانات بشكل مؤقت داخل الذاكره المحليه للهاتف
عملية تخزين البيانات من api او حتى firebase شيئ ضروري لتطيبقك من اجل تقليل عد الطلبات على السيرفر وعدد ال read و write على سيرفر الذي يعمل به تطبيقك وايضا للمحافظة على انترنت المستخدم وليس اعادة تحميل البيانات في كل لحظه حيث يمكنك بكل بساطة ان تقوم بعمل حفظ للبيانات بشكل مؤقت في ال cache الخاص بالمستخدم وقد سبق وشرحنا لكم في دروس سابقه كيفية عمل cache للبيانات بشكل كامل في الذاكرة المحليه للهاتف يمكنك الانتقال الى المقالة وقرائها ولكن اليوم سوف نشرح كيف تقوم بعملها ولكن بشكل مؤقت .
الفائدة من تخزين البيانات بشكل مؤقت في التطبيقات ؟
تخزين البيانات مؤقتًا في التطبيقات هو عملية حفظ البيانات التي تم استخدامها مؤخرًا في مكان قريب من التطبيق. يمكن أن يساعد ذلك في تحسين أداء التطبيق وقابليته للاستخدام وتوفير الموارد.
فيما يلي بعض الفوائد المحددة لتخزين البيانات مؤقتًا:
تحسين الأداء: يمكن أن يؤدي تخزين البيانات مؤقتًا إلى تقليل وقت التحميل وتحسين استجابة التطبيق بشكل عام. وذلك لأن التطبيق لن يحتاج إلى الرجوع إلى قاعدة بيانات أو مصدر بيانات بعيد للحصول على البيانات.
تحسين قابلية الاستخدام: يمكن أن يساعد تخزين البيانات مؤقتًا في تحسين قابلية استخدام التطبيق. على سبيل المثال، يمكن استخدام ذاكرة التخزين المؤقت لحفظ بيانات تسجيل الدخول الخاصة بالمستخدم، بحيث لا يضطر المستخدم إلى تسجيل الدخول مرة أخرى في كل مرة يفتح فيها التطبيق.
توفير الموارد: يمكن أن يساعد تخزين البيانات مؤقتًا في توفير الموارد. على سبيل المثال، يمكن استخدام ذاكرة التخزين المؤقت لحفظ الصور المصغرة للصور، بدلاً من تحميل الصورة الكاملة في كل مرة يتم عرضها.
فيما يلي بعض الأمثلة على كيفية استخدام التخزين المؤقت للبيانات في التطبيقات:
في متصفح الويب، يمكن استخدام ذاكرة التخزين المؤقت لتخزين صور مواقع الويب وصفحات الويب الأخرى. يؤدي ذلك إلى تقليل وقت تحميل الصفحات وتحسين أداء المتصفح بشكل عام.
في تطبيق البريد الإلكتروني، يمكن استخدام ذاكرة التخزين المؤقت لتخزين رسائل البريد الإلكتروني التي تم فتحها مؤخرًا. يؤدي ذلك إلى تقليل وقت تحميل الرسائل وتحسين تجربة المستخدم.
في تطبيق الوسائط الاجتماعية، يمكن استخدام ذاكرة التخزين المؤقت لتخزين الصور ومقاطع الفيديو التي تمت مشاهدتها مؤخرًا. يؤدي ذلك إلى تقليل استخدام البيانات وتحسين تجربة المستخدم.
بشكل عام، يمكن أن يكون تخزين البيانات بشكل مؤقت أداة قوية يمكن استخدامها لتحسين أداء التطبيقات وقابليتها للاستخدام وتوفير الموارد.
timer to save data in cache
في البداية عليك بإنشاء هذا ال class والذي يكون عباره عن البيانات التي سوف نقوم بتخزينها وهنا قمنا بعمل list للحصول على البيانات واخرى لتسجيل البيانات ويمكنك حذف بيانات معينه من الcache او حذفها جميعها كما هو موضح بالاكواد التاليه .
localDataSource.dart
abstract class LocalDataSource {
Future<List<ArticlesModel>> getHomeData();
Future<List<YoutubeModel>> getVideoData();
Future<void> saveHomeData(List<ArticlesModel> data);
Future<void> saveVideoData(List<YoutubeModel> data);
void clearCache();
void removeFromCache(String key);
}
class LocalDataSourceImpl implements LocalDataSource {
// run time cache
Map<String, CachedItem> cacheMap = Map();
@override
Future<List<ArticlesModel>> getHomeData() async {
CachedItem? cachedItem = cacheMap[AppStringSharedPreferences.isLoadingHome];
if (cachedItem != null && cachedItem.isValid(CACHE_HOME_INTERVAL)) {
return cachedItem.data;
} else {
throw 'error';
}
}
@override
Future<List<YoutubeModel>> getVideoData() {
CachedItem? cachedItem = cacheMap[AppStringSharedPreferences.isLoadingVideo];
if (cachedItem != null && cachedItem.isValid(CACHE_BANNER_INTERVAL)) {
return cachedItem.data;
} else {
throw 'error';
}
}
@override
Future<void> saveVideoData(List<YoutubeModel> data) async {
cacheMap[AppStringSharedPreferences.isLoadingVideo] = CachedItem(data);
}
@override
Future<void> saveHomeData(List<ArticlesModel> data) async {
cacheMap[AppStringSharedPreferences.isLoadingHome] = CachedItem(data);
}
@override
void clearCache() {
cacheMap.clear();
}
@override
void removeFromCache(String key) {
cacheMap.remove(key);
}
}
class CachedItem {
dynamic data;
int cacheTime = DateTime.now().millisecondsSinceEpoch;
CachedItem(this.data);
}
extension CachedItemExtension on CachedItem {
bool isValid(int expirationTimeInMillis) {
int currentTimeInMillis = DateTime.now().millisecondsSinceEpoch;
bool isValid = currentTimeInMillis - cacheTime <= expirationTimeInMillis;
// expirationTimeInMillis -> 60 sec
// currentTimeInMillis -> 1:00:00
// cacheTime -> 12:59:30
// valid -> till 1:00:30
return isValid;
}
}
التحقق من الذاكره المؤقته هل تحتوي على بيانات مخزنه ام لا وكيفية استعادة وتخزين البيانات
الان ناتي لعملية عرض البيانات او تخزينها مع اول استخدام للسيرفر , وهنا قمنا بعمل tyr اذا نجحت العملية سوف نقوم بالحصول على البيانات من قاعدة البيانات المحليه وهذا يعني انها موجوده بالفعل واذا لم تكن كذلك سوف نقوم بعرضها وتخزينها في ال cache كما هو موضح وفي المره المقبلة سوف نقوم بعرضها من الكاش بشكل مباشر ويمكنك التحكم بالوقت الخاص بالتخزين من خلال ال class الموجود بالاعلى والمسؤول عن هذه العملية .
check.dart
class CheckDataCacheHomeUC {
final LocalDataSource localDataSource;
CheckDataCacheHomeUC(this.localDataSource);
Future<List<ArticlesModel>> loadData(BuildContext context) async {
try {
final response = await localDataSource.getHomeData();
return response;
} catch (e) {
// if (response.isEmpty) {
List<ArticlesModel> articles = [];
final String response = await rootBundle.loadString('assets/json/home_art.json');
final data = await json.decode(response);
for(int i = 0; i < (data as List).length; i++) {
articles.add(ArticlesModel(
name: data[i]['name'],
path: data[i]['path'],
write: data[i]['write'],
link: data[i]['link'])));
localDataSource.saveHomeData(articles);
print(articles.length);
return articles;
}
}
}