非法状态异常:无法读取第 0 行,第 1 列

Illegal State Exception: Couldn't read row 0, col 1

这可能是一个非常简单的修复,但我看不到它。

我有一个 class 用于在 sqlite table TRANSACTIONS 中创建一个条目。此交易创建的一部分包括插入借款人的姓名。为此,我有一个方法应该通过将用户的 B 号码作为参数传递来获取用户的姓名。

但是,当我尝试创建交易时,应用程序崩溃并且出现错误

  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:438)
        at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:51)
        at example.anna.com.pi_prototype_30.UsersDAO.cursorToUsers(UsersDAO.java:124)
        at example.anna.com.pi_prototype_30.UsersDAO.getUserName(UsersDAO.java:110)
        at example.anna.com.pi_prototype_30.BorrowScan.onClick(BorrowScan.java:118)

CursorToUsers 方法:

private Users cursorToUsers(Cursor cursor){
    Users user = new Users();

    user.setTableID(cursor.getLong(0));
    user.setuType(cursor.getString(1));
    user.setIdNum(cursor.getString(2));
    user.setName(cursor.getString(3));
    user.setEmail(cursor.getString(4));
    user.setCourse(cursor.getString(5));
    user.setPassword(cursor.getString(6));

    return user;
}

getUserName 方法

public Users getUserName(String m) {

    Users user = null;
    String query = "SELECT name FROM  users WHERE id_number = ?";
    Cursor cursor = aDatabase.rawQuery(query, new String[]{m});
    //DatabaseUtils.dumpCurrentRow(c);

    cursor.moveToFirst();
    while (!cursor.isAfterLast()) {
        user = cursorToUsers(cursor);
        cursor.moveToNext();
    }

    cursor.close();
    return user;

}

CreateLoan 方法

public void addListenerOnCreateLoanButton(){
    final Context context = this;

    saveButton = (Button) findViewById(R.id.borrow_scan_create_loan);

    saveButton.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View v) {
            Boolean didi = true;

            //Initialises today's date
            Calendar c = Calendar.getInstance();
            SimpleDateFormat df = new SimpleDateFormat("dd-MMM-yyyy");

            //Initialise loan variables
            String bNum = cardContentTxt.getText().toString();
            String kNum = contentTxt.getText().toString();
            String bDate = df.format(c.getTime());
            String rDate = "N/A";
            String type = "Loan";
            String bName = (usersDAO.getUserName(bNum)).toString();
            try {

                transDAO.open();
                transDAO.createTransactionEntry(type, bDate, rDate, bNum, bName, kNum);
                transDAO.close();

            }//try

            catch (Exception e) {
                didi = false;
                Log.d(TAG, "Error");
                e.printStackTrace();
            }//catch
            finally {
                if (didi) {
                    Dialog d = new Dialog(BorrowScan.this);
                    d.setTitle("Database write");
                    TextView tv = new TextView(BorrowScan.this);
                    tv.setText("it  worked ");
                    Log.d(TAG, "Created loan");
                    d.setContentView(tv);
                    d.show();
                }//if
            }//finally
        }//onClick
    });//onClickListener
}//createLoan

被标记为导致错误的行是:

第 124 行:

user.setuType(cursor.getString(1));

第 110 行:

nameL = cursorToUsers(c);

第 118 行:

String bName = (usersDAO.getUserName(bNum)).toString();

虽然我确定我做错了很多,但到底是什么导致了这个特定错误?

感谢您的帮助。

我不知道你的数据库怎么样,但试试这个 select 语句:

SELECT * FROM users WHERE id_number = ?

此外,我建议用名称指定每一列,例如:

SELECT ID,Type,IdNum,Name,Email,Course,Password FROM users WHERE id_number = ?

这样可以避免得到错误的数据。如果你的数据库发生变化。

您的查询只选择了一列:"SELECT name FROM users WHERE id_number = ?"

这意味着cursor.getString(1)中的cursorToUsers()方法会抛出异常。将 getUserName() 更改为:

public Users getUserName(String m) {
    String name = null;
    String query = "SELECT name FROM users WHERE id_number = ?";
    Cursor cursor = aDatabase.rawQuery(query, new String[]{m});
    try {
        if (cursor.moveToFirst()) {
            name = cursor.getString(0);
        }
    } finally {
        cursor.close()
    }
    return name;
}