0

私はアプリケーションに取り組んでおり、現在少し問題があります。このアプリケーションの目的を説明しましょう:
- さまざまなボタン (16 個のボタンとしましょう) を備えたメイン メニューがあります。- ユーザーがボタンをクリックするたびに、データベースにリクエストが送信され、クリックしたボタンに応じて異なる結果のリストビューが表示されます。
- データベースには、「カテゴリ番号」の列があります。(実際には、CatNumbers を含む 3 つの列がありますが、単純にしておきましょう)。
- リクエストは、このカテゴリ番号がいくつかの値に等しいすべての要素を表示するように求めます (これらは、"myVariableN" と呼ばれるメソッドの入力であり、MainActivity から putExtra/getExtra を介して 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 以上の入力があるため、毎回全体の計算を行う必要があります。

私が考えていたことは
: 50 の入力で重いメソッドを実行します。そのため、ヘビー メソッドはごく一部のケースでのみ使用されます。間違っているのは、入力が 7 つしかない場合でも、ヘビー メソッドが実行されることです。または、同じ種類のアイデアで、putExtra を介して送信され、TRUE (軽い方法を使用する場合) と FALSE (重い方法を使用する場合) に設定されたブール値を送信することもできます。
b /デフォルトで値を500に設定します(私のコードで行ったように)、特定のmyVariablesだけが500とは異なる値を持つようにします。そして私の質問は次のとおりです。50 の入力を持つメソッドを定義し、値が特定の数と異なる入力のみを使用するようにすることは可能ですか? たとえば、メソッドを使用した上記のコードでは、他の 4 つの変数が 500 に等しい場合 (残りのメソッド全体が定義されている場合でも、すべての変数ではなく myVariable1 と myVariable2)、2 つの変数のみを検索すると言えますか? )。
前もって感謝します !

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>、 またはを使用してそれらの ID を追加することです。Set<Integer>最後に、リストをメソッドに渡し、適切に評価します。

私の直感では、データベースの設計を改善して構造を完全に回避できると言っていますがWHERE ... IN、ERD を見ずにそれを判断するのは困難です。

于 2013-03-12T02:44:12.023 に答える
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; 
} 
于 2013-03-12T03:11:44.180 に答える