0

我正在开发一个应用程序,现在有一个小问题。让我解释一下这个应用程序的目的是什么:
- 有一个带有不同按钮的主菜单(比如说 16 个按钮)。- 每次用户单击按钮时,它都会向数据库发送一个请求,并根据您单击的按钮显示具有不同结果的结果列表视图。
- 在数据库中,有一列带有“类别号”。(实际上有 3 列带有 CatNumbers,但让我们保持简单)。
- 请求要求显示此类别编号等于某些值的所有元素(这些是我的方法的输入,称为“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 个 CatNumber,该方法也会被定义为50 个或更多输入,因此每次都必须进行整个计算。

我在想的是:
a/用 IF 语句修改我的方法,例如,如果少于...假设发送了 6 个变量,它将使轻方法只有 6 个 myVariable 输入,否则,它是将使用 50 个输入运行繁重的方法。所以heavy方法只会在少数情况下使用,错误的是即使只有7个输入,它也会运行heavy方法。或者以同样的想法,我可以发送一个通过 putExtra 发送的布尔值,并设置为 TRUE(用于使用 light 方法)和 FALSE(然后它将使用 heavy 方法)。
b/将默认值设置为 500(如我的代码中所做的那样),因此只有特定的 myVariables 的值不同于 500。然后我的问题是:是否可以定义一个具有 50 个输入的方法并使其仅使用其值与某个数字不同的输入,因此该方法并不总是太重而无法运行? 例如,在上面带有方法的代码中,是否可以说如果其他四个变量等于 500(myVariable1 和 myVariable2 而不是所有变量,即使整个方法都是为其余定义的,则只查找两个变量? )。
提前致谢 !

4

2 回答 2

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,这很难确定。

于 2013-03-12T02:44:12.023 回答
1

当然,您可以将定义您的方法与 Vararg 一起使用:

 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; 
} 
于 2013-03-12T03:11:44.180 回答