3

SQLiteOpenHelperクラスに問題があります。プリンターの製造元とあらゆる種類のプリンターの詳細を含むデータベースがあります。このコードを使用して、データベースからすべてのメーカーを取得し、それらを配列リストに戻そうとします。

// 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;
}

私はすべてのメーカーをリストに一度入れたいと思っています。どういうわけか私はそれを機能させることができません。私はまだ初心者です。

助けてくれてありがとう。

4

3 に答える 3

3

SQLite ( http://www.sqlite.org/lang_select.html ) では、distinct キーワードを使用することもできます。そのために SQLiteDatabase.rawQuery(String query, String[] args) を使用します。

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

于 2012-12-04T18:43:41.793 に答える
1

2 つの問題があります。

  1. 最初に、リストmanufacturerInListが空の場合、for(String manufacturerInList:manufacturerList){ループ内に入らないため、リストにエントリが追加されることはありません。

  2. 問題1を修正してもif (!manufacturerInList.equals(cursorManufacturer))、リスト内の各エントリに対するチェックとしては機能せず、一致しないエントリをリストに複数回追加する可能性があります。

この問題を解決するには、2 つのオプションがあります。

オプション 1 : 次のように使用containsします。

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

オプション 2 :matchFoundブール値フラグを次のように使用します。

        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); 
        }
于 2012-12-04T18:45:13.157 に答える
0

ArrayList.contains(Object elem)を使用 して、項目が ArrayList に存在するかどうかを確認します。コードを次のように変更します。

  // 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());
    }
于 2012-12-04T18:32:50.607 に答える