ORM u. Android

S

Scogit

Ambitioniertes Mitglied
2
Servus,

bin auf der Suche nach einen vernünftigen Object Relation Mapper/Management.
Ich weiß das db4o auf den Android läuft aber wie sieht das mit JPA oder Hibernate aus? Wird das kommen oder gibt es da bereits andere Lösungen?
 
Zuletzt bearbeitet:
Servus,

das Project androdb befindet sich aber derzeit noch im sehr frühen Entwicklungsstadium ich suche allerdings einen kleinen ORM den ich jetzt schon verwenden kann.

Anscheinend gibt es da derzeit nichts vernünftiges oder irre ich mich?
 
Sieht so aus. Das ist der Grund, warum ich das Projekt androdb gestartet hab...
Mir geht einfach nicht in den Kopf, warum Google hier die bereits absolvierte Lernkurve nicht aufnimmt und einen OR-Mapper in Android integriert hat... :confused:
 
Scogit schrieb:
Servus,

das Project androdb befindet sich aber derzeit noch im sehr frühen Entwicklungsstadium ich suche allerdings einen kleinen ORM den ich jetzt schon verwenden kann.

Anscheinend gibt es da derzeit nichts vernünftiges oder irre ich mich?

Mein JSON Serializer ist bereits benutzbar - speichert aber nicht im Datenbank
sondern in Flat-files.
 
SirMArtin schrieb:
Mir geht einfach nicht in den Kopf, warum Google hier die bereits absolvierte Lernkurve nicht aufnimmt und einen OR-Mapper in Android integriert hat... :confused:
Vermutlich weil das bei 99% aller Apps mit Atomraketen auf Mücken schießen wäre.
Gut, ein kleines Tool für Cursor -> "Bean"-Mapping und "Bean"->ContentValues wäre ganz nett gewesen...
Aber Inceptions um Änderungen mitzubekommen, tonnenweise Reflection, zig interne "Hilfs"-Objekte, etc.? Das legt ja z.T. schon leistungsfähige PCs lahm... (Manchmal glaube ich, das wurde von Sun und IBM erfunden um ihren Kunden teure Rechner verkaufen zu können... Genauso wie JSF.)
 
Mort schrieb:
Gut, ein kleines Tool für Cursor -> "Bean"-Mapping und "Bean"->ContentValues wäre ganz nett gewesen...
Aber genau darum geht es doch.

Klar. für den kleinen Hobby-Programmierer mit 2 Entities und einem Screen ist es grad egal. Da kann man auch im OnClickHandler feist SQL formulieren.
Sobald man ein etwas anspruchsvolleres Projekt hat, sollte man sich schon an gewisse Grundsätze wie Seperation of Concerns, Schichten-Trennung, Komponentenbildung usw. halten. Sonst landet man schnell in einer Wartungshölle.

SirMArtin
 
ko5tik schrieb:
Mein JSON Serializer ist bereits benutzbar - speichert aber nicht im Datenbank
sondern in Flat-files.

Benutz ich seit Ende Februar. Reicht für meine Zwecke völlig aus. Schickes Teil :).
 
TheFlatz|Veit schrieb:
Benutz ich seit Ende Februar. Reicht für meine Zwecke völlig aus. Schickes Teil :).

... frueher waere es gar nicht gegangen :)
 
bis jetzt ist das noch nicht open sourced oder ?

Hab mich einmal damit "beschäftigt" ein absolut minimalen "ORM" zu basteln :cursing:

bestehend aus 3 Klassen: :flapper:
Code:
[B][COLOR=#7f0055]public [/COLOR][/B][B][COLOR=#7f0055]class[/COLOR][/B] EntityMetaDataManager 
[LEFT]{
  List<EntityMetaData> [COLOR=#0000c0]metaDataCollection[/COLOR] = [B][COLOR=#7f0055]new[/COLOR][/B]  ArrayList<EntityMetaData>();[/LEFT]
 
[B][COLOR=#7f0055]public[/COLOR][/B] EntityMetaDataManager() {}
 
[LEFT][B][COLOR=#7f0055]public[/COLOR][/B] EntityMetaData getEntityMetaData(Class<?> cls, Cursor cursor) [B][COLOR=#7f0055]throws[/COLOR][/B] SecurityException, ClassNotFoundException, NoSuchMethodException[/LEFT]
{
EntityMetaData metaData;
 
[LEFT]Iterator<EntityMetaData> it = [COLOR=#0000c0]metaDataCollection[/COLOR].listIterator();[/LEFT]
 
[LEFT][B][COLOR=#7f0055]while[/COLOR][/B]( it.hasNext() )

{
[LEFT]metaData = it.next();
[B][COLOR=#7f0055]if[/COLOR][/B]( metaData.[COLOR=#0000c0]type[/COLOR] == cls )
{
[B][COLOR=#7f0055]return[/COLOR][/B] metaData;
} 
}
metaData = [B][COLOR=#7f0055]new[/COLOR][/B] EntityMetaData(cls, cursor);
[COLOR=#0000c0]metaDataCollection[/COLOR].add(metaData);
[B][COLOR=#7f0055]return[/COLOR][/B] metaData;
}[/LEFT]
[/LEFT]

 
 
 
 
}

Code:
[B][COLOR=#7f0055]public[/COLOR][/B]
 
[LEFT][B][COLOR=#7f0055]class[/COLOR][/B] EntityMetaData {
[B][COLOR=#7f0055]public[/COLOR][/B] HashMap<Integer, Field> [COLOR=#0000c0]fieldMap[/COLOR] = [B][COLOR=#7f0055]null[/COLOR][/B];
[B][COLOR=#7f0055]public[/COLOR][/B] HashMap<Integer, Method> [COLOR=#0000c0]methodMap[/COLOR] = [B][COLOR=#7f0055]null[/COLOR][/B];[/LEFT]
 

[LEFT]Class<?> [COLOR=#0000c0]type[/COLOR] = [B][COLOR=#7f0055]null[/COLOR][/B];[/LEFT]

 

[LEFT][B][COLOR=#7f0055]public[/COLOR][/B] EntityMetaData(Class<?> type, Cursor cursor) [B][COLOR=#7f0055]throws[/COLOR][/B] ClassNotFoundException, SecurityException, NoSuchMethodException  
[LEFT]{[/LEFT]
[/LEFT]

 

[LEFT][B][COLOR=#7f0055]this[/COLOR][/B].[COLOR=#0000c0]type[/COLOR] = type;[/LEFT]

 
 

[LEFT][COLOR=#0000c0]fieldMap[/COLOR] = [B][COLOR=#7f0055]new[/COLOR][/B] HashMap<Integer, Field>();

[COLOR=#0000c0]methodMap[/COLOR] = [B][COLOR=#7f0055]new[/COLOR][/B] HashMap<Integer, Method>();[/LEFT]
 
[LEFT]Class<?> classToInvestigate = Class.[I]forName[/I](type.getName()); 
Field[] aClassFields = classToInvestigate.getDeclaredFields();  [/LEFT]
 

[LEFT]cursor.moveToFirst();[/LEFT]

 

[LEFT][B][COLOR=#7f0055]for[/COLOR][/B] (Field field: aClassFields) [/LEFT]

 

[LEFT]{
 
[LEFT][B][COLOR=#7f0055]int[/COLOR][/B] key = cursor.getColumnIndex(field.getName());

[COLOR=#0000c0]fieldMap[/COLOR].put(key, field);
[LEFT][COLOR=#0000c0]methodMap[/COLOR].put(key, cursor.getClass().getMethod([COLOR=#2a00ff]"get"[/COLOR]+field.getType().getSimpleName(), [B][COLOR=#7f0055]int[/COLOR][/B].[B][COLOR=#7f0055]class[/COLOR][/B]));
}
}[/LEFT]
[/LEFT]


[/LEFT]

 
 

[LEFT]}[/LEFT]

Code:
[LEFT][B][COLOR=#7f0055]public[/COLOR][/B]

[B][COLOR=#7f0055]class[/COLOR][/B] EntityCollection<E>
[LEFT]{[/LEFT]
[/LEFT]

 

[LEFT][B][COLOR=#7f0055]private[/COLOR][/B] List<E> [COLOR=#0000c0]entities[/COLOR] = [B][COLOR=#7f0055]new[/COLOR][/B] ArrayList<E>();[/LEFT]

 

[LEFT][B][COLOR=#7f0055]private[/COLOR][/B] [B][COLOR=#7f0055]long[/COLOR][/B] [COLOR=#0000c0]time[/COLOR];[/LEFT]

 

[LEFT][B][COLOR=#7f0055]public[/COLOR][/B] EntityCollection(Class<E> cls, EntityMetaDataManager metaDataManager, Cursor cursor) [B][COLOR=#7f0055]throws[/COLOR][/B] IllegalAccessException, InstantiationException, IllegalArgumentException, InvocationTargetException, SecurityException, ClassNotFoundException, NoSuchMethodException[/LEFT]

 

[LEFT]{
 
[LEFT]Time start = [B][COLOR=#7f0055]new[/COLOR][/B] Time();

start.setToNow();[/LEFT]


[/LEFT]

 
 

[LEFT]EntityMetaData metaData = metaDataManager.getEntityMetaData(cls, cursor);[/LEFT]

 

[LEFT][B][COLOR=#7f0055]if[/COLOR][/B]( cursor.moveToFirst() )[/LEFT]

 

[LEFT]{ 
 
[LEFT][B][COLOR=#7f0055]int[/COLOR][/B] max = cursor.getColumnCount();[/LEFT]
[/LEFT]

 
 
 
 

[LEFT][B][COLOR=#7f0055]while[/COLOR][/B]( !cursor.isAfterLast() )[/LEFT]

 

[LEFT]{ [/LEFT]

 

[LEFT]E entity = cls.newInstance();[/LEFT]

 

[LEFT][B][COLOR=#7f0055]for[/COLOR][/B]([B][COLOR=#7f0055]int[/COLOR][/B] i = 0; i < max; i++ )[/LEFT]

 

[LEFT]{
 
[LEFT]Method method = metaData.[COLOR=#0000c0]methodMap[/COLOR].get(i);

[B][COLOR=#7f0055]if[/COLOR][/B]( method != [B][COLOR=#7f0055]null[/COLOR][/B] )
[LEFT]{
Object value = method.invoke(cursor, i); 
[COLOR=#3f7f5f]//Field field = metaData.fieldMap.get(i);[/COLOR]
[COLOR=#3f7f5f]//field.set(entity, value);[/COLOR]
metaData.[COLOR=#0000c0]fieldMap[/COLOR].get(i).set(entity, value); 
}
} 
[COLOR=#0000c0]entities[/COLOR].add(entity); 
cursor.moveToNext();
}
} [/LEFT]
[/LEFT]


[/LEFT]

 
 

[LEFT]Time stop = [B][COLOR=#7f0055]new[/COLOR][/B] Time();[/LEFT]

 

[LEFT]stop.setToNow();
 
[LEFT]setTime(stop.toMillis([B][COLOR=#7f0055]false[/COLOR][/B]) - start.toMillis([B][COLOR=#7f0055]false[/COLOR][/B]));[/LEFT]
[/LEFT]

 
 

[LEFT]}[/LEFT]

 

[LEFT][B][COLOR=#7f0055]public[/COLOR][/B] [B][COLOR=#7f0055]long[/COLOR][/B] getTime() {[/LEFT]

 

[LEFT][B][COLOR=#7f0055]return[/COLOR][/B] [COLOR=#0000c0]time[/COLOR];[/LEFT]

 

[LEFT]}[/LEFT]

 

[LEFT][B][COLOR=#7f0055]private[/COLOR][/B] [B][COLOR=#7f0055]void[/COLOR][/B] setTime([B][COLOR=#7f0055]long[/COLOR][/B] time) {[/LEFT]

 

[LEFT][B][COLOR=#7f0055]this[/COLOR][/B].[COLOR=#0000c0]time[/COLOR] = time;
 
[LEFT]}

} [/LEFT]


[/LEFT]

Beispiel für eine Entität :rolleyes2:
Code:
[LEFT][B][COLOR=#7f0055]public[/COLOR][/B]

[B][COLOR=#7f0055]class[/COLOR][/B] LeistungenEntity [B][COLOR=#7f0055]extends[/COLOR][/B] BaseEntity {[/LEFT]

 
 

[LEFT][B][COLOR=#7f0055]public[/COLOR][/B] String [COLOR=#0000c0]lstg[/COLOR];

[LEFT][B][COLOR=#7f0055]public[/COLOR][/B] String [COLOR=#0000c0]name[/COLOR];
[LEFT][B][COLOR=#7f0055]public[/COLOR][/B] Long [COLOR=#0000c0]_id[/COLOR];[/LEFT]
[/LEFT]


[/LEFT]

 
 
 

[LEFT][B][COLOR=#7f0055]protected[/COLOR][/B] LeistungenEntity() 

[LEFT]{
[LEFT][B][COLOR=#7f0055]super[/COLOR][/B]([COLOR=#2a00ff]"leistungen"[/COLOR]); 
}[/LEFT]
[/LEFT]

 
 
[LEFT]}[/LEFT]
[/LEFT]


und zu letzt der Aufruf um eine Tabelle zu laden​

Code:
[LEFT]Cursor cursor = getDBAdapter().rawQuery([COLOR=#2a00ff]"select * from leistungen"[/COLOR]); 
 
 
 
[LEFT]EntityCollection<LeistungenEntity> [U]leistungenEntities[/U] = [B][COLOR=#7f0055]new[/COLOR][/B] EntityCollection<LeistungenEntity>(LeistungenEntity.[B][COLOR=#7f0055]class[/COLOR][/B], metaDataManager, cursor); [/LEFT]
[/LEFT]

Jedenfalls spart man sich so auf einfache Weise das ewige
cursor.getColumnIndex und cursor.getString/Long/ usw.​

:cool2:

EntityMetaDataManager sollte ein Singleton sein.
EntityMetaData speichert in zwei Listen die Member der Datenklasse
und die Methodenaufrufe der Cursor-Klasse ( getString(...) / getLong(...) )
und verbindet diese mit dem Column-Index der DB-Abfrage.​

Das ganze soll wirklich absolut minimal bleiben. Update/Insert bau ich aber noch ein :smile:
 
Warum wurde eigentlich Ormlite noch nicht erwähnt? Setzte es in zwei Projekten erfolgreich ein.
 
Wie performant ist das ormlite. Hab mir den Code so etwas überflogen.
Mein Anspruch ist nur gut flexibel auf die Sqlite-Tabellen zu kommen.
Auch reichen mir die Datentypen INTEGER und TEXT. Ich bemerke schon
eine Verzögerung durch die Reflections beim Datenzugriff ggü. den sonst
üblichen Datenzugriffsmethoden. Der Komfort ist allerdings bei so einem
ORM schon bestechlich.
 
RED-BARON schrieb:
Wie performant ist das ormlite. Hab mir den Code so etwas überflogen.
Das weiss ich auch nicht wirklich. Da ich bislang zu faul war ContentProvider zu schreiben, da ich im aktuellen Projekt doch ein paar duzend Entitäten habe, weiss ich nicht wie viel langsamer das Teil ist. Die Vermutung ist aber, dass es doch ziemlich ausbremmst. Vorallem wenn man bedenkt das es mit Reflection arbeiten. ABER: Es gibt eine Methode wo man ein Mappingfile generieren lassen kann. Danach müsste es ohne Reflection tun, wenn ich das richtig verstanden habe.
 

Ähnliche Themen

B
Antworten
4
Aufrufe
433
bb321
B
M
Antworten
4
Aufrufe
1.150
swa00
swa00
5
Antworten
0
Aufrufe
1.117
586920
5
Zurück
Oben Unten