select Anweisung (where, selectionArgs)

A

assenda

Ambitioniertes Mitglied
0
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;)
 
where != were?;)
 
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.
 
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
 
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);
 
Hab mal in die Dokumentation geguckt: da steht:
selectionArgs - You may include ?s in selection, which will be replaced by the values from selectionArgs, in the order that they appear in the selection. The values will be bound as Strings.
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);
 
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:
Ü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:
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);
    }
 

Ähnliche Themen

M
  • mafoma63
Antworten
2
Aufrufe
759
swa00
swa00
Jansenwilson
Antworten
1
Aufrufe
687
Mazuch
Mazuch
D
Antworten
1
Aufrufe
1.559
koje71
koje71
Zurück
Oben Unten