首页 > 解决方案 > Pulling single row from SQLDatabase

问题描述

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.

标签: androidsqlite

解决方案


问题是 getColumnIndex(column) 之一没有找到匹配的列(因此返回-1)。

按照

返回给定列名的从零开始的索引,如果该列不存在,则返回 -1。如果您希望该列存在,请改用 getColumnIndexOrThrow(String) ,这将使错误更加清晰。 光标 - getColumnIndex

我相信这是因为您使用Init.setText(c.getString(c.getColumnIndex("Init")));了 ie,它试图在表中找到名为init的列,而它似乎被定义为InitBon

  • 请注意,Cursor getColumnIndex 存在一个错误,因为它区分大小写。

错误输入/拼写错误/只是列名错误的解决方案是将它们编码为常量,然后始终使用完全相同的常量。


推荐阅读