البرمجة

حل مشكلة CursorIndexOutOfBoundsException في تطبيق Android

في مواجهة خطأ CursorIndexOutOfBoundsException الذي يعترضك في تطبيق Android الخاص بك، يظهر أن الخطأ ينشأ عند محاولة الوصول إلى فهرس -1 في مصفوفة النتائج. يمكن أن يكون هذا الخطأ مزعجًا للمطورين، ولكن من السهل إيجاد حلاً بعد فحص الشيفرة البرمجية التي قدمتها.

يبدو أن الكود الذي تقدمه هو جزء من دالة GetRecipes في فئة DB_Access، حيث يتم استرجاع الوصفات من قاعدة البيانات باستخدام استعلام SQL. السطور التي تستخدم للتنقل في نتائج الاستعلام (while (cursor_recipes.isAfterLast() == false)) قد تكون مصدر المشكلة.

لتجنب مشكلة CursorIndexOutOfBoundsException، يفضل استخدام دالة moveToFirst() بدلاً من isAfterLast() للتحقق من وجود بيانات في النتائج. يمكنك تعديل الكود على النحو التالي:

java
while (cursor_recipes.moveToFirst()) { array_list_recipes.add(cursor_recipes.getString(cursor_recipes.getColumnIndex(RECIPE_NAME))); Log.i("reci_based_on_meal_cat", cursor_recipes.getString(cursor_recipes.getColumnIndex(RECIPE_NAME))); cursor_recipes.moveToNext(); }

هذا التغيير يضمن أن الكرسور يتحرك إلى الصف الأول قبل البدء في تحليل النتائج، وهذا يجنب الوصول إلى فهرس -1. يمكنك أيضًا استخدام do-while للتأكد من أن الكود يتم تنفيذه على الأقل مرة واحدة:

java
do { array_list_recipes.add(cursor_recipes.getString(cursor_recipes.getColumnIndex(RECIPE_NAME))); Log.i("reci_based_on_meal_cat", cursor_recipes.getString(cursor_recipes.getColumnIndex(RECIPE_NAME))); } while (cursor_recipes.moveToNext());

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

المزيد من المعلومات

في وجهة نظر المشكلة التي واجهتك، يبدو أن خطأ CursorIndexOutOfBoundsException يتمثل في محاولة الوصول إلى فهرس (index) -1 في Cursor، حيث أن الفهرس المطلوب هو -1 وحجم الـ Cursor هو 2. هذا الخطأ يتكرر في الطريقة getString() الموجودة في كلاس AbstractWindowedCursor والتي تستخدم في الدالة GetRecipes().

لفهم السياق بشكل أفضل، يتضمن الكود استعلام SQL يُستخدم لاسترجاع أسماء الوصفات المرتبطة بفئة الوجبة المحددة. يتم تنفيذ هذا الاستعلام باستخدام rawQuery()، حيث يتم تخزين النتائج في Cursor.

لتجنب خطأ CursorIndexOutOfBoundsException، ينبغي التحقق أولاً من أن الـ Cursor لديه بيانات باستخدام moveToFirst()، ومن ثم التحقق من وجود عناصر باستخدام isAfterLast() قبل الوصول إلى البيانات باستخدام getString().

وفي هذا السياق، يمكن تحسين الكود كالتالي:

java
public ArrayList GetRecipes(String meal_cat_selected) { SQLiteDatabase db = this.getReadableDatabase(); Cursor cursor_recipes = db.rawQuery("SELECT " + RECIPE_NAME + " FROM " + RECIPES_TABLE_NAME + " WHERE " + MEAL_CATEGORY + " = ?", new String[]{meal_cat_selected}); ArrayList array_list_recipes = new ArrayList(); if (cursor_recipes != null && cursor_recipes.moveToFirst()) { do { array_list_recipes.add(cursor_recipes.getString(cursor_recipes.getColumnIndex(RECIPE_NAME))); Log.i("reci_based_on_meal_cat", cursor_recipes.getString(cursor_recipes.getColumnIndex(RECIPE_NAME))); } while (cursor_recipes.moveToNext()); } if (cursor_recipes != null) { cursor_recipes.close(); } db.close(); return array_list_recipes; }

تأكد من استخدام moveToFirst() قبل البدء في الحلقة والتحقق من أن الـ Cursor ليس فارغًا. بعد الانتهاء من استخدام Cursor، يجب غلقه باستخدام close() لتجنب مشاكل الذاكرة.

مقالات ذات صلة

زر الذهاب إلى الأعلى
إغلاق

أنت تستخدم إضافة Adblock

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