1

So I'm currently trying to pull a single row from my database, but when I try I just get this error.

2018-12-12 06:17:52.499 9065-9065/com.example.caesp.dmtool E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.caesp.dmtool, PID: 9065
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.caesp.dmtool/com.example.caesp.dmtool.CreateCharacter}: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2955)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3030)
        at android.app.ActivityThread.-wrap11(Unknown Source:0)
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696)
        at android.os.Handler.dispatchMessage(Handler.java:105)
        at android.os.Looper.loop(Looper.java:164)
        at android.app.ActivityThread.main(ActivityThread.java:6938)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374)
     Caused by: java.lang.IllegalStateException: Couldn't read row 0, col -1 from CursorWindow.  Make sure the Cursor is initialized correctly before accessing data from it.
        at android.database.CursorWindow.nativeGetString(Native Method)
        at android.database.CursorWindow.getString(CursorWindow.java:451)
        at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
        at com.example.caesp.dmtool.CreateCharacter.onCreate(CreateCharacter.java:128)
        at android.app.Activity.performCreate(Activity.java:7183)
        at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1220)
        at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2908)
        at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3030) 
        at android.app.ActivityThread.-wrap11(Unknown Source:0) 
        at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1696) 
        at android.os.Handler.dispatchMessage(Handler.java:105) 
        at android.os.Looper.loop(Looper.java:164) 
        at android.app.ActivityThread.main(ActivityThread.java:6938) 
        at java.lang.reflect.Method.invoke(Native Method) 
        at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:327) 
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1374) 

As far as my Database goes it looks like this

@Override
        public void onCreate(SQLiteDatabase db)
        {
            // query to create a new table named dog
            String CampaignList = "CREATE TABLE Campaigns" +
                    "(CamName TEXT);";

            db.execSQL(CampaignList);// execute the query

            

            String CharacterList = "CREATE TABLE Characters" +
                    "(CharName TEXT," +
                    "Campaign TEXT," +
                    "Class TEXT," +
                    "Level INTEGER," +
                    "Race TEXT," +
                    "Player_Name TEXT," +
                    "STR INTEGER," +
                    "DEX INTEGER," +
                    "CON INTEGER," +
                    "INT INTEGER," +
                    "WIS INTEGER," +
                    "CHA INTEGER," +
                    "First INTEGER," +
                    "Second INTEGER," +
                    "Third INTEGER," +
                    "Fourth INTEGER," +
                    "Fifth INTEGER," +
                    "Sixth INTEGER," +
                    "Seventh INTEGER," +
                    "Eighth INTEGER," +
                    "Ninth INTEGER," +
                    "Acro INTEGER," +
                    "Anhan INTEGER," +
                    "Arc INTEGER," +
                    "Ath INTEGER," +
                    "Dec INTEGER," +
                    "His INTEGER," +
                    "Ins INTEGER," +
                    "Inti INTEGER," +
                    "Inves INTEGER," +
                    "Med INTEGER," +
                    "Nat INTEGER," +
                    "Perc INTEGER," +
                    "Perf INTEGER," +
                    "Pers INTEGER," +
                    "Rel INTEGER," +
                    "Slei INTEGER," +
                    "Ste INTEGER," +
                    "Sur INTEGER," +
                    "Prof_Bon INTEGER," +
                    "Attacks TEXT," +
                    "AC INTEGER," +
                    "InitBon INTEGER," +
                    "Spd INTEGER," +
                    "HP_Max INTEGER," +
                    "HP TEXT," +
                    "Hit_Die TEXT," +
                    "Equip TEXT," +
                    "Backstory TEXT," +
                    "ProfnLang TEXT," +
                    "Feats TEXT," +
                    "SSDC INTEGER," +
                    "SCA TEXT," +
                    "SAB INTEGER," +
                    "Spells TEXT" +
                    ");";

            db.execSQL(CharacterList);
        } // end method onCreate

        @Override
        public void onUpgrade(SQLiteDatabase db, int oldVersion,
                              int newVersion)
        {
        } // end method onUpgrade
    }

And my get method and part of the activity I'm trying to run is this

