2013-03-12 3 views
0

Я работаю над приложением и имею небольшую проблему прямо сейчас. Позвольте мне объяснить, в чем цель этого приложения:
- есть главное меню с различными кнопками (скажем, 16 кнопок). - каждый раз, когда пользователь нажимает кнопку, он отправляет запрос в базу данных и отображает список результатов с разными результатами в зависимости от кнопки, которую вы нажали.
- в базе данных есть столбец с номером категории. (на самом деле есть 3 столбца с CatNumbers, но давайте сделаем это простым).
- запрос запрашивает отображение всех элементов, где это число категории равно некоторым значениям (это входы моего метода, называемые «myVariableN», отправленные из MainActivity в активность ListView через putExtra/getExtra). В моей ListViewActivity, который отображает результаты:Метод с более чем 50 входными переменными?

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 * *).
И, к сожалению, метод должен быть одинаковым для каждой кнопки, независимо от того, есть ли 2 или 50 входных переменных.

Мне кажется, что если я это сделаю, мой метод будет слишком тяжелым и замедлит все мое приложение, потому что в большинстве случаев, даже если запрос будет искать 2 или 3 CatNumbers, метод будет определяться для 50 входов или более, поэтому каждый раз он будет делать весь расчет.

То, что я думал только о том:
а/ Изменение моего метода с утверждением IF, так, например, если есть меньше, чем ... скажем, 6 переменных послали, он будет делать легкий метод с только 6 myVariable input, ELSE, он будет запускать тяжелый метод с 50 входами. Таким образом, тяжелый метод будет использоваться только в нескольких случаях, неверно, что даже если есть только 7 входов, он будет запускать тяжелый метод. Или в такой же идее я мог бы отправить логическое сообщение, отправленное через putExtra, и установить значение TRUE (для использования метода light) и FALSE (а затем он будет использовать тяжелый метод).
b/ Установите значение по умолчанию на 500 (как это сделано в моем коде), поэтому только конкретные myVariables имеют значение, отличное от 500. Затем мой вопрос: можно определить метод с 50 входами и чтобы он использовал только вход, значение которого отличается от определенного числа, поэтому метод не всегда слишком тяжел для запуска? Например, в приведенном выше коде с помощью метода можно было бы говорить только о двух переменных, если четыре других равны 500 (myVariable1 и myVariable2 вместо всех переменных, даже если весь метод определен для остальных ?).
Заранее благодарим!

+3

Я чувствую, что вы должны потратить некоторое время обрезки на этот вопрос сводится к проблеме минималистичным. В стороне, вы никогда не будете нуждаться в методе с 50 параметрами. Когда-либо. – Eric

+0

Инкапсулируйте свои значения в классах? – dmon

+1

Если вы используете WHERE ... IN, похоже, вы должны передать массив методу - возможно ли это? – Sam

ответ

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> и добавить эти идентификаторы, как вы оцениваете ваши кнопки. Наконец, вы должны передать список методу и оценить его должным образом.

Моя кишка говорит, что вы можете улучшить свой дизайн базы данных, чтобы полностью избежать конструкции WHERE ... IN, но это трудно определить, не видя ERD.

+0

Я не могу на самом деле изменить базу данных, мне нужно работать с ней, и внутри нее уже более 8 тыс. Записей.Я собираюсь попробовать таким образом, передать массив моих переменных каждый раз, когда я нажимаю на кнопку, и переписать мой метод, чтобы он имел этот массив для ввода вместо самих переменных. Тем не менее, я не уверен, что понял код, который вы опубликовали: означает ли это, что этот код необходим, если, например, вы используете метод, чей ввод является массивом, но когда количество элементов не всегда одинаково? – Phalanx

+0

Отредактирован ответ. Вы можете вызвать метод с таким количеством или количеством параметров, которые вам нравятся. Внутри метода вы получите массив, если правильная длина. – 323go

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; 
} 
Смежные вопросы