1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

select Anweisung (where, selectionArgs)

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von assenda, 13.05.2011.

  1. assenda, 13.05.2011 #1
    assenda

    assenda Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    55
    Erhaltene Danke:
    0
    Registriert seit:
    02.12.2010
    Hallo, ich versuche gerade, eine Schnittstelle zur Kontaktliste zu bekommen. Leider habe etwas Probleme mit einer Select-Anweisung...

    Die Verbindung klappt so schon, nur werden momentan ALLE Daten ausgegeben, da ich noch keine Bedinung gestellt habe...

    wenn ich hier die where einbinde, wird nichts mehr ausgegeben:

    Code:
    return mContentResolver.query(CONTENT_URI, null, were ,  selectionArgs, null);
    Kann jemand feststellen, wieso bei folgender Abfrage nichts mehr gefiltert werden kann?!

    Code:
       where = String.format("(%s LIKE ?) ", name);
                String filter = String.valueOf(constraint) + '%';
               selectionArgs = new String[] { filter, filter };
    Code:
    public class ContactAdapter extends ResourceCursorAdapter {
        
        private static final Uri CONTENT_URI = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
        private final ContentResolver mContentResolver;
        
        String name;
        
        public ContactAdapter(Context context) {
            super(context, R.layout.dropdown_item, null);
            mContentResolver = context.getContentResolver();
        }
    
        @Override
        public final String convertToString(Cursor cursor) {
            String projection = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            return projection;
        }
    
        @Override
        public final void bindView(View view, Context context, Cursor cursor) {
            
            TextView textFeldName = (TextView) view.findViewById(R.id.name);
            TextView textFeldTelefon = (TextView) view.findViewById(R.id.telefon);
            TextView textFeldTyp = (TextView) view.findViewById(R.id.typ);
    
            name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
            String phoneNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
            String numberType = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
                    
            if (numberType.equals("0"))
                numberType = "Work";
            else if (numberType.equals("1"))
                numberType = "Home";
            else if (numberType.equals("2"))
                numberType = "Mobile";
            else
                numberType = "Other";
    
            textFeldName.setText(name);
            textFeldTelefon.setText(phoneNumber);
            textFeldTyp.setText(numberType);
        }
         
        @Override
        public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
            
            String where = null;
            String[] selectionArgs = null;
            
            if (constraint != null) {
                where = String.format("(%s LIKE ?) ", name);
                String filter = String.valueOf(constraint) + '%';
                selectionArgs = new String[] { filter, filter };
            }
            
            return mContentResolver.query(CONTENT_URI, null, null , null, null);
        }
    
    }
    
    Danke;)
     
  2. Ciraxis, 13.05.2011 #2
    Ciraxis

    Ciraxis Neuer Benutzer

    Beiträge:
    6
    Erhaltene Danke:
    0
    Registriert seit:
    28.06.2010
    where != were?;)
     
  3. ErDa, 13.05.2011 #3
    ErDa

    ErDa Android-Hilfe.de Mitglied

    Beiträge:
    90
    Erhaltene Danke:
    12
    Registriert seit:
    30.03.2010
    Tablet:
    Nexus 7 (2013)
    Das %-Zeichen in der Variable filter wird maskiert wenn es als Auswahlargument übergeben wird. Wenn das % zum LIKE gehören soll muss es mit in die where-Variable. Da musst Du es dann ebenfalls markieren, damit es nicht als Argument vom FormatString gewertet wird.
    Code:
    where = String.format("(%s LIKE ?%%) ", name);
    String filter = String.valueOf(constraint);
    selectionArgs = new String[] { filter, filter };
    Allerdings versteh ich nicht warum du filter 2x in selectionArgs hast, in deiner where-Variable ist nur ein Filterkriterium drin.

    Edit: @Ciraxis: das kanns nicht sein, dann wäre das Kompilieren schon fehlgeschlagen.
     
  4. assenda, 13.05.2011 #4
    assenda

    assenda Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    55
    Erhaltene Danke:
    0
    Registriert seit:
    02.12.2010
    logisch ;) danke xD aber durch umbenennen der variable ist der Fehler auch nicht behoben ;)

    hat jemand in der zwischenzeit zufällig iwas fehlerhaftes gesehen?!

    edit: 2 eintrag nicht gesehn,
    ja...da ist schon mal ein fehler..hab vorher zwei argumente in der were anweisung gehabt...
    werd das mal sofort prüfen...
    danke schonmal
     
  5. assenda, 13.05.2011 #5
    assenda

    assenda Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    55
    Erhaltene Danke:
    0
    Registriert seit:
    02.12.2010
    Hm also daran lag es auch nicht :(
    sobald ich sowie die selectionArgs einbinde, wird einfach kein Kontakt mehr angezeigt :(

    Code:
    if (constraint != null) {
                were = String.format("(%s LIKE ?%%) ", name);
                String filter = String.valueOf(constraint);
                selectionArgs = new String[] { filter};
            }
            
            return mContentResolver.query(CONTENT_URI, null, were , selectionArgs, null);
    
     
  6. ErDa, 14.05.2011 #6
    ErDa

    ErDa Android-Hilfe.de Mitglied

    Beiträge:
    90
    Erhaltene Danke:
    12
    Registriert seit:
    30.03.2010
    Tablet:
    Nexus 7 (2013)
    Hab mal in die Dokumentation geguckt: da steht:
    Du könntest es mal so probieren:
    Code:
    were = String.format("(%s LIKE ?s%%) ", name);
    Aber selbst wenn das dann geht findest Du damit nur Ergebnisse die mit dem Such-String (filter) anfangen, wenn der an beliebiger Stelle stehen soll musst das so aussehen:
    Code:
    were = String.format("(%s LIKE %%?s%%) ", name);
     
  7. assenda, 14.05.2011 #7
    assenda

    assenda Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    55
    Erhaltene Danke:
    0
    Registriert seit:
    02.12.2010
    jea!! ich habs (bis auf einen kleinen Fehler) hinbekommen...Hier erstmal ein großes Dankeschön an alle die mitgeholfen haben!

    Momentan funktioniert das Programm genauso wie ich wollte,
    allerdings wird eine Exeption geworfen, wenn sich nur 1 bzw 0 zeichen in der suchleiste befinden (beim eintippen bzw löschen)...wenn ich per log den constraint ausgeben, werden aber alle zeichen übergeben.

    05-14 10:53:52.729: WARN/Filter(1461): An exception occured during performFiltering()!
    05-14 10:53:52.729: WARN/Filter(1461): java.lang.NullPointerException
    05-14 10:53:52.729: WARN/Filter(1461): at test.test.ContactAdapter.runQueryOnBackgroundThread(ContactAdapter.java:64)
    05-14 10:53:52.729: WARN/Filter(1461): at android.widget.CursorFilter.performFiltering(CursorFilter.java:49)
    05-14 10:53:52.729: WARN/Filter(1461): at android.widget.Filter$RequestHandler.handleMessage(Filter.java:234)
    05-14 10:53:52.729: WARN/Filter(1461): at android.os.Handler.dispatchMessage(Handler.java:99)
    05-14 10:53:52.729: WARN/Filter(1461): at android.os.Looper.loop(Looper.java:123)
    05-14 10:53:52.729: WARN/Filter(1461): at android.os.HandlerThread.run(HandlerThread.java:60)


    --> Der funktionierende Code - aber mit Exeptionbei 0/1 zeichen
    Code:
    public Cursor runQueryOnBackgroundThread(CharSequence constraint){ 
    
    String[] selectionArgs = null;
            String name = ContactsContract.Contacts.DISPLAY_NAME;
            String number = ContactsContract.CommonDataKinds.Phone.NUMBER;
            
            String were = String.format("(%s LIKE ?) OR (%s LIKE ?)", name, number);
            String filter = String.valueOf("%" + constraint.toString ()+"%");
            selectionArgs = new String[]{filter, filter};
            
            return mContentResolver.query(CONTENT_URI, null, were, selectionArgs, null);
    }
    Hat jemand eineen Vorschlag, was ich noch ändern muss?!
     
    Zuletzt bearbeitet: 15.05.2011
  8. assenda, 15.05.2011 #8
    assenda

    assenda Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    55
    Erhaltene Danke:
    0
    Registriert seit:
    02.12.2010
    Übrigens ist die Exeption nur eine Warnung und kein Error...
    Ist das schlimm?!
    Wenn ich den Filter per logCat ausgebe,
    bekomme ich folgende ausgaben ab 2 Buchstaben:
    %da% (Wobei da für das eingegebene suchwort steht)

    Wenn ich nur d eingebe, bzw a lösche, wird gar nichts mehr ausgegeben und ich erhalte die null-pointer exeption...
    Vermutlich, weil das autocomplete erst ab 2buchstaben anfängt zu suchen...
    Kann jemand bitte einen tipp geben?!
     
    Zuletzt bearbeitet: 15.05.2011
  9. assenda, 15.05.2011 #9
    assenda

    assenda Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    55
    Erhaltene Danke:
    0
    Registriert seit:
    02.12.2010
    Ok ich bin selber dahinter gekommen..
    die null-Pointer Exeption ist nur gekommen, weil erst bei 2 buchstaben der constraint übergeben wird.
    Da ich immer ein constraint.toString() durchgeführt habe, war war bei 0/1 zeichen kein charelement in constraint.

    folgender code löst dieses Problem:

    Code:
        public Cursor runQueryOnBackgroundThread(CharSequence constraint) {
    
            String[] selectionArgs = null;
            String name = ContactsContract.Contacts.DISPLAY_NAME;
            String number = ContactsContract.CommonDataKinds.Phone.NUMBER;
    
            String were = String.format("(%s LIKE ?) OR (%s LIKE ?)", name, number);
    
        
            if (String.valueOf(constraint) != "null") {
                String filter = String.valueOf("%" + constraint.toString() + "%");
                selectionArgs = new String[] { filter, filter };
            }
    
            return mContentResolver.query(CONTENT_URI, null, were, selectionArgs, null);
        }
     

Diese Seite empfehlen