我有一个快速的问题,我敢肯定我只是犯了一个小错误,但我无法弄清楚。我试图根据用户在EditText中输入的内容从数据库中获取信息。我出错了


  “ java.lang.IllegalStateException:无法从读取行0,列1
  CursorWindow。确保游标已正确初始化,然后再进行
  从中访问数据。”。


这是我的主要活动课

public class MainActivity extends AppCompatActivity {

Button create;
Button retrieve;
Button save;
Button clear;
EditText listName;
EditText listDetails;
ToDoListDatabase myDb;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    myDb = new ToDoListDatabase(this);

    create = (Button)findViewById(R.id.createButton);
    retrieve = (Button)findViewById(R.id.retrieveButton);
    save = (Button)findViewById(R.id.saveButton);
    clear = (Button)findViewById(R.id.clearButton);
    listName = (EditText)findViewById(R.id.listName);
    listDetails = (EditText)findViewById(R.id.listDetails);


    create.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        AddList();
    }
});

    retrieve.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            showList(listName.getText().toString());
        }
    });


}

//Method Resets EditText back to default
public void resetEditText(){
    listName.setText("");
    listDetails.setText("");
}

//Method Adds List Entered By User To DataBase
public void AddList(){
    boolean isInserted = myDb.insertData(listName.getText().toString(), listDetails.getText().toString());
    if(isInserted == true){
        Toast.makeText(MainActivity.this,"List " + listName.getText().toString() + " successfully created", Toast.LENGTH_LONG).show();
        resetEditText();
    }
    else
        Toast.makeText(MainActivity.this,"Error creating list", Toast.LENGTH_LONG).show();
}


public void showList(String listName){
    Cursor res = myDb.getList(listName);
    if(res.getCount() == 0){
        Toast.makeText(MainActivity.this,"Error finding list", Toast.LENGTH_LONG).show();
       return;
    }

    StringBuffer buffer = new StringBuffer();

    buffer.append(res.getString(2));
    listDetails.setText(buffer); //Not working yet!!!!
}


}

这是我的数据库类

public class ToDoListDatabase extends SQLiteOpenHelper {
public static final String DATABASE_NAME = "List_db";
public static final String TABLE_NAME = "List_Table";
public static final String COL_1 = "ID";
public static final String COL_2 = "NAME";
public static final String COL_3 = "LIST";

public ToDoListDatabase(Context context) {
    super(context, DATABASE_NAME, null, 1);
}

@Override
public void onCreate(SQLiteDatabase db) {
    db.execSQL("create table " + TABLE_NAME + " (ID INTEGER PRIMARY KEY AUTOINCREMENT,NAME TEXT,LIST TEXT)");
}

@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
    db.execSQL("DROP TABLE IF EXITS" + TABLE_NAME);
    onCreate(db);
}

public boolean insertData(String name, String list) {
    SQLiteDatabase db = this.getWritableDatabase();
    ContentValues contentValues = new ContentValues();
    contentValues.put(COL_2, name);
    contentValues.put(COL_3, list);
    long result = db.insert(TABLE_NAME, null, contentValues);
    if (result == -1) { //returns -1 if not inserted
        return false;
    } else
        return true;

}

public Cursor getList(String listName) {
    SQLiteDatabase db = this.getWritableDatabase();
    Cursor res = db.rawQuery("SELECT LIST FROM " + TABLE_NAME + " WHERE NAME = '" +listName+"'" , null);
    return res;
}


}

这是我的Android显示器

   10-10 13:11:41.618 2643-2643/com.example.stephen.todolist E/AndroidRuntime: FATAL EXCEPTION: main
                                                                        android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 4
                                                                            at android.database.AbstractCursor.checkPosition(AbstractCursor.java:424)
                                                                            at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
                                                                            at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
                                                                            at com.example.stephen.todolist.MainActivity.showList(MainActivity.java:79)
                                                                            at com.example.stephen.todolist.MainActivity$2.onClick(MainActivity.java:47)
                                                                            at android.view.View.performClick(View.java:4439)
                                                                            at android.widget.Button.performClick(Button.java:139)
                                                                            at android.view.View$PerformClick.run(View.java:18395)
                                                                            at android.os.Handler.handleCallback(Handler.java:725)
                                                                            at android.os.Handler.dispatchMessage(Handler.java:92)
                                                                            at android.os.Looper.loop(Looper.java:176)
                                                                            at android.app.ActivityThread.main(ActivityThread.java:5317)
                                                                            at java.lang.reflect.Method.invokeNative(Native Method)
                                                                            at java.lang.reflect.Method.invoke(Method.java:511)
                                                                            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102)
                                                                            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)
                                                                            at dalvik.system.NativeStart.main(Native Method)

最佳答案

您的ToDoListDatabase类不包含任何名称为listName的字段,您将在该字段上调用getText()。另外,您没有在getList()中传递任何参数。您应该在此getList()中传递EditText查询,然后在此参数上创建查询。

变化:

MainActivy.java

retrieve.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        showList(listName.getText().toString());
    }
});

public void showList(String listName){
    Cursor res = myDb.getList(listName);
    if(res.getCount() == 0){
    Toast.makeText(MainActivity.this,"Error finding list", Toast.LENGTH_LONG).show();
   //return;
    }
}

StringBuffer buffer = new StringBuffer();
    buffer.append(res.getString(2));
listDetails.setText(buffer); //Not working yet!!!!
}


ToDoListDatabase.java

public Cursor getList(String listName) {
  SQLiteDatabase db = this.getWritableDatabase();
  Cursor res = db.rawQuery("SELECT LIST FROM " + TABLE_NAME + " WHERE NAME ='" + listName+"'" , null);
  return res;
}


更新资料

将您的showList更改为

public void showList(String listName){
Cursor res = myDb.getList(listName);
if(res.getCount() == 0){
    Toast.makeText(MainActivity.this,"Error finding list", Toast.LENGTH_LONG).show();
   return;
}
  res.moveToFirst();
  StringBuffer buffer = new StringBuffer();
  while (!res.isAfterLast()) {
    buffer.append(res.getString(0));
    res.moveToNext();
  }
   res.close();
  listDetails.setText(buffer); //Not working yet!!!!
}

08-18 16:42
查看更多