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()
,所以我将它与 HashMap
和 for
循环一起使用来完成工作。使用 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 模式在与数据库交互时非常有用。易于修改和创建可扩展的系统。
按照本教程进行练习。
希望对您有所帮助!
我运行在数据库助手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()
,所以我将它与 HashMap
和 for
循环一起使用来完成工作。使用 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 模式在与数据库交互时非常有用。易于修改和创建可扩展的系统。
按照本教程进行练习。
希望对您有所帮助!