if (RQCode == 2){
            CurrentName = extras.getString("CharName");
            DatabaseConnector dc = new DatabaseConnector(this);
            dc.open();
            Cursor c = dc.getOneCharacter(CurrentName);
            if (c != null && c.moveToFirst()){
                Name.setText(c.getString(c.getColumnIndex("CharName")));
                Player.setText(c.getString(c.getColumnIndex("Player_Name")));
                Level.setText(c.getString(c.getColumnIndex("Level")));
                Race.setText(c.getString(c.getColumnIndex("Race")));
                Class.setText(c.getString(c.getColumnIndex("Class")));
                STR.setText(c.getString(c.getColumnIndex("STR")));
                DEX.setText(c.getString(c.getColumnIndex("DEX")));
                CON.setText(c.getString(c.getColumnIndex("CON")));
                INT.setText(c.getString(c.getColumnIndex("INT")));
                WIS.setText(c.getString(c.getColumnIndex("WIS")));
                CHA.setText(c.getString(c.getColumnIndex("CHA")));
                Acro.setText(c.getString(c.getColumnIndex("Acro")));
                Anhan.setText(c.getString(c.getColumnIndex("Anhan")));
                Arc.setText(c.getString(c.getColumnIndex("Arc")));
                Ath.setText(c.getString(c.getColumnIndex("Ath")));
                Dec.setText(c.getString(c.getColumnIndex("Dec")));
                His.setText(c.getString(c.getColumnIndex("His")));
                Ins.setText(c.getString(c.getColumnIndex("Ins")));
                Inti.setText(c.getString(c.getColumnIndex("Inti")));
                Inves.setText(c.getString(c.getColumnIndex("Inves")));
                Med.setText(c.getString(c.getColumnIndex("Med")));
                Nat.setText(c.getString(c.getColumnIndex("Nat")));
                Perc.setText(c.getString(c.getColumnIndex("Perc")));
                Perf.setText(c.getString(c.getColumnIndex("Perf")));
                Pers.setText(c.getString(c.getColumnIndex("Pers")));
                Rel.setText(c.getString(c.getColumnIndex("Rel")));
                Slei.setText(c.getString(c.getColumnIndex("Slei")));
                Ste.setText(c.getString(c.getColumnIndex("Ste")));
                Surv.setText(c.getString(c.getColumnIndex("Sur")));
                AC.setText(c.getString(c.getColumnIndex("AC")));
                Init.setText(c.getString(c.getColumnIndex("Init")));
                Spd.setText(c.getString(c.getColumnIndex("Spd")));
                HP.setText(c.getString(c.getColumnIndex("HP")));
                HitDice.setText(c.getString(c.getColumnIndex("Hit_Die")));
                ProfBon.setText(c.getString(c.getColumnIndex("Prof_Bon")));
                Attacks.setText(c.getString(c.getColumnIndex("Attacks")));
                Spells.setText(c.getString(c.getColumnIndex("Spells")));
                SAB.setText(c.getString(c.getColumnIndex("SAB")));
                SCA.setText(c.getString(c.getColumnIndex("SCA")));
                SSDC.setText(c.getString(c.getColumnIndex("SSDC")));
                First.setText(c.getString(c.getColumnIndex("First")));
                Second.setText(c.getString(c.getColumnIndex("Second")));
                Third.setText(c.getString(c.getColumnIndex("Third")));
                Fourth.setText(c.getString(c.getColumnIndex("Fourth")));
                Fifth.setText(c.getString(c.getColumnIndex("Fifth")));
                Sixth.setText(c.getString(c.getColumnIndex("Sixth")));
                Seventh.setText(c.getString(c.getColumnIndex("Seventh")));
                Eighth.setText(c.getString(c.getColumnIndex("Eighth")));
                Ninth.setText(c.getString(c.getColumnIndex("Ninth")));
                ProfnLang.setText(c.getString(c.getColumnIndex("ProfnLang")));
                Feats.setText(c.getString(c.getColumnIndex("Feats")));
                Equipment.setText(c.getString(c.getColumnIndex("Equipment")));
                Backstory.setText(c.getString(c.getColumnIndex("Backstory")));
            }


        }

For some reason it gets stuck at the 'Init' Integer.

right now my main goal is to take the information that I'm pulling out of my database and attach it to the bunch of views that I have set up in this activity. I'll be going to work until about noon, but I'll do my best to communicate with any one who'd like to help.

3
  • take a look at room, its more easy to use. codelabs.developers.google.com/codelabs/android-persistence/#0 Commented Dec 12, 2018 at 11:33
  • it says that the col you are requesting is -1. That's because you dont have a column named "Init" when you create the table. You have "Inti" and "InitBon". I would recommend using String constants (public final static String) and using them for both DB creation and Queries. Commented Dec 12, 2018 at 11:41
  • well it's like it can't find the column, did you try to delete the application and rerun it . Commented Dec 12, 2018 at 11:43

1 Answer 1

1

The issue is that one of the getColumnIndex(column) isn't finding a matching column (and thus returns -1).

As per

Returns the zero-based index for the given column name, or -1 if the column doesn't exist. If you expect the column to exist use getColumnIndexOrThrow(String) instead, which will make the error more clear. Cursor - getColumnIndex

I believe that this is because you have used Init.setText(c.getString(c.getColumnIndex("Init"))); i.e. it is trying to find the column named init when in the table it appears to be defined as InitBon.

  • Note there is a bug with the Cursor getColumnIndex in that it is case sensitive.

The solution to the issue of mistyping/mispelling/just getting columns names wrong is to code them as constants and to then always use the constants which will be exactly the same.

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you for this. After pulling an allnighter i became blind to my own madness. Turns out i had a few columns labeled differently.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.