【问题标题】:Get full SQlite database information from relevant row/record when clicking listView item (which contains partial information from the row/record)单击 listView 项时从相关行/记录中获取完整的 SQlite 数据库信息(其中包含来自行/记录的部分信息)
【发布时间】:2013-11-01 15:04:13
【问题描述】:

我有一个名为 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;
}

这很好用,这是我填充列表视图的方式(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 中它只显示某些信息)。我试图在名为getAllDataModuleDatabaseHandler 类中创建一个新方法。

下面是OnItemClick 用于启动新活动的ListView 项目,使用putExtra 传递来自getAllData 的信息:

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 项目相关的行的信息?

public String getAllData() {

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

    String results = "";

    int indexRow = c.getColumnIndex(KEY_ROWID);
    int indexModCode = c.getColumnIndex(KEY_MODULE_CODE);
    int indexModName = c.getColumnIndex(KEY_MODULE_NAME);
    int indexLectPrac = c.getColumnIndex(KEY_LECTURE_PRACTICAL);

    int indexLectDay = c.getColumnIndex(KEY_LECTURE_DAY);

    int indexLectStart = c.getColumnIndex(KEY_START_TIME);
    int indexLectEnd = c.getColumnIndex(KEY_END_TIME);
    int indexLectLoc = c.getColumnIndex(KEY_LOCATION);
    int indexLectInfo = c.getColumnIndex(ADDITIONAL_INFO);


    for (c.moveToFirst();!c.isAfterLast();c.moveToNext()){
        results = results +  ( c.getString(indexModCode) +  " " + c.getString(indexModName) + " " + c.getString(indexLectPrac)
                + " " + c.getString(indexLectDay) + " " + c.getString(indexLectStart) + " " + c.getString(indexLectEnd) + " " 
                + c.getString(indexLectLoc) + " " + c.getString(indexLectInfo));
    }

    return results;
}

感谢您的帮助

【问题讨论】:

    标签: android sqlite android-listview android-cursor


    【解决方案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 而不是列。

    希望对您有所帮助。

    【讨论】:

    • 太好了 - 谢谢..我搞定了,我也会试试你的编辑(代码少得多 - 现在试试这个并告诉你)
    • 您的编辑对我有用,谢谢,很高兴知道如何以这种方式获取所有列。
    • 我认为如果你想要所有列并将它们连接成一个字符串,那么手动处理它们是没有意义的,并且代码变得更具可读性。
    猜你喜欢
    • 1970-01-01
    • 2017-02-15
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 2013-01-08
    • 2016-12-01
    • 2014-01-26
    • 1970-01-01
    相关资源
    最近更新 更多