شارك المقالة

كيفية استخدام Hive في Flutter لإدارة البيانات بكفاءة

كيفيه حفظ وعرض البيانات في Hive باستخدام algorithm

في عالم تطوير تطبيقات الهاتف باستخدام Flutter، تُعتبر إدارة البيانات واحدة من أهم التحديات التي يواجهها المطورون. في هذا المقال، سنقوم بتحليل كود Flutter يستخدم Hive كقاعدة بيانات محلية، ونشرح كيفية عمل كل جزء منه. سنتعرف على كيفية إضافة البيانات واسترجاعها بطرق فعالة، مع التركيز على تحسين الأداء.

class TestScreen extends StatelessWidget {
  const TestScreen({super.key});

  @override
  Widget build(BuildContext context) {
    var controller = TextEditingController();
    var controllerAge = TextEditingController();

    Future<Box<Person>> _openPersonBox() async {
      return await Hive.openBox<Person>('peopleBox');
    }

    Future<Box<List<int>>> _openKeysBox() async {
      return await Hive.openBox<List<int>>('sortedKeysBox');
    }

    int _findInsertionIndex(List<int> keys, int newAge, Box<Person> box) {
      int low = 0;
      int high = keys.length;
      while (low < high) {
        int mid = (low + high) ~/ 2;
        int midAge = box.get(keys[mid])!.age;
        if (midAge < newAge) {
          low = mid + 1;
        } else {
          high = mid;
        }
      }
      return low;
    }

    return Scaffold(
      body: Column(
        spacing: 10,
        children: [
          10.verticalSpace,
          AppForm(
            controller: controller,
            hintText: "name",
          ),
          AppForm(
            controller: controllerAge,
            hintText: "age",
          ),
          MyButton(
            text: "Add",
            onPressed: () async {
              Box<Person> personBox = await _openPersonBox();
              Box<List<int>> keysBox = await _openKeysBox();

              for (int i = 0; i < 100000; i++) {
                int newAge = Random().nextInt(100000);
                Person newPerson = Person(controller.text, newAge);
                int newKey = await personBox.add(newPerson);
                List<int> sortedKeys = keysBox.get('sortedKeys') ?? <int>[];
                int index = _findInsertionIndex(sortedKeys, newAge, personBox);
                sortedKeys.insert(index, newKey);
                await keysBox.put('sortedKeys', sortedKeys);
              }
            },
          ),
          MyButton(
            text: "get Data",
            onPressed: () async {
              Box<Person> personBox = await _openPersonBox();
              Box<List<int>> keysBox = await _openKeysBox();
              List<int> sortedKeys = keysBox.get('sortedKeys') ?? <int>[];
              sortedKeys.forEach((key) {
                Person? person = personBox.get(key);
                if (person != null) {
                  print('Name: ${person.name}, Age: ${person.age}');
                }
              });
            },
          ),
          ListView.builder(
            itemBuilder: (context, index) {
              return ListTile(
                title: Text("Name: ${index}"),
                subtitle: Text("Age: ${index}"),
              );
            },
          )
        ],
      ),
    );
  }
}

شرح الكود

هنا يتم إنشاء واجهة المستخدم. يتم استخدام TextEditingController للتحكم في حقلَي إدخال النص: واحد للاسم والآخر للعمر.
_findInsertionIndex : هذه الوظيفة تستخدم خوارزمية البحث الثنائي (Binary Search) لإيجاد الموضع الصحيح لإدراج مفتاح جديد في قائمة المفاتيح المرتبة حسب العمر. هذا يحسن من كفاءة إدراج البيانات.
يتم بناء واجهة المستخدم باستخدام Scaffold و Column. تحتوي الواجهة على حقلَي إدخال: واحد للاسم والآخر للعمر.
عند الضغط على زر “Add”، يتم إضافة 100,000 شخص عشوائي إلى قاعدة البيانات. يتم تخزين الأشخاص في peopleBox، بينما يتم تخزين المفاتيح المرتبة حسب العمر في sortedKeysBox.
يتم استخدام ListView.builder لعرض البيانات في قائمة. ومع ذلك، الكود الحالي يعرض فقط الفهرس (index) بدلاً من البيانات الفعلية.
شاهد أيضًا
مقالات ذات صلة
حل مشكله Execution failed for task ‘:app:compileDebugJavaWithJavac’

حل مشكله Execution failed for task ‘:app:compileDebugJavaWithJavac’رسالة الخطأ تعني أن عملية تجميع كود Java أثناء…

طباعة رواتب الموظفين من الاقل الى الاعلى والعكس في Sql

  السلام عليكم ورحمة الله وبركاتة مرحبا بكم في اكواد sql حيث سوف نتعلم في…

شرح كيفية تحديث flutter وDart الى احدث اصدار

  شرح كيفية تحديث flutter وDart الى احدث اصداربعد فتره من الوقت نحتاج الى ان…

🚫 مانع الإعلانات مفعل

يجب إيقاف مانع الإعلانات لاستكمال تصفح الموقع