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

时间:2015-08-04 18:22:56

标签: java android sqlite cursor

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

我有一个用于创建sqlite表TRANSACTIONS的条目的类。此交易创建的一部分包括插入借方的名称。为此,我有一个方法,它应该通过传递用户的B-Number作为参数来获取用户的名字。

但是,当我尝试创建事务时,应用程序崩溃,我收到错误

  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$1.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();

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

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

我不知道您的数据库是怎样的,但请尝试以下选择语句:

SELECT * FROM users WHERE id_number = ?

另外,我建议用每个列的名称指定每个列,例如:

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

这可以避免获取错误的数据。如果您的数据库发生了变化。

答案 1 :(得分:0)

您的查询只选择一列:"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;
}