SQLiteQueryBuilder Debug

  • Antworten:3
  • OffenNicht stickyNicht beantwortet

30.03.2011 02:21:43 via Website

Hallo,

Ich habe einen ContentProvider, irgendwas ärgert mich da aber, und ich verstehe nicht was falsch sein sollte (laut Debugger machen die werte Sinn). Würde gerne mal wissenwie das SQL Statement aussieht das der SQLiteQueryBuilder gegen die DB absetzt, gibt es da ne Möglichkeit das herauszufinden ?

final SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
...
final Cursor c = qb.query(db, projection, selection, selectionArgs, null, null, sortOrder);


thx,
Mac

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV

30.03.2011 07:40:18 via Website

Moin Mac,

Wenn Du uns verraten würdest was in Projection, selection, selectionArgs und sortOrder drinnen steht dann können wir dir vielleicht sagen wie die query aussieht. :)

Die native Erklärung aus der Dev besagt jedenfalls :

Parameters

db the database to query on
projectionIn A list of which columns to return. Passing null will return all columns, which is discouraged to prevent reading data from storage that isn't going to be used.
selection A filter declaring which rows to return, formatted as an SQL WHERE clause (excluding the WHERE itself). Passing null will return all rows for the given URL.
selectionArgs You may include ?s in selection, which will be replaced by the values from selectionArgs, in order that they appear in the selection. The values will be bound as Strings.
groupBy A filter declaring how to group rows, formatted as an SQL GROUP BY clause (excluding the GROUP BY itself). Passing null will cause the rows to not be grouped.
having A filter declare which row groups to include in the cursor, if row grouping is being used, formatted as an SQL HAVING clause (excluding the HAVING itself). Passing null will cause all row groups to be included, and is required when row grouping is not being used.
sortOrder How to order the rows, formatted as an SQL ORDER BY clause (excluding the ORDER BY itself). Passing null will use the default sort order, which may be unordered.

lg Voss

30.03.2011 08:15:19 via Website

Wenn Du einfach nur debuggen willst, besorg dir den Quellcode der Klasse, binde ihn in dein Projekt ein und stell den Import auf diese Klasse um.
Evtl. hängen da noch mehr Klassen dran, aber wenns wichtig genug ist, machst du dir die Arbeit gerne ;)

Alternative:
JADclipse.
Damit kannst Du mit "Open Declaration" in den dekompilierten Quellcode springen und evtl. direkt sehen was dort gemacht wird.
Ich weiss aber nicht, ob die Android API komplette Klassen, oder nur Stubs sind.

— geändert am 30.03.2011 08:17:14

01.04.2011 14:47:24 via Website

Den Code zu ersetzen ist jetzt eher nicht das was ich wollte. Dachte es gibt sowas wie "explain" als schalter...

Mein Problem besteht weiterhin, es scheint aber auch damit zusammen zu hängen das ich ein like '%abc%'% an den ContentProvoider weiterreichen möchte.
Mir ist nicht ganz klar wie das vom Ansatz her stattfinden soll.

Angenommen Ich habe ein Query wie dieses um damit eine AutoCompleteTextView zu füllen:

SELECT _id,name FROM books WHERE name like '%Sch%';

Ansatzweise mache ich dann folgendes.

1textView = (AutoCompleteTextView) findViewById(R.id.autocomplete);
2 textView.setAdapter(new MyResourceCursorAdapter(this));

wobei MyResourceCursorAdapter ein ResourceCursorAdapter ist. Dieser erstellt einen View wenn nötig über das ihm übergebene Layout in der ResourceCursorAdapter#bindView Methode. Diese wird auch durchlaufen sobald ich ein einfaches Query laufen lasse wie z.b select * from books.

Die Klasse ResourceCursorAdapter stellt die Methode runQueryOnBackgroundThread zu verfügung. Hier sitzt meine aufruf an den ContentProvider :

1public Cursor runQueryOnBackgroundThread(CharSequence constraint)
2
3 public Cursor runQueryOnBackgroundThread(CharSequence constraint)
4 {
5 if (Logging.isEnabled)
6 {
7 Log.d(LOG_TAG, "runQueryOnBackgroundThread :" + constraint);
8 }
9 final String[] projection = new String[]
10 { Books._ID, Books.COLUMN_NAME };
11
12 String filter = constraint == null ? "" : constraint.toString();
13 final Cursor c = resolver.query(CONTENT_URI, projection, Books.COLUMN_NAME, new String[]
14 { filter }, null);
15 Log.d(LOG_TAG, "Cursor Size:" + c.getCount());
16 return c;
17 }

Das like sollte dann wohl im selection-teil übergeben werden ? Wenn ja habe ich folgendes = Books.COLUMN_NAME+" like '%"+filter+"%' "
Oder mache ich das erst im eigendlichen ContentProvider ? Irgendwie finde ich hier keine Doku/Beispiele wie so was zu handhaben ist.

— geändert am 01.04.2011 14:48:10

Windmate HD, See you @ IO 14 , Worked on Wundercar, Glass V3, LG G Watch, Moto 360, Android TV