2012-12-04 2 views
3

SQLiteOpenHelper 클래스에 문제가 있습니다. 프린터 제조업체의 데이터베이스와 모든 종류의 프린터에 대한 세부 정보가 있습니다. 나는이 코드로 내 데이터베이스에서 모든 제조업체를 얻고 arraylist로 반환하려고합니다.SQLOpenHelper가 작동하지 않는 ArrayList 가져 오기

// Read database for All printer manufacturers and return a list 
public ArrayList<String> getPrManufacturer(){ 
    ArrayList<String> manufacturerList = new ArrayList<String>(); 
    SQLiteDatabase db = getReadableDatabase(); 
    Cursor cursor = db.query(CoDeskContract.Printer.TABLE_NAME, 
          printerManuProjection, null, null, null, null, null,null); 

    // If cursor is not null and manufacturer List 
    // does not contains Manufacturer in the list then add it! 
    if ((cursor != null) && (cursor.getCount()>0)){ 
     cursor.moveToFirst(); 
     do { 
      String cursorManufacturer = cursor.getString(0); 
      //Checking for manufacturer in the list 
      for(String manufacturerInList:manufacturerList){ 
       if (!manufacturerInList.equals(cursorManufacturer)) 
        manufacturerList.add(cursorManufacturer);    
      }     
     }while(cursor.moveToNext()); 
    } 

    // Return list of manufacturers from database 
    return manufacturerList; 
} 

모든 제조업체를 한 번만 목록으로 원합니다. 어쨌든 나는 그것을 작동시키지 못한다. 아직 신참입니다.

도움 주셔서 감사합니다. 또한 SQLite는의 고유 한 키워드 (http://www.sqlite.org/lang_select.html)를 사용할 수 있습니다

// does not contains Manufacturer in the list then add it! 
    if ((cursor != null) && (cursor.getCount()>0)){ 
     cursor.moveToFirst(); 
     do { 
      String cursorManufacturer = cursor.getString(0); 
      //Checking for manufacturer in the list 
      if (!manufacturerList.contains(cursorManufacturer)) { 
        manufacturerList.add(cursorManufacturer); 
       } else { 
        System.out.println("cursorManufacturernot found"); 
       }    
     }while(cursor.moveToNext()); 
    } 

답변

1

이 두 가지 문제가 있습니다 : 목록 manufacturerInList 다음 비어있을 때 태초에

  1. , 그것은 내부 for(String manufacturerInList:manufacturerList){ 루프를 이동하지 않으며, 따라서이 목록에있는 모든 항목을 추가하지 않습니다 .

  2. 문제를 해결 한 후에도 if (!manufacturerInList.equals(cursorManufacturer))은 목록의 각 항목을 검사하고 목록에 일치하지 않는 항목을 여러 번 추가 할 수 있으므로 작동하지 않습니다.

문제를 해결하려면 두 가지 옵션이 있습니다.

 String cursorManufacturer = cursor.getString(0); 
     boolean matchFound = false; 

     //Checking for manufacturer in the list 
     for(String manufacturerInList:manufacturerList){ 
      if (manufacturerInList.equals(cursorManufacturer)){ 
       matchFound = true; 
       break; 
      } 
     }     
     if(!matchFound){ // <- doesn't exit in the list 
      manufacturerList.add(cursorManufacturer); 
     } 
+0

감사합니다 당신이 이것을 설명해주었습니다 :) – Katamave

+0

@Katamave 이것이 도움이된다고 생각한다면 대답을 받아들이는 것을 잊지 마십시오. –

+0

@Katamave : 괜찮습니다. –

0

사용 ArrayList.contains(Object elem) 확인합니다. SQLiteDatabase.rawQuery (String query, String [] args)를 사용하십시오.

db.rawQuery("SELECT DISTINCT name FROM " + CoDeskContract.Printer.TABLE_NAME,null);

+0

또한 사용하여 수행 할 수 있습니다이 :) – Katamave

3

: 같은 항목이 코드를 변경 ArrayList의 존재 여부를 경우

+1

이 주셔서 감사합니다 :

옵션 1 :

 if (!manufacturerList.contains(cursorManufacturer)) { manufacturerList.add(cursorManufacturer); } 

옵션 2는 : 같은 matchFound 부울 플래그를 사용하여 사용 contains는 다음과 같이 query() 메소드의 'distinct' 매개 변수는 . –

관련 문제