Java 在android中,如何通过匹配字符串从查询中检索int id?

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

我尝试了所有的方法:直到使用数据库查询来获取id,但出现了错误

数据库名称:quick

表名:字典

数据库列:_id、单词、含义

问题:如何获取行的_id-column值,其中word column匹配非生物或传递给函数dbBackend.getQuizByWordm的字符串m

从我传递此m字符串的位置:

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;
}