我正在数据库帮助程序类方法中运行SQL查询以返回“药物”表中的所有条目
list_all_drugs() {
Cursor cursor = db.query("drugs", null , null, null, null, null, null);
return cursor;
}
然后在我的活动中,我使用游标数据如下:
db = new DatabaseHelper(this);
c = db.list_all_drugs();
c.moveToFirst();
while (!c.isAfterLast()) {
viewDrug(c.getString(0),c.getString(1),c.getString(2),c.getString(3),c.getString(4),c.getString(5),c.getString(6),c.getString(7),c.getString(8),c.getString(9),c.getString(10),c.getString(11));
c.moveToNext();
}
然后我将这些参数传递给viewDrug()方法,以显示数据库中的药物列表。每件事情都运行正常,但我发现这种方法不是最佳实践(?),特别是当我想插入或删除数据库列时,整个代码结构都会失败,我将不得不做很多硬编码。
那么,简而言之,有没有更好的方法来动态地与数据库列交互,而不是使用它们的索引逐个调用它们?感谢。
答案 0 :(得分:1)
我认为最好的方法是使用静态最终变量声明所有列名称,例如:
public static final String TABLE_DRUGS = "drugs";
public static final String COLUMN_NAME = "Name";
public static final String COLUMN_DOSAGE = "Dosage";
然后使用Cursor.getColumnIndex(COLUMN_NAME)和Cursor.getString获取您的游标值,如下所示:
c.moveToFirst();
while (!c.isAfterLast()) {
HashMap <String,String> columnsValues = new HashMap<>();
columnsValues.put(COLUMN_NAME, c.getString(c.getColumnIndex(COLUMN_NAME)));
columnsValues.put(COLUMN_DOSAGE, c.getString(c.getColumnIndex(COLUMN_DOSAGE)));
viewDrug(columnsValues);
c.moveToNext();
}
c.close();
答案 1 :(得分:0)
实际上我达成了部分解决方案。我之前没有听说过光标方法getColumnCount()
,所以我将它与HashMap
和for
循环一起使用以完成工作。使用HashMap
允许我将其传递给其他活动或片段,然后使用其名称作为HashMap键获取列值
这是我目前的代码
c.moveToFirst();
while (!c.isAfterLast()) {
HashMap <String,String> columnsValues = new HashMap<>();
for (int i = 0; i < c.getColumnCount(); i++) {
columnsValues.put(c.getColumnName(i), c.getString(i));
}
viewDrug(columnsValues);
c.moveToNext();
}
c.close();
我仍然希望看到更好的解决方案。
答案 2 :(得分:0)