非法状态异常:无法读取第 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;
}
这可能是一个非常简单的修复,但我看不到它。
我有一个 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;
}