الاستثناء: CursorIndexOutOfBoundsException: الفهرس 0 مطلوب بحجم 0

-1

لذلك واجهت هذه المشكلة بالأمس فقط عندما قمت بإلغاء تثبيت التطبيق وإعادة تثبيته للتحقق من أن الأذونات مطلوبة بشكل صحيح.

قبل ذلك كان التطبيق يعمل بشكل جيد ، ولكن الآن لا يمكنني الحصول على أي شيء من قاعدة البيانات الخاصة بي. أحصل دائمًا على هذا الخطأ عند محاولة الحصول على بيانات من المؤشر.

Process: com.example.asusx556u.myapplication, PID: 1720
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.asusx556u.myapplication/com.example.asusx556u.myapplication.RingtonesPlayLists}: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
at android.database.AbstractCursor.checkPosition(AbstractCursor.java:460)
at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
at com.example.asusx556u.myapplication.RingtonesPlayLists.checkRingtones(RingtonesPlayLists.java:54)
at com.example.asusx556u.myapplication.RingtonesPlayLists.onCreate(RingtonesPlayLists.java:34)

نغمات الاختيار:

public void checkRingtones() {
        if(ringtonesCursor == null) {
            return;
        }

        boolean bModified = false;
        DatabaseHelper ringtonesDB = new DatabaseHelper(this);

        if(ringtonesCursor.moveToFirst())
            Log.v("SL", "Moved successfully to first row.");
        do {
            File ringtoneFile = new File(ringtonesCursor.getString(2));
            if(!ringtoneFile.exists()) {
                bModified = true;
                ringtonesDB.delete(ringtonesCursor.getInt(0));
                Log.e("SL", "Ringtone \"" + ringtonesCursor.getString(2) +
                "\" cannot be found and therefore will be deleted!");
            }
        } while (ringtonesCursor.moveToNext());

        if(bModified)
            getRingtones();
    }

نغمات الرنين:

public void getRingtones() {
        DatabaseHelper ringtonesDB = new DatabaseHelper(this);
        ringtonesCursor = ringtonesDB.getAll();
    }

كل شيء:

public Cursor getAll() {
        SQLiteDatabase db = _openHelper.getReadableDatabase();
        if (db == null) {
            return null;
        }
        return db.rawQuery("select * from RINGTONES_LITE order by _id", null);
    }

إنشاء قاعدة بيانات.

        public void onCreate(SQLiteDatabase db) {
            db.execSQL("create table RINGTONES_LITE (_id integer primary key autoincrement, NAME text, URI text unique)");
        }

1 إجابة

1
افضل جواب

من المحتمل أن تكون مشكلتك بسبب عدم وجود تحقق من وجود مؤشر فارغ ، وبالتالي فإن المؤشر لا يحتوي على 0 صفًا وبالتالي لا توجد أعمدة (أي الإزاحة 0) يمكن من خلالها الحصول على أي بيانات منها.

وذلك لأن التحقق من كون المؤشر فارغًا لا يخدم أي غرض. إذا كان المؤشر لا يحتوي على صفوف ، فسيكون المؤشر فارغًا وليس فارغًا (المؤشر getCount() سيعود الأسلوب 0).

الشيك الذي يمكن أن يكشف هذا moveToFirst (سيظهر خطأ إذا كان المؤشر لا يحتوي على صفوف). يقتصر فقط على بيان السجل. لا يزال يتم إدخال جملة do وبالتالي تكون النتيجة أنه لا يوجد إزاحة 0 حيث لا توجد صفوف.

يمكن أن يكون الإصلاح لاستخدام: -

public void checkRingtones() {

    boolean bModified = false;
    DatabaseHelper ringtonesDB = new DatabaseHelper(this);

    while(ringtoneCursor.moveToNext()) {
        File ringtoneFile = new File(ringtonesCursor.getString(2));
        if(!ringtoneFile.exists()) {
            bModified = true;
            ringtonesDB.delete(ringtonesCursor.getInt(0));
            Log.e("SL", "Ringtone \"" + ringtonesCursor.getString(2) +
            "\" cannot be found and therefore will be deleted!");
        }
    }

    if(bModified)
        getRingtones();
}  

أو بالتناوب: -

public void checkRingtones() {
    if(ringtonesCursor.getCount() < 1) {
        return;
    }

    boolean bModified = false;
    DatabaseHelper ringtonesDB = new DatabaseHelper(this);

    if(ringtonesCursor.moveToFirst())
        Log.v("SL", "Moved successfully to first row.");
    do {
        File ringtoneFile = new File(ringtonesCursor.getString(2));
        if(!ringtoneFile.exists()) {
            bModified = true;
            ringtonesDB.delete(ringtonesCursor.getInt(0));
            Log.e("SL", "Ringtone \"" + ringtonesCursor.getString(2) +
            "\" cannot be found and therefore will be deleted!");
        }
    } while (ringtonesCursor.moveToNext());

    if(bModified)
        getRingtones();
}
:مؤلف
فوق
قائمة طعام