android - 'android.database.CursorIndexOutOfBoundsException: индекс 0 запрошен, с размером 0' - PullRequest
0 голосов
/ 12 мая 2018

Я хочу получить два столбца из моей базы данных SQLite и вернуть его как Arraylist<myObjectModel>, но я столкнулся с этой ошибкой

05-12 03:31:37.763 15166-15166/com.example.abdullah.newstroynory E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.abdullah.newstroynory, PID: 15166
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.abdullah.newstroynory/com.example.abdullah.newstroynory.MainActivity}: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2778)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2856)
at android.app.ActivityThread.-wrap11(Unknown Source:0)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1589)
at android.os.Handler.dispatchMessage(Handler.java:106)
at android.os.Looper.loop(Looper.java:164)
at android.app.ActivityThread.main(ActivityThread.java:6494)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Caused by: android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
at android.database.AbstractCursor.checkPosition(AbstractCursor.java:468)
at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
at com.example.abdullah.newstroynory.SQLForMyStroies.getTitleAndImage(SQLForMyStroies.java:58)
at com.example.abdullah.newstroynory.MainActivity.onCreate(MainActivity.java:75)

Моя ошибка

com.example.abdullah.newstroynory.SQLForMyStroies.getTitleAndImage(SQLForMyStroies.java:58)

начать с этой строки в моем классе SQlite

forDoing.setTitle(cursor.getString(cursor.getColumnIndex("story_title")));

Мой класс SQLiteOpenHelper

public class SQLForMyStroies extends SQLiteOpenHelper {

    private static final int DB_VERSION = 1;
    private static final String DB_NAME = "newStoryNory5";



    public SQLForMyStroies(Context context) {
        super(context, DB_NAME, null, DB_VERSION);
    }
    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE stories (story_id INTEGER PRIMARY KEY AUTOINCREMENT,story_title VARCHAR,story_image VARCHAR,story_body VARCHAR,story_audio VARCHAR )");
    }
    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        db.execSQL("DROP TABLE IF EXISTS stories");
        onCreate(db);
    }



    public boolean CreateNewStory( String t, String i, String b){
        SQLiteDatabase db= this.getWritableDatabase();
        ContentValues contentValues = new ContentValues();
        contentValues.put("story_title" , t);
        contentValues.put("story_image" , i);
        contentValues.put("story_body" , b);
        // contentValues.put("story_audio" , a); 
        db.insert("stories",null,contentValues);

        return true;
    }



        public ArrayList<StoryModel> getTitleAndImage(){

            ArrayList<StoryModel> myData = new ArrayList <> ();

            SQLiteDatabase db= this.getReadableDatabase();
            Cursor cursor =db.rawQuery("SELECT * FROM stories ",null);

            cursor.moveToFirst();
            do {

                StoryModel forDoing=new StoryModel();
                forDoing.setTitle(cursor.getString(cursor.getColumnIndex("story_title")));
                forDoing.setImage(cursor.getString(cursor.getColumnIndex("story_image")));

                myData.add(forDoing);

            }while (cursor.moveToNext());

            cursor.close();
            db.close();

            return(myData);
        }

Мой класс MainActivity

ArrayList<StoryModel> TitleAndImage =mySQL.getTitleAndImage();

    for (StoryModel storyModel : TitleAndImage) {
        Log.d("story_title", storyModel.getTitle());
        Log.d("story_image", storyModel.getImage());
    }

Я думаю, что это логическая ошибка в коде Java!

поправьте меня пожалуйста!

Я новичок в Android и не знаком в Java

Ответы [ 2 ]

0 голосов
/ 18 мая 2018

Ошибка была из-за того, что моя БД SQlite пуста, потому что каждый раз, когда я запускаю Приложение, оно создает для меня новую БД ...

решение

поэтому я удалил все свои БД SQLite и поставил условие,

Мое условие: «, если в моей БД есть данные, SQLite не получает данные из интервала »

My MainActivity

    if(mySQL.checktitle (storyObject.getTitle().toString())) {
                            Log.d("--------------------", "data is exist ");
                            break;
                        }

Мой класс SQLiteOpenHelper

      public  boolean checktitle ( String title){
            SQLiteDatabase db= this.getWritableDatabase();
            Cursor cur = db.rawQuery("SELECT * FROM stories where story_title='"+title+"'" ,null);
            if(cur.getCount()>0)
                return true;
            return false;
        }
0 голосов
/ 12 мая 2018

Проблема в том, что у вас может не быть какой-либо строки, и вы используете do{}while(), поэтому сначала он всегда будет пытаться взять первый элемент, поэтому его значение CursorIndexOutOfBoundsException

Вы можете решить несколькими способами.Например,

  • Попробуйте использовать для цикла и используйте boolean moveToPosition(int position);
  • Вместо cursor.moveToFirst();, используйте cursor.move(-1) и используйте цикл while.
...