单击listView项(包含行/记录中的部分信息)从相关行/记录中获取完整的SQlite数据库信息

时间:2013-11-01 15:04:13

标签: android sqlite android-listview android-cursor

我有一个名为getData的方法,从表中填充listView数据库限制为指定列

public ArrayList<String> getData() {
    // TODO Auto-generated method stub

    String[] columns = new String[] { KEY_ROWID, KEY_MODULE_CODE,
            KEY_MODULE_NAME, KEY_LECTURE_PRACTICAL,
            KEY_LECTURE_PRACTICAL_SHORT, KEY_LECTURE_DAY,
            KEY_LECTURE_DAY_SHORT, KEY_START_TIME, KEY_END_TIME,
            KEY_LOCATION, ADDITIONAL_INFO };
    Cursor c = ourDatabase.query(DATABASE_MODULES, columns, null, null,
            null, null, null);
    ArrayList<String> results = new ArrayList<String>();

    int indexModCode = c.getColumnIndex(KEY_MODULE_CODE);

    int indexLectPracShort = c.getColumnIndex(KEY_LECTURE_PRACTICAL_SHORT);

    int indexLectDayShort = c.getColumnIndex(KEY_LECTURE_DAY_SHORT);
    int indexLectStart = c.getColumnIndex(KEY_START_TIME);

    int indexLectLoc = c.getColumnIndex(KEY_LOCATION);

    for (c.moveToFirst(); !c.isAfterLast(); c.moveToNext()) {
        results.add(c.getString(indexModCode) + " "
                + c.getString(indexLectPracShort) + " "
                + c.getString(indexLectDayShort) + " "
                + c.getString(indexLectStart) + " "
                + c.getString(indexLectLoc));
    }

    return results;
}

这很好用,这就是我填充listview的方法(ModuleDatabaseHandler是管理数据库的类):

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_view_modules_test);

    ModuleDatabaseHandler info = new ModuleDatabaseHandler(this);
    info.open();
    ArrayList<String> data = info.getData();
    info.close();

    l =  (ListView) findViewById(R.id.listView1);

    ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1 ,data);
    l.setAdapter(adapter);
    l.setOnItemClickListener(this);

    }

我希望能够点击listView项目,并查看与该记录相关的所有信息(在listView中仅显示某些信息)。我试图在名为ModuleDatabaseHandler的{​​{1}}类中创建一个新方法。

以下是启动新活动的getAllDataOnItemClick,使用ListViewgetAllData传递信息:

putExtra

以下是public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { TextView temp = (TextView) view; Toast.makeText(this, temp.getText() + " " + i, Toast.LENGTH_SHORT) .show(); ModuleDatabaseHandler info = new ModuleDatabaseHandler(this); info.open(); String module_info = info.getAllData(); // METHOD TO GET ALL DATA info.close(); Intent fullModuleDetails = new Intent(); fullModuleDetails.setClassName("com.example.collegetimetable", "com.example.collegetimetable.ModuleDetails"); fullModuleDetails.putExtra("list1", module_info); startActivity(fullModuleDetails); } 方法,用于从数据库中检索所有信息。我如何更改此方法,以检索与用户点击的特定getAllData项相关的行的信息?

listView

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

不是循环访问数据,而是按照以下方式执行操作:

public String getAllDataForRow(int row) {

    String[] columns = new String[]{ KEY_ROWID, KEY_MODULE_CODE, KEY_MODULE_NAME, KEY_LECTURE_PRACTICAL, KEY_LECTURE_DAY, KEY_START_TIME,KEY_END_TIME, KEY_LOCATION, ADDITIONAL_INFO};
    Cursor c = ourDatabase.query(DATABASE_MODULES, columns, null, null, null, null, null);

    if(c.moveToPosition(row)) {
        String result = "";
        for(int columnIndex = 0; columnIndex<c.getColumnCount();columnIndex++) {
            result += c.getString(columnIndex)+" ";
        }
        return result;
    } else {
        throw new IllegalArgumentException("Row " + row + " does not exist");
    }
}

另外,如果您不知道:如果您想要所有列,您实际上不必在投影中指定它们,但只能传递null而不是列。

希望有所帮助。