اذهب إلى المحتوى

السؤال

نشر

تحيه طيبه للجميع

قمت بعمل صفحة تجلب البيانات للمستخدمين من خلال api  ثم قمت بتخزينها في  path_provider من بعد اول مره تنعرض فيها حتى يتم تحميلها في المرة التأليه بشكل اسرع للمستخدم. تم تخزين البيانات وجلبها من  path_provider بشكل ممتاز ولكن احتاج الى معرفة كيف يمكنني تحديث الملف التي تم تخزين البيانات فيه ك مثال انا اجلب قائمة أسماء القائمة هذا تم تخزينها مسبقاً في  path_provider ولكن بعد فترة تم إضافة أسماء جديده او تم حذف أسماء من القائمة بمعنى تم تحديث هذا القائمة في قاعدة البيانات الان كيف يمكن ابلاغ path_provider ان القائمة التي لدينا أصبحت قديمة واحنا محتاجين الى ان تعمل لتحفظ القائمة الجديدة ؟

كود الصفحة كامل لدي كالتالي:

void main() {
  runApp( proviedsave());
}

class proviedsave extends StatefulWidget {
  const proviedsave({Key? key}) : super(key: key);

  @override
  _proviedsaveState createState() => _proviedsaveState();
}

class _proviedsaveState extends State<proviedsave> {

  final _baseUrl = 'https://jsonplaceholder.typicode.com/posts';

  @override
  void initState() {
    _firstLoad();

  }

  bool _isFirstLoadRunning=false;

  _firstLoad() async {
    setState(() {
      _isFirstLoadRunning = true;
    });

    String fileName = "userdata.json";
    var dir = await getTemporaryDirectory();
    File file = new File(dir.path + "/" + fileName);
    if (file.existsSync()) {
      print("Loading from cache");
      //var jsonData = file.readAsStringSync();
      var jsonData = await jsonDecode(await file.readAsString());
      // var responsebody = json.encode(jsonData);

      return jsonData;

    } else {
      print("Loading from API");
      var response = await http.get(Uri.parse('$_baseUrl'));

      if (response.statusCode == 200) {

        var responsebody = jsonDecode(response.body);

        //save json in local file
        // file.writeAsStringSync(responsebody.toString(), flush: true, mode: FileMode.write);
        file.writeAsStringSync(jsonDecode(responsebody), flush: true, mode: FileMode.write);
        return responsebody;

      }
    }


    setState(() {
      _isFirstLoadRunning = false;
    });
  }



  @override
  Widget build(BuildContext context) {
    return MaterialApp(home: Scaffold(body: ListView(shrinkWrap: true,scrollDirection: Axis.vertical,children: [
      Text('sssssssss'),

      FutureBuilder(
          future: _firstLoad(),
          builder: (context, AsyncSnapshot snapshot) {
            if (snapshot.hasData) {
              return ListView.builder(
                  physics: ScrollPhysics(),
                  scrollDirection: Axis.vertical,
                  shrinkWrap: true,
                  itemCount: snapshot.data.length.clamp(0, 6),
                  itemBuilder: (context, index) {

                    print('2=====================${json.encode(snapshot.data)}');
                    print('1=====================${snapshot.data}');


                    return
                      Card(
                        // elevation: 1,
                        child: Container(
                          padding: EdgeInsets.all(6),
                          child: ListTile(
                            title: Text(snapshot.data[index]['title'].toString()),
                            // subtitle: Text(snapshot.data[index]['body'].toString()),
                          ),
                        ),
                      );
                  }
              );

            } else if (snapshot.hasError) {

              return Center(
                  child: Image.asset(
                    'assets/no_dataa.png',
                    fit: BoxFit.contain,
                    width: 180,
                    height: 180,
                  ));

            }
            // By default, show a loading spinner.
            return _isFirstLoadRunning? SizedBox(
              height: MediaQuery.of(context).size.height / 1.3,
              child: Center(
                child: CircularProgressIndicator(
                  valueColor:
                  new AlwaysStoppedAnimation<Color>(Colors.black),
                ),
              ),
            ):Center(
                child: SizedBox(
                  height: MediaQuery.of(context).size.height / 1.3,
                  child: Image.asset(
                    'assets/EmptyFavorite.png',
                    fit: BoxFit.contain,
                    width: 370,
                    height: 370,
                  ),
                ));
          }

      )
    ]),),);
  }
}

 

شكرا لكم

Recommended Posts

  • 1
نشر

لا مانع من عمل استعلام مع قاعدة البيانات للتحقق من وجود تحديثات أو عدم وجودهم.

