Jetzt kostenlos registrieren. Mitglieder surfen ohne Werbung auf Android-Hilfe.de!
Zurück   Android-Hilfe.de > Android Developer > Android App Entwicklung

select Anweisung (where, selectionArgs)

Das Thema "select Anweisung (where, selectionArgs)" befindet sich unter Android App Entwicklung auf Android-Hilfe.de.


Antwort

 

Themen-Optionen Ansicht
Alt 13.05.2011, 17:08   #1 (permalink)
Android-Hilfe.de Mitglied

Registriert seit: 02.12.2010
Beiträge: 52
Abgegebene Danke: 6
Erhielt 0 Danke für 0 Beiträge
Standard select Anweisung (where, selectionArgs)

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
assenda ist offline   Mit Zitat antworten
Alt 13.05.2011, 17:58   #2 (permalink)
Neuer Benutzer

Registriert seit: 28.06.2010
Beiträge: 8
Abgegebene Danke: 1
Erhielt 0 Danke für 0 Beiträge
Standard AW: select Anweisung (where, selectionArgs)

where != were?
Ciraxis ist offline   Mit Zitat antworten
Alt 13.05.2011, 18:03   #3 (permalink)
Android-Hilfe.de Mitglied
 
Benutzerbild von ErDa

Modell: Galaxy Nexus + Toshiba AC100

Registriert seit: 30.03.2010
Beiträge: 76
Abgegebene Danke: 5
Erhielt 9 Danke für 8 Beiträge
Standard AW: select Anweisung (where, selectionArgs)

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.
ErDa ist offline   Mit Zitat antworten
Alt 13.05.2011, 18:03   #4 (permalink)
Android-Hilfe.de Mitglied

Registriert seit: 02.12.2010
Beiträge: 52
Abgegebene Danke: 6
Erhielt 0 Danke für 0 Beiträge
Standard AW: select Anweisung (where, selectionArgs)

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
assenda ist offline   Mit Zitat antworten
Alt 13.05.2011, 18:13   #5 (permalink)
Android-Hilfe.de Mitglied

Registriert seit: 02.12.2010
Beiträge: 52
Abgegebene Danke: 6
Erhielt 0 Danke für 0 Beiträge
Standard AW: select Anweisung (where, selectionArgs)

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);
assenda ist offline   Mit Zitat antworten
Alt 14.05.2011, 11:02   #6 (permalink)
Android-Hilfe.de Mitglied
 
Benutzerbild von ErDa

Modell: Galaxy Nexus + Toshiba AC100

Registriert seit: 30.03.2010
Beiträge: 76
Abgegebene Danke: 5
Erhielt 9 Danke für 8 Beiträge
Standard AW: select Anweisung (where, selectionArgs)

Hab mal in die Dokumentation geguckt: da steht:
Zitat:
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);
ErDa ist offline   Mit Zitat antworten
Alt 14.05.2011, 13:02   #7 (permalink)
Android-Hilfe.de Mitglied

Registriert seit: 02.12.2010
Beiträge: 52
Abgegebene Danke: 6
Erhielt 0 Danke für 0 Beiträge
Standard AW: select Anweisung (where, selectionArgs)

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.runQueryOnBackgroundThrea d(ContactAdapter.java:64)
05-14 10:53:52.729: WARN/Filter(1461): at android.widget.CursorFilter.performFiltering(Curso rFilter.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?!

Geändert von assenda (15.05.2011 um 18:11 Uhr) Grund: ergänzung
assenda ist offline   Mit Zitat antworten
Alt 15.05.2011, 14:04   #8 (permalink)
Android-Hilfe.de Mitglied

Registriert seit: 02.12.2010
Beiträge: 52
Abgegebene Danke: 6
Erhielt 0 Danke für 0 Beiträge
Standard AW: select Anweisung (where, selectionArgs)

Ü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?!

Geändert von assenda (15.05.2011 um 18:11 Uhr)
assenda ist offline   Mit Zitat antworten
Alt 15.05.2011, 18:44   #9 (permalink)
Android-Hilfe.de Mitglied

Registriert seit: 02.12.2010
Beiträge: 52
Abgegebene Danke: 6
Erhielt 0 Danke für 0 Beiträge
Standard AW: select Anweisung (where, selectionArgs)

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);
    }
assenda ist offline   Mit Zitat antworten
Antwort

Stichworte
cursor, query, select, where

Themen-Optionen
Ansicht


Ähnliche Themen

Thema Autor Forum Antworten Letzter Beitrag
Navigon Select gratis? hilda Karten und Navigation 6 27.12.2011 15:28
Navigon Select erweitern Yellowstone Karten und Navigation 7 30.01.2011 22:22
Navigon Select BVBFan4ever Karten und Navigation 5 03.01.2011 10:00
Navigon select + Nachtmodus?! dweazel HTC Desire HD Forum 8 15.12.2010 19:43
SQLite Select LIMIT MBPower Android App Entwicklung 3 27.04.2010 22:10




Du liest gerade: "select Anweisung (where, selectionArgs)" unter "Android App Entwicklung" auf Android-Hilfe.de.


Powered by vBulletin®
Copyright ©2000 - 2012, vBulletin Solutions, Inc.
Search Engine Friendly URLs by vBSEO
© Android-Hilfe.de 2012 - All rights reserved.