从SQLDatabase提取单行

时间:2018-12-12 11:31:38

标签: android sqlite

因此,我目前正在尝试从数据库中提取一行,但是当我尝试时,只会出现此错误。

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) 

就我的数据库而言,它看起来像这样

@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
    }

我的get方法和我尝试运行的活动的一部分是

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")));
            }


        }

由于某种原因,它卡在了“ Init”整数中。

现在,我的主要目标是从数据库中取出我要提取的信息,并将其附加到在此活动中设置的一堆视图中。我将一直工作到中午左右,但是我会尽力与任何想要帮助的人进行沟通。

1 个答案:

答案 0 :(得分:1)

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

按照

  

返回给定列名的从零开始的索引,如果返回则返回-1。   列不存在。如果您希望该列存在,请使用   而是使用getColumnIndexOrThrow(String),这将使错误更多   明确。   Cursor - getColumnIndex

我认为这是因为您使用了 Init.setText(c.getString(c.getColumnIndex("Init"))); ,即当表中的 init 列似乎已定义时,它试图查找该列为 InitBon

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

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