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

كيفية استخدام 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) بدلاً من البيانات الفعلية.
تعليقات