2017-01-10 4 views
0

Ich habe diese Funktion, die die Liste der Alben oder buck_display_name (s) geben soll, aber es gibt wiederholte Wert zurück. Ich habe viel gesucht, aber konnte keine Hilfe finden:contentResolver gibt keine eindeutigen Daten von MediaProvider zurück

String[] projection = {"Distinct "+MediaStore.Images.Media.BUCKET_ID, 
      MediaStore.Images.Media._ID, 
      MediaStore.Images.Media.DATA, 
      MediaStore.Images.Media.BUCKET_DISPLAY_NAME 
    }; 
    cursor = getContentResolver().query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI,projection,null,null,"bucket_display_name ASC"); 
    Log.i("ResultCount",String.valueOf(cursor.getCount())); 

    int i=0; 
    _ALBUM_IDs = new ArrayList<>(); 
    URIs = new ArrayList<>(); 
    _IDs = new ArrayList<>(); 
    _ALBUM_NAMES = new ArrayList<>(); 
    while (cursor.moveToNext()){ 
     Log.i("Row",String.valueOf(i)); 
     for (int j=0;j<cursor.getColumnCount();j++){ 
      Log.i("Column "+j,cursor.getColumnNames()[j]+", value: "+cursor.getString(j)); 
     } 
     _ALBUM_IDs.add(cursor.getString(0)); 
     _IDs.add(cursor.getString(1)); 
     URIs.add(cursor.getString(2)); 
     _ALBUM_NAMES.add(cursor.getString(3)); 
     i++; 
    } 

Die Ausgabe von der verschachtelten Schleife:

I/ResultCount: 6 
I/Row: 0 
I/Column 0: bucket_id, value: -2075821635 
I/Column 1: _id, value: 43 
I/Column 2: _data, value: /storage/emulated/0/DCIM/DSC_0339.jpg 
I/Column 3: bucket_display_name, value: DCIM 
I/Row: 1 
I/Column 0: bucket_id, value: -2075821635 
I/Column 1: _id, value: 44 
I/Column 2: _data, value: /storage/emulated/0/DCIM/DSC_0934.jpg 
I/Column 3: bucket_display_name, value: DCIM 
I/Row: 2 
I/Column 0: bucket_id, value: -2075821635 
I/Column 1: _id, value: 45 
I/Column 2: _data, value: /storage/emulated/0/DCIM/DSC_2057m.jpg 
I/Column 3: bucket_display_name, value: DCIM 
I/Row: 3 
I/Column 0: bucket_id, value: -2075821635 
I/Column 1: _id, value: 46 
I/Column 2: _data, value: /storage/emulated/0/DCIM/DSC_2132.jpg 
I/Column 3: bucket_display_name, value: DCIM 
I/Row: 4 
I/Column 0: bucket_id, value: -2075821635 
I/Column 1: _id, value: 47 
I/Column 2: _data, value: /storage/emulated/0/DCIM/DSC_4258.jpg 
I/Column 3: bucket_display_name, value: DCIM 
I/Row: 5 
I/Column 0: bucket_id, value: 902704159 
I/Column 1: _id, value: 63 
I/Column 2: _data, value: /storage/emulated/0/DataSync/DSC_0249.jpg 
I/Column 3: bucket_display_name, value: DataSync 

Sie sehen können gibt es wiederholt Werte von bucket_id, bucket_display_name. Warum ist das? Vielen Dank.

Antwort

0

Die _id Werte sind unterschiedlich, daher funktioniert die Funktion korrekt.

Die ContentResolver.query()-Methode ermöglicht es Ihnen nicht wirklich, nach bestimmten Werten in einer bestimmten Spalte zu filtern (dies würde GROUP BY erfordern, was ebenfalls nicht möglich ist), es sei denn, der Inhaltsanbieter gibt Ihnen eine Datenquelle dafür. Sie müssen die Ergebnisse manuell filtern.

+0

die '_id' sind offensichtlich verschieden, weil hier diese Spalte wahrscheinlich eine Art PRIMARY KEY ist. Wie auch immer, danke für Ihre Antwort, können Sie eine Idee über GROUP BY –

+0

eigentlich ich habe das Ergebnis manuell mit Hilfe von Hash-Sets, aber ich wollte weniger Ergebnis aus der Datenbank holen, weil es in Bezug auf die Leistung besser wäre. –