كيف نعلم أن البيانات لدينا محدًثة؟ 

  • إما عن طريق timestamp أي وقت يحوي توقيت آخر تعديل حدث على المستخدمين في قاعدة البيانات و نمرره مع البيانات و نخزنه في التطبيق يعمل backend على التحقق منه 
  • أو طريقة أخرى مثلاً من خلال ID آخر مستخدم مضاف..

سوف يرسل التطبيق توقبت آخر تحديث للملف

final _baseUrl = 'https://website.com/data.php?last_update=time...';
                                               ^^^^^^^^^^^^^^^^^^^

تقوم بتخزين last_update في shared_preferencs 

يرسل الخادم البيانات على الشكل التالي مثلاً

  • يوجد تحديث: نستخلص new_data ونخزنها في الملف
{
	status: need_update,  => تحديث الملف في التطبيق
	time_stamp: time      =>   آخر تحديث في قاعدة البيانات
	new_data = [users]
}
  • لايوجد تحديث: نستعمل الملف المحلي
{
	status: uptodate
}

 

توقيت آخر تعديل لجدول قواعد بيانات MySQL

SELECT UPDATE_TIME
FROM   information_schema.tables
WHERE  TABLE_SCHEMA = 'dbname'
   AND TABLE_NAME = 'tabname'

 

  • 0
نشر
بتاريخ منذ ساعة مضت قال Wael Aljamal:

لا مانع من عمل استعلام مع قاعدة البيانات للتحقق من وجود تحديثات أو عدم وجودهم.

كيف نعلم أن البيانات لدينا محدًثة؟ 

  • إما عن طريق timestamp أي وقت يحوي توقيت آخر تعديل حدث على المستخدمين في قاعدة البيانات و نمرره مع البيانات و نخزنه في التطبيق يعمل backend على التحقق منه 
  • أو طريقة أخرى مثلاً من خلال ID آخر مستخدم مضاف..

سوف يرسل التطبيق توقبت آخر تحديث للملف


final _baseUrl = 'https://website.com/data.php?last_update=time...';
                                               ^^^^^^^^^^^^^^^^^^^

تقوم بتخزين last_update في shared_preferencs 

يرسل الخادم البيانات على الشكل التالي مثلاً

  • يوجد تحديث: نستخلص new_data ونخزنها في الملف

{
	statue: need_update,  => تحديث الملف في التطبيق
    time_stamp: time      =>   آخر تحديث في قاعدة البيانات
    new_data = [users]
}
  • لايوجد تحديث: نستعمل الملف المحلي

{
	statue: uptodate
}

 

مرحبا اخي الكريم

اعتذر لك ولكن حقيقه لم افهم لا الطريقة الأولى ولا الثانية ياليت تشرح الفكرة اكثر لو امكن

  • 0
نشر
بتاريخ 4 دقائق مضت قال مروان مروان3:

مرحبا اخي الكريم

اعتذر لك ولكن حقيقه لم افهم لا الطريقة الأولى ولا الثانية ياليت تشرح الفكرة اكثر لو امكن

نفس الفكرة، اعتمد على طابع زمني.

ترسل زمن اخر تحديث للملف على التطبيق للخادم، إن كان زمنه قبل زمن اخر تعديل في قاعدة البيانات ترسل البيانات الجديدة وإلا ترسل أنه بيانات التطبيق حديثة 

  • 0
نشر
بتاريخ 17 ساعات قال Wael Aljamal:

لا مانع من عمل استعلام مع قاعدة البيانات للتحقق من وجود تحديثات أو عدم وجودهم.

كيف نعلم أن البيانات لدينا محدًثة؟ 

  • إما عن طريق timestamp أي وقت يحوي توقيت آخر تعديل حدث على المستخدمين في قاعدة البيانات و نمرره مع البيانات و نخزنه في التطبيق يعمل backend على التحقق منه 
  • أو طريقة أخرى مثلاً من خلال ID آخر مستخدم مضاف..

سوف يرسل التطبيق توقبت آخر تحديث للملف


final _baseUrl = 'https://website.com/data.php?last_update=time...';
                                               ^^^^^^^^^^^^^^^^^^^

تقوم بتخزين last_update في shared_preferencs 

يرسل الخادم البيانات على الشكل التالي مثلاً

  • يوجد تحديث: نستخلص new_data ونخزنها في الملف

{
	status: need_update,  => تحديث الملف في التطبيق
	time_stamp: time      =>   آخر تحديث في قاعدة البيانات
	new_data = [users]
}
  • لايوجد تحديث: نستعمل الملف المحلي

{
	status: uptodate
}

 

توقيت آخر تعديل لجدول قواعد بيانات MySQL


SELECT UPDATE_TIME
FROM   information_schema.tables
WHERE  TABLE_SCHEMA = 'dbname'
   AND TABLE_NAME = 'tabname'

 

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

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...