
ui_3k1
Gesperrt
- 197
Morgen,
ich bin gerade dran eine Datenbank in meine App einzubauen, eigentlich funktioniert alles schon ziemlich gut. Allerdings weiß ich nicht ob meine Implementierung wirklich so sauber ist.
Aktuelle Vorgehensweise:
Derzeit ziehe ich die komplette Datenbank (2MB) vom Speicherort in den RAM (dort wird sie ja wahrscheinlich landen, oder?).
Sieht in der Activity dann wiefolgt aus:
hier die Funktion:
Nun geht es in meinem Programm dahingehend weiter, dass nach Dezimal-Werten gesucht wird (einen gewissen Toleranzbereich muss ich ebenfalls bei der Suche berücksichtigen).
Derzeit nutze ich den Cursor und Iterator um einmal alle Einträge "abzuklappern".
Klappt auch sehr gut, jedenfalls entsprach der Output bis dato immer meinen Erwartungen.
Extrahiert werden die Werte, sofern es einen Treffer gab, zB mit getInt(*SpaltenNummer*). <- klappt auch.
Allerdings kann das ja nicht Sinn der Sache sein, oder?
Wäre es nicht möglich schon früher zu selektieren, sprich schon die Query so anzupassen, dass nur "Treffer" zurückgegeben werden?
Wie eine solche "Suchanfrage" aber in sqlite auszusehen hat erschließt sich mir irgendwie nicht.
Gute einleuchtende Beispiele sind jedenfalls rar.
Bei der Suche, wie ich sie gerne implementieren würde, muss wohl noch beachtet werden, dass die Umrechnung von Dezimalzahlen Probleme bereiten kann, wenn diese innerhalb der Datenbank falsch interpretiert werden (bedingt durch die binäre Darstellung)? Stimmt das und wie geht man damit am besten um? Einfach den Wertebereich abändern/vergrößern? Woher weiß ich dass dann immer noch genau der gesuchte Inhalt zurückgegeben wird, wenn hier die Datenbank eine abweichende Zahlendarstellung verwendet?
Puhh.. krasse Kost oO
Oder mache ich es komplizierter als es ist? Ist halt kacke, wenn man möglichst genaue Suchanfragen stellen will und mit Datenbanken noch praktisch absolut unvertraut ist.
Nachtrag:
Wenn jemand weiß wo es folgende Bibliotheksfunktion ein paar Beispiele gibt, wäre mir wahrscheinlich schon ein etwas geholfen.
Nachtrag 2:
Habs hinbekommen (glaube ich). Manchmal hilft es vielleicht doch wenn man das Problem nur mal ausformuliert
Nachtrag 3:
Jo, auf jeden Fall, hier der (ziemlich dumme) Fehler:
Cursor c = db.query(DBOpenHelper.DATABASE_TABLE, null, where, null, null, null, null);
Dem roten Kamerad hab ich zuvor immer 2 Spalten übergeben und das hat die Datenbank wohl "wild" gemacht, da das ja die Zurückgabe als solche begrenzt und nicht die eigentliche Suche betrifft, wie ich es mir aus irgendeinem Grund zusammengereimt habe.
Wieder mal ein Fall von "schlecht vorher informiert und dann zu ungenau gearbeitet".
Beste Grüße und in diesem Sinne einen schönen Samstag
Martin
ich bin gerade dran eine Datenbank in meine App einzubauen, eigentlich funktioniert alles schon ziemlich gut. Allerdings weiß ich nicht ob meine Implementierung wirklich so sauber ist.
Aktuelle Vorgehensweise:
Derzeit ziehe ich die komplette Datenbank (2MB) vom Speicherort in den RAM (dort wird sie ja wahrscheinlich landen, oder?).
Sieht in der Activity dann wiefolgt aus:
Code:
Cursor cursor = sDatabase.getAllEntries();
Code:
public Cursor getAllEntries() {
String where = null;
SQLiteDatabase db = DBOpenHelper.getReadableDatabase();
Cursor c = db.query(true, DBOpenHelper.DATABASE_TABLE, ALL_KEYS,
where, null, null, null, null, null);
return c;
}
Derzeit nutze ich den Cursor und Iterator um einmal alle Einträge "abzuklappern".
Klappt auch sehr gut, jedenfalls entsprach der Output bis dato immer meinen Erwartungen.
Extrahiert werden die Werte, sofern es einen Treffer gab, zB mit getInt(*SpaltenNummer*). <- klappt auch.
Allerdings kann das ja nicht Sinn der Sache sein, oder?
Wäre es nicht möglich schon früher zu selektieren, sprich schon die Query so anzupassen, dass nur "Treffer" zurückgegeben werden?
Wie eine solche "Suchanfrage" aber in sqlite auszusehen hat erschließt sich mir irgendwie nicht.
Gute einleuchtende Beispiele sind jedenfalls rar.
Bei der Suche, wie ich sie gerne implementieren würde, muss wohl noch beachtet werden, dass die Umrechnung von Dezimalzahlen Probleme bereiten kann, wenn diese innerhalb der Datenbank falsch interpretiert werden (bedingt durch die binäre Darstellung)? Stimmt das und wie geht man damit am besten um? Einfach den Wertebereich abändern/vergrößern? Woher weiß ich dass dann immer noch genau der gesuchte Inhalt zurückgegeben wird, wenn hier die Datenbank eine abweichende Zahlendarstellung verwendet?
Puhh.. krasse Kost oO
Oder mache ich es komplizierter als es ist? Ist halt kacke, wenn man möglichst genaue Suchanfragen stellen will und mit Datenbanken noch praktisch absolut unvertraut ist.

Nachtrag:
Wenn jemand weiß wo es folgende Bibliotheksfunktion ein paar Beispiele gibt, wäre mir wahrscheinlich schon ein etwas geholfen.
Code:
/**
* Query the given URL, returning a {@link Cursor} over the result set.
*
* @param distinct true if you want each row to be unique, false otherwise.
* @param table The table name to compile the query against.
* @param columns 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.
* @param 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 table.
* @param 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.
* @param 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.
* @param 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.
* @param orderBy 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.
* @param limit Limits the number of rows returned by the query,
* formatted as LIMIT clause. Passing null denotes no LIMIT clause.
* @return A {@link Cursor} object, which is positioned before the first entry. Note that
* {@link Cursor}s are not synchronized, see the documentation for more details.
* @see Cursor
*/
public Cursor query(boolean distinct, String table, String[] columns,
String selection, String[] selectionArgs, String groupBy,
String having, String orderBy, String limit) {
return queryWithFactory(null, distinct, table, columns, selection, selectionArgs,
groupBy, having, orderBy, limit, null);
}
Nachtrag 2:
Habs hinbekommen (glaube ich). Manchmal hilft es vielleicht doch wenn man das Problem nur mal ausformuliert
Nachtrag 3:
Jo, auf jeden Fall, hier der (ziemlich dumme) Fehler:
Cursor c = db.query(DBOpenHelper.DATABASE_TABLE, null, where, null, null, null, null);
Dem roten Kamerad hab ich zuvor immer 2 Spalten übergeben und das hat die Datenbank wohl "wild" gemacht, da das ja die Zurückgabe als solche begrenzt und nicht die eigentliche Suche betrifft, wie ich es mir aus irgendeinem Grund zusammengereimt habe.
Wieder mal ein Fall von "schlecht vorher informiert und dann zu ungenau gearbeitet".
Beste Grüße und in diesem Sinne einen schönen Samstag
Martin
Zuletzt bearbeitet: