2017-07-20 12 views
0

私はjavaのnoobですが、私はC++の知識があるので、その考え方でループを作成しました。 DBからテーブルの名前を含む2つの配列からデータを取得しようとしています。いずれかの表のいずれかの要素が別の表の要素と等しい場合は、両方の表の両方の名前が別の配列に保存されます。これは、配列が終了するまで発生します。さて、いくつかの問題によって、各カーソルには同じテーブルが何度も含まれていますが、私はそれを世話したと思います。 ここでは、以下のロジックを使用して、1つまたは2つの異なる表のペアを取得する必要がありますが、代わりに、同じペアを何度も何度も繰り返しています。私はループの順序とロジックを何度も変更していますが、この構成は少なくとも結果をもたらします。 問題は構文の代わりに論理的だと思います。どこで私は間違えましたか?ANDROID、JAVA:カーソルとループで重複した結果を得る

私のコードは次のとおりです。

int maa; 

    for (int i = 0; i < ArraySource.size(); i++) { 

     // cursor for source 

     Cursor sourceCursor = myDB.rawQuery("SELECT * FROM '" + ArraySource.get(i) + "';", null); 
     int sourceIndex = sourceCursor.getColumnIndex("Stop"); 

     for (int ii = 0; ii < ArrayDest.size(); ii++) { 

      // counter for finding match 
      maa=0; 


      Cursor destCursor = myDB.rawQuery("SELECT * FROM '" + ArrayDest.get(ii) + "';", null); 
      int destIndex = destCursor.getColumnIndex("Stop"); 

      sourceCursor.moveToFirst(); 
      String nameSource = sourceCursor.getString(sourceIndex); 
      destCursor.moveToFirst(); 
      String nameDest = destCursor.getString(destIndex); 

      // data is repeated many times in the cursor, so this is hack to take the first result and check with every result 
      // so if match is found loop is broken 

      // But to do that first result should be taken out of loop, hence the following 
      // First result of first cursor checking with first result of second cursor 

      if (nameSource.equals(nameDest)){ 

       IndirectArray1.add(ArraySource.get(i)); 
       IndirectArray2.add(ArrayDest.get(ii)); 
       maa=1; 

      }else { 

       //checking with all results of second cursor 
       for (destCursor.moveToNext(); !destCursor.isAfterLast(); destCursor.moveToNext()) { 

        if(nameDest.equals(destCursor.getString(destIndex))){ 

         break; 
        } 

        if (nameSource.equals(destCursor.getString(destIndex))) { 

         IndirectArray1.add(ArraySource.get(i)); 
         IndirectArray2.add(ArrayDest.get(ii)); 
         maa=1; 
         break; 

        } 
       } 
      } 
      // condition for running nexr for loop above logic is used in following loop 
      if(maa ==0){ 

       MsMoot: 
       for (sourceCursor.moveToNext(); !sourceCursor.isAfterLast(); sourceCursor.moveToNext()) { 

        destCursor.moveToFirst(); 

        if (nameSource.equals(sourceCursor.getString(sourceIndex))) { 

         break; 

        } 

        if (sourceCursor.getString(sourceIndex).equals(destName)) { 

         IndirectArray1.add(ArraySource.get(i)); 
         IndirectArray2.add(ArrayDest.get(ii)); 
         break; 

        }else { 

         for (destCursor.moveToNext(); !destCursor.isAfterLast(); destCursor.moveToNext()) { 

          if (destCursor.getString(destIndex).equals(nameDest)) { 

           break; 

          } 

          if (sourceCursor.getString(sourceIndex).equals(destCursor.getString(destIndex))) { 

           IndirectArray1.add(ArraySource.get(i)); 
           IndirectArray2.add(ArrayDest.get(ii)); 
           break MsMoot; 

          } 
         } 
        } 
       } 
      // closing cursors 
      }destCursor.close(); 

     }sourceCursor.close(); 

    } 

答えて

1

それは無限ループのように見えます。すべてを繰り返し、何回もループしようとしているため、重複した行が表示されています。結果では、各テーブルの最初の行が何度も取得されています。その後、ある値が何度も同じ値としてマークされます。カーソルは、特定のテーブルのクエリを作成し、データを格納します。これで、すべてのデータを読み、より人間的な方法で格納する必要があります。次に、格納されたデータが等しいかどうかをチェックします。サンプルコードです
@edit
ArraySourceリスト内に格納されている各テーブルについて、ArrayDestリスト内のすべてのテーブルに対してqueryを呼び出してから、firstListの各StringをsecondListと同じにするforeachループを実行します。これは正しく動作するはずです。私の理解あたりとして

for(int i = 0; i < ArraySource.size(); i++) { 
       List<String> firstList = new ArrayList<>(); 
       List<String> secondList = new ArrayList<>(); 
       Cursor sourceCursor = myDB.rawQuery("SELECT * FROM '" + ArraySource.get(i) + "';", null); 

       if(sourceCursor != null) { 
        if(sourceCursor.moveToFirst()) { 
         do { 
          String a = sourceCursor.getString(0); 
          firstList.add(a); 
         } while(sourceCursor.moveToNext()); 
        } 
       } 

       sourceCursor.close(); 

       for (int j = 0; j < ArrayDest.length; j++) { 

        Cursor destCursor = myDB.rawQuery("SELECT * FROM '" + ArrayDest.get(j) + "';", null); 

        if (destCursor != null) { 
         if (destCursor.moveToFirst()) { 
          do { 
           String b = destCursor.getString(0); 
           secondList.add(b); 
          } while (destCursor.moveToNext()); 
         } 
        } 
        destCursor.close(); 

        for (String one : firstList) { 
         for (int k = 0; k < secondList.size(); k++) { 
          String two = secondList.get(k); 
          if (one.equals(two)) { 
           //make your logic here 
          } 
         } 
        } 
       } 
      } 
+0

、このループはそうでsecondlistのすべての結果にfirstlistの第二の結果、その後、secondlistのすべての結果にfirstlistの最初の結果をチェックします。 firstループのすべての結果に対して、jループの上に余分なループを置くべきですか? –

+0

私は自分の答えを更新しました。 – grabarz121

+0

それは働いた!論理に感謝します。あなたのソリューションは100以上の全体的な回線を節約しました。 –

関連する問題