因此,我目前正在尝试从数据库中提取一行,但是当我尝试时,只会出现此错误。
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”整数中。
现在,我的主要目标是从数据库中取出我要提取的信息,并将其附加到在此活动中设置的一堆视图中。我将一直工作到中午左右,但是我会尽力与任何想要帮助的人进行沟通。
答案 0 :(得分:1)
问题是getColumnIndex(column)之一找不到匹配的列(因此返回-1)。
按照
返回给定列名的从零开始的索引,如果返回则返回-1。 列不存在。如果您希望该列存在,请使用 而是使用getColumnIndexOrThrow(String),这将使错误更多 明确。 Cursor - getColumnIndex
我认为这是因为您使用了 Init.setText(c.getString(c.getColumnIndex("Init")));
,即当表中的 init 列似乎已定义时,它试图查找该列为 InitBon 。
解决错误/拼错/仅使列名称错误的问题的解决方案是将它们编码为常量,然后始终使用完全相同的常量。