我正在处理一个应用程序,现在有一点问题。让我解释一下这个申请的目的是什么:
- 有一个带有不同按钮的主菜单(比方说16个按钮)。
- 每次用户点击按钮时,它都会向数据库发送请求,并根据您单击的按钮显示结果的列表视图,其中包含不同的结果。
- 在数据库中,有一个带有“类别编号”的列。 (实际上CatNumbers有3列,但让它保持简单)
- 请求显示此类别编号等于某些值的所有元素(这些是我的方法的输入,称为“myVariableN”,通过putExtra / getExtra从MainActivity发送到ListView活动)。在我的ListViewActivity中显示结果:
private void displayListView() {
Bundle bundle = getIntent().getExtras();
String title = bundle.getString("title", "Choose here :");
int myVariable1 = bundle.getInt("myVariable1", 500);
int myVariable2 = bundle.getInt("myVariable2", 500);
int myVariable3 = bundle.getInt("myVariable3", 500);
int myVariable4 = bundle.getInt("myVariable4", 500);
int myVariable5 = bundle.getInt("myVariable5", 500);
int myVariable6 = bundle.getInt("myVariable6", 500);
所以我到目前为止是这样的:如果你点击按钮1,它会发送6个变量(myVariable1,2,3 ... 6)并要求显示所有元素“WHERE CatNumber IN(myVariable1,myVariable2) ,... myVariable6)。
public Cursor findPoiInTable(int myVariable1, int myVariable2,
int myVariable3, int myVariable4, int myVariable5, int myVariable6)
{
String inInterval = "(?,?,?,?,?,?)";
String where = COL_CAT1 + " IN " + inInterval + " OR " + COL_CAT2
+ " IN " + inInterval + " OR " + COL_CAT3 + " IN " + inInterval;
String[] whereArgs = new String[3 * 6];
for (int i = 0; i < 3; i++)
{
whereArgs[6 * i] = Integer.toString(myVariable1);
whereArgs[6 * i + 1] = Integer.toString(myVariable2);
whereArgs[6 * i + 2] = Integer.toString(myVariable3);
whereArgs[6 * i + 3] = Integer.toString(myVariable4);
whereArgs[6 * i + 4] = Integer.toString(myVariable5);
whereArgs[6 * i + 5] = Integer.toString(myVariable6);
}
Cursor c = myDatabase.query(DATABASE_TABLE, new String[] { KEY_ROWID,
COL_NAME, COL_STREET}, where, whereArgs, null, null, null);
return c;
}
问题是,在主菜单中的这16个按钮中,有一些按钮需要从数据库中获取具有更大范围的类别编号的数据。例如,“SELECT .... FROM .... WHERE CatNumber IN(myVariable1,myVariable2,..... myVariable * 50 *)。” 不幸的是,无论是否有2个或50个输入变量,每个按钮的方法必须相同。
我觉得如果我这样做,我的方法会太重,会减慢我的整个应用程序,因为在大多数情况下,即使请求将被发现2或3个CatNumbers,该方法将定义为50个或更多输入,因此每次都必须进行整个计算。
我在想的是:
a / 使用IF语句修改我的方法,例如,如果有少于...让我们说6个变量发送,它将使light方法只有6个myVariable输入,ELSE,它是用50输入运行重法。所以繁重的方法只会在少数情况下使用,错误的是即使只有7个输入,它也会运行繁重的方法。或者在同一种想法中,我可以发送一个通过putExtra发送的布尔值并设置为TRUE(使用light方法)和FALSE(然后它将使用重方法)。
b / 默认情况下将值设置为500(在我的代码中完成),因此只有特定的myVariables的值不同于500.然后我的问题是:是否可以定义一个50输入的方法,并使它只使用其值不同于某个数字的输入,所以该方法并不总是太重而无法运行?例如在上面的代码中使用该方法,会不会如果另外四个变量等于500(myVariable1和myVariable2而不是所有变量,即使整个方法是为其余变量定义的话,也可以说只查找两个变量?)。
提前谢谢!
答案 0 :(得分:2)
你想要这个 -
void myVariableMethod( int... catIds ) {
for( int catId : catIds ) {
Log.d( "Output", "catId: " + catId );
}
}
在方法声明中的类型之后添加省略号将允许您将任意数量的相同类型的参数传递给方法。 catIds
实际上是方法体内的int[]
数组。
您可以按如下方式调用此方法:
myVariableMethod( 1, 2, 3, 4 );
myVariableMethod( 1 );
myVariableMethod( 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 );
myVariableMethod( 1, 2, 3, 4, 100, 101, 102 );
更优雅的问题解决方案是使用List<Integer>
或Set<Integer>
并在评估按钮时添加这些ID。最后,您可以将列表传递给方法并对其进行正确评估。
我的直觉说你可以改进你的数据库设计以完全避免WHERE ... IN
构造,但是如果没有看到ERD就很难确定。
答案 1 :(得分:1)
当然你可以使用Vararg的define you方法:
public Cursor findPoiInTable(int ... myVariable)
{
//construct String from myVariable array
StringBuffer sb = new StringBuffer("(");
for (int i : myVariable)
{
sb.append(",?");
}
sb.append(")");
String inInterval = sb.toString();
String where = COL_CAT1 + " IN " + inInterval + " OR " + COL_CAT2
+ " IN " + inInterval + " OR " + COL_CAT3 + " IN " + inInterval;
String[] whereArgs = new String[3 * myVariable.length];
int j = 0
for (int i = 0; i < 3; i++)
{
whereArgs[6 * i + j] = Integer.toString(myVariable[j++]);
whereArgs[6 * i + j] = Integer.toString(myVariable[j++]);
whereArgs[6 * i + j] = Integer.toString(myVariable[j++]);
whereArgs[6 * i + j] = Integer.toString(myVariable[j++]);
whereArgs[6 * i + j] = Integer.toString(myVariable[j++]);
whereArgs[6 * i + j] = Integer.toString(myVariable[j++]);
}
Cursor c = myDatabase.query(DATABASE_TABLE, new String[] { KEY_ROWID,
COL_NAME, COL_STREET}, where, whereArgs, null, null, null);
return c;
}