Android 不能';t从游标窗口读取第0行第2列。在从光标访问数据之前,请确保光标已正确初始化
在我的应用程序中,我有一个表单。用户将CNIC放在第一位。如果他的CNIC已经存在于SQLite数据库中。用户的姓名和手机号码将自动填入EditText(使用TextWatcher)。但每当我输入同一个CNIC,应用程序就会崩溃。如果CNIC存在于数据库中,应用程序将崩溃,而不是自动填写姓名和电话字段。我已经试了很多次,但都没能解决我的问题 查询方法:Android 不能';t从游标窗口读取第0行第2列。在从光标访问数据之前,请确保光标已正确初始化,android,android-sqlite,android-textwatcher,Android,Android Sqlite,Android Textwatcher,在我的应用程序中,我有一个表单。用户将CNIC放在第一位。如果他的CNIC已经存在于SQLite数据库中。用户的姓名和手机号码将自动填入EditText(使用TextWatcher)。但每当我输入同一个CNIC,应用程序就会崩溃。如果CNIC存在于数据库中,应用程序将崩溃,而不是自动填写姓名和电话字段。我已经试了很多次,但都没能解决我的问题 查询方法: public List<SGenerateModel> getGeneratedData(String seller_cnic){
public List<SGenerateModel> getGeneratedData(String seller_cnic){
SQLiteDatabase db = this.getWritableDatabase();
String query = "SELECT " + TABLE_COL2 + ", " + TABLE_COL3 + " FROM " + TABLE_NAME + " WHERE " + TABLE_COL4 + " =?" ;
Cursor cursor = db.rawQuery(query, new String[]{"" + seller_cnic});
List<SGenerateModel> listOfSGModel = new ArrayList<>();
while(cursor.moveToNext()){
SGenerateModel sGenerateModel = new SGenerateModel(cursor.getString(1), cursor.getString(2));
sGenerateModel.setId(cursor.getInt(cursor.getColumnIndex(DatabaseHelper.TABLE_COL1)));
listOfSGModel.add(sGenerateModel);
}
return listOfSGModel;
}
TextWatcher代码:
TextWatcher textWatcher2 = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
}
@Override
public void afterTextChanged(Editable s) {
generate();
}
};
etSname.addTextChangedListener(textWatcher2);
etSphone.addTextChangedListener(textWatcher2);
etScnic.addTextChangedListener(textWatcher2);
LogCat错误:
java.lang.IllegalStateException: Couldn't read row 0, col 2 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 com.example.cattleapp.helpers.DatabaseHelper.getGeneratedData(DatabaseHelper.java:218)
at com.example.cattleapp.activities.MainActivity.generate(MainActivity.java:536)
at com.example.cattleapp.activities.MainActivity$7.afterTextChanged(MainActivity.java:241)
at android.widget.TextView.sendAfterTextChanged(TextView.java:9485)
at android.widget.TextView$ChangeWatcher.afterTextChanged(TextView.java:12080)
at android.text.SpannableStringBuilder.sendAfterTextChanged(SpannableStringBuilder.java:1262)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:574)
at android.text.SpannableStringBuilder.replace(SpannableStringBuilder.java:507)
at com.santalu.maskedittext.MaskTextWatcher.format(MaskTextWatcher.kt:67)
at com.santalu.maskedittext.MaskTextWatcher.afterTextChanged(MaskTextWatcher.kt:21)
at android.widget.TextView.sendAfterTextChanged(TextView.java:9485)
在这一行中,您只获取2列(索引0和1),但在获取时,您尝试获取列号2。i、 e
cursor.getString(2)
只能获取列0和列1
试试这个:
SGenerateModel sGenerateModel = new SGenerateModel(cursor.getString(0), cursor.getString(1));
编辑:
使用光标后,请始终关闭光标。在您的代码中,while循环之后,在方法getGeneratedData
cursor.close();
在这一行中,您只获取2列(索引0和1),但在获取时,您尝试获取列号2。i、 e
cursor.getString(2)
只能获取列0和列1
试试这个:
SGenerateModel sGenerateModel = new SGenerateModel(cursor.getString(0), cursor.getString(1));
编辑:
使用光标后,请始终关闭光标。在您的代码中,while循环之后,在方法getGeneratedData
cursor.close();
应用程序仍在崩溃,但现在logcat错误是:android.database.CursorWindowAllocationException:2048KB的光标窗口分配失败打开游标=939(#此进程打开的游标=939)…etSname.setText(selName);在generate()方法的这一行。@UsamaSajid那么您将在数据库中存储非常大的字符串。调试从游标获得的值并进行验证。我已经调试过了,五个字母的名称和电话号码是12位数字。。我不这么认为这是一条很大的绳子不,先生!应用程序仍在崩溃。我认为生成方法有问题。应用程序仍在崩溃,但现在logcat错误是:android.database.CursorWindowAllocationException:2048KB的光标窗口分配失败打开游标=939(#此进程打开的游标=939)…etSname.setText(selName);在generate()方法的这一行。@UsamaSajid那么您将在数据库中存储非常大的字符串。调试从游标获得的值并进行验证。我已经调试过了,五个字母的名称和电话号码是12位数字。。我不这么认为这是一条很大的绳子不,先生!应用程序仍在崩溃。我认为生成方法有问题。