这可能是一个简单的修复,我只是看不到它。
我有一个用于创建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();
虽然我确定有很多我做错了,但是导致这个特定错误的是什么?
感谢您的帮助。
答案 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;
}