Java 根据用户在EditText中的输入从数据库接收数据

Java 根据用户在EditText中的输入从数据库接收数据,java,android-sqlite,Java,Android Sqlite,我有一个简短的问题,我肯定我只是犯了一个小错误,但我无法理解。我试图根据用户在EditText中输入的内容从数据库中获取信息。我犯了个错误 “java.lang.IllegalStateException:无法从中读取第0行第1列。” 游标窗口。请确保在开始之前正确初始化了游标 从中访问数据。” 这是我的主要活动课 public class MainActivity extends AppCompatActivity { Button create; Button retrieve; Butt

我有一个简短的问题,我肯定我只是犯了一个小错误,但我无法理解。我试图根据用户在EditText中输入的内容从数据库中获取信息。我犯了个错误

“java.lang.IllegalStateException:无法从中读取第0行第1列。” 游标窗口。请确保在开始之前正确初始化了游标 从中访问数据。”

这是我的主要活动课

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;
 }
}
这是我的安卓显示器

   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查询,然后在此参数上创建查询

变化:

maintactivy.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;
}
更新

将您的展示列表更改为

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

database和DatabaseHelper的良好编程实践:将它们包装在另一个类中,在需要时打开数据库,而不是在每个查询中打开,并使用字符串而不是视图本身进行查询。检查是否创建了singleton DatabaseManager并使用它执行查询。

您在SQLiteOpenHelper类中使用了listName(Edidtext),因此如果出现错误,请将listName的值从活动传递给类似的方法

//call and pass value like this.
showList(listName.getText().toString());

//or like this
String mListname = listName.getText().toString();

if(!TextUtils().isEmpty(mListname))//check if not empty
{ 
    showList(mListname);
}else{
    //handle error
}


// your method
public void showList(String listName)
{
   //your implementation
}
SQLiteOpenHelper不扩展视图,因此无法在其中使用视图。 但您可以将其传递给方法参数以访问它

showList(EditText listName)
{
    String val = listName.getText().toString();
}

//and pass your editText
showList(listName);

你能在声明listName并为其赋值的地方发布代码吗?你能分享实际的堆栈跟踪(异常的详细信息)吗?如果你看我的代码,我确实使用了.getText.toString()?对不起,我又看了一遍。是
ToDoListDatabase
InnerClass吗?检索游标getList()中的listName来自何处?主活动包含EditText listName,但我可以使用-import static com.example.stephen.todolist.R.id.listName将其导入todolist数据库;这是您的错误,因为静态字段是在初始化其他类实例之前加载的。您可以使用Java进行检查。首先是静态块,然后是静态对象,然后是其他类实例化。你的方式是非常错误的。我还没有看到一个视图是静态定义的例子。它可能会导致内存泄漏,并且将视图发送到数据库类或游标不是好的Android编程。你应该从edittext中获取字符串并使用它进行搜索。谢谢,我做了这些更改,但当我单击“检索”按钮时,应用程序崩溃了。在这里,你得到了错误,发生了什么错误。如果您在查询中遇到错误,请在
之前的WHERE
处留出一个空格。获取此错误“android.database.CursorIndexOutOfBoundsException:请求索引-1,大小为4”我更新了我的答案,请检查它。您正在从游标检索第一个索引值,而在查询中,您只检索索引0处的列表列。如果此答案工作正常,请将其标记为已接受。