android - SQL数据库,如何让我的代码更高效

时间:2016-06-17 03:13:11

标签: android database android-cursor android-database

我正在数据库帮助程序类方法中运行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()方法,以显示数据库中的药物列表。每件事情都运行正常,但我发现这种方法不是最佳实践(?),特别是当我想插入或删除数据库列时,整个代码结构都会失败,我将不得不做很多硬编码。

那么,简而言之,有没有更好的方法来动态地与数据库列交互,而不是使用它们的索引逐个调用它们?感谢。

3 个答案:

答案 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(),所以我将它与HashMapfor循环一起使用以完成工作。使用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)

您应该熟悉DAO Pattern以提高代码的效率。

DAO模式在与数据库交互时非常有用。易于修改和创建可扩展的系统。

按照本教程练习并练习。

DAO Pattern Tutorial

希望有所帮助!