android - SQL 数据库,我怎样才能让我的代码更有效率

android - SQL database, how can I make my code more efficient

我运行在数据库助手class方法中SQL查询return来自"drugs"table的所有条目

list_all_drugs() {
  Cursor cursor = db.query("drugs", null , null, null, null, null, null);
  return cursor;
}

然后在我的 activity 中,我使用如下光标数据:

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

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

实际上我找到了部分解决方案。我以前没有听说过游标方法 getColumnCount(),所以我将它与 HashMapfor 循环一起使用来完成工作。使用 HashMap 允许我将其传递给其他 activity 或片段,然后使用其名称作为 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();

我仍然希望看到更好的解决方案。

我认为最好的方法是像这个例子一样用静态最终变量声明所有列名:

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

您应该熟悉 DAO 模式以提高代码效率。

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

按照本教程进行练习。

DAO Pattern Tutorial

希望对您有所帮助!