【问题标题】:android - SQL database, how can I make my code more efficientandroid - SQL 数据库,我怎样才能让我的代码更高效
【发布时间】:2016-10-18 18:09:33
【问题描述】:

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

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

【问题讨论】:

  • 除非您想使用一些 ORM,否则您需要在某些时候使用列索引
  • "then I pass these parameters to the viewDrug() method to display list of drugs from the database" 你想在哪里显示它们?

标签: android database android-cursor android-database


【解决方案1】:

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

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

按照本教程进行练习。

DAO Pattern Tutorial

希望对您有所帮助!

【讨论】:

    【解决方案2】:

    我认为最好的方法是使用静态最终变量声明所有列名,如下例所示:

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

    【讨论】:

      【解决方案3】:

      实际上我得到了部分解决方案。我以前没有听说过光标方法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();
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-12
        • 1970-01-01
        • 1970-01-01
        • 2019-09-19
        • 2021-04-17
        • 2016-05-08
        相关资源
        最近更新 更多