Java 在android中,如何通过匹配字符串从查询中检索int id?
我尝试了所有的方法:直到使用数据库查询来获取id,但出现了错误 数据库名称:quick 表名:字典 数据库列:_id、单词、含义 问题:如何获取行的_id-column值,其中word column匹配非生物或传递给函数dbBackend.getQuizByWordm的字符串m 从我传递此m字符串的位置:Java 在android中,如何通过匹配字符串从查询中检索int id?,java,android,android-sqlite,Java,Android,Android Sqlite,我尝试了所有的方法:直到使用数据库查询来获取id,但出现了错误 数据库名称:quick 表名:字典 数据库列:_id、单词、含义 问题:如何获取行的_id-column值,其中word column匹配非生物或传递给函数dbBackend.getQuizByWordm的字符串m 从我传递此m字符串的位置: String m; filterText=(EditText)findViewById(R.id.editText1); filterText.addTextChangedLi
String m;
filterText=(EditText)findViewById(R.id.editText1);
filterText.addTextChangedListener(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) {
m=s.toString();
MainActivity.this.listAdapter.getFilter().filter(s);
}
@Override
public void afterTextChanged(Editable s) {
}
和项目侦听器
itemList.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
// make Toast when click
Toast.makeText(getApplicationContext(), "Position "+position, Toast.LENGTH_LONG).show();
//long data=parent.getSelectedItemId
//Log.d("MYINT", "First------------- "+data);
//int a=dbBackend.getQuizByword(m);
DbBackend dbBackend1 = new DbBackend(MainActivity.this);
Log.d("MYINT", "Here: "+dbBackend1.getQuizByword(m));
int a=position;
Log.d("MYINT", "First------------- "+a);
Toast.makeText(getApplicationContext(), "New Position "+a, Toast.LENGTH_LONG).show();
Intent i = new Intent(MainActivity.this, MeaningActivity.class);
//i.putExtra("DICTIONARY_ID", position);
i.putExtra("DICTIONARY_ID", a);
startActivity(i);
}
1 SQL注入不好。修正你的疑问 2您可能不需要循环 3尝试捕获抛出的异常
public long getQuizByword(String m)
String query="select * from dictionary where word =?";
Cursor cursor=this.getDbConnection().rawQuery(query, new String[] { m });
long id = -1;
try {
if(cursor.moveToFirst()){
id = cursor.getLong(cursor.getColumnIndexOrThrow("_id"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor!=null) cursor.close();
}
return id;
}
如果返回-1,则未找到任何内容,或者存在错误
我不确定getDbConnection返回的是什么,但您应该将此方法移动到SQLiteOpenHelper中,并用getReadableDatabase替换它
编辑
关于使用ArrayAdapter和筛选器执行的操作,您可能更希望使用CursorAdapter,并将过滤后的数据加载到ListView中。不要用标记和数组列表来回跳跃 是的cursor.getInt是您需要的,或者更确切地说是getLong,因为ID是long,而不是ints您正在覆盖原始位置loopok的每一次迭代我知道这是一个XY问题,您只需要一个SimpleCorsorAdapter,而不是ArrayAdapter,用于过滤您需要设置其FilterQueryProvider,那是all@Bati它是null,因为您正在将null传递给getQuizBywordmethod@Bati实际上,你为什么需要这样一种方法呢?我觉得这是毫无意义的。。。你需要它做什么?@Bati不,这似乎是一个XY问题,你到底想要实现什么?你想要列表视图过滤还是什么?@Bati好的,我知道这是一个XY问题,你只需要一个SimpleCorsorAdapter,而不是ArrayAdapter,要进行过滤,你需要设置它的FilterQueryProvider,就是这样all@Bati从runQuery方法返回一个游标,该游标很可能通过在where子句中使用类似sql的语句来匹配给定的约束
public long getQuizByword(String m)
String query="select * from dictionary where word =?";
Cursor cursor=this.getDbConnection().rawQuery(query, new String[] { m });
long id = -1;
try {
if(cursor.moveToFirst()){
id = cursor.getLong(cursor.getColumnIndexOrThrow("_id"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (cursor!=null) cursor.close();
}
return id;
}