1. Nimm jetzt an unserem Uhans - 3. ADVENT - Gewinnspiel teil - Alle Informationen findest Du hier!

ORM u. Android

Dieses Thema im Forum "Android App Entwicklung" wurde erstellt von Scogit, 08.03.2010.

  1. Scogit, 08.03.2010 #1
    Scogit

    Scogit Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    69
    Erhaltene Danke:
    2
    Registriert seit:
    16.08.2009
    Phone:
    Samsung Galaxy
    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: 08.03.2010
  2. ko5tik, 08.03.2010 #2
    ko5tik

    ko5tik Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
  3. Scogit, 24.03.2010 #3
    Scogit

    Scogit Threadstarter Android-Hilfe.de Mitglied

    Beiträge:
    69
    Erhaltene Danke:
    2
    Registriert seit:
    16.08.2009
    Phone:
    Samsung Galaxy
    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?
     
  4. SirMArtin, 24.03.2010 #4
    SirMArtin

    SirMArtin freier Samsungsupporter

    Beiträge:
    113
    Erhaltene Danke:
    7
    Registriert seit:
    05.08.2009
    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:
     
  5. ko5tik, 24.03.2010 #5
    ko5tik

    ko5tik Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    Mein JSON Serializer ist bereits benutzbar - speichert aber nicht im Datenbank
    sondern in Flat-files.
     
  6. Mort, 26.03.2010 #6
    Mort

    Mort Android-Lexikon

    Beiträge:
    960
    Erhaltene Danke:
    262
    Registriert seit:
    16.11.2009
    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.)
     
  7. SirMArtin, 26.03.2010 #7
    SirMArtin

    SirMArtin freier Samsungsupporter

    Beiträge:
    113
    Erhaltene Danke:
    7
    Registriert seit:
    05.08.2009
    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
     
  8. TheFlatz|Veit, 28.03.2010 #8
    TheFlatz|Veit

    TheFlatz|Veit Android-Hilfe.de Mitglied

    Beiträge:
    54
    Erhaltene Danke:
    3
    Registriert seit:
    29.09.2009
    Benutz ich seit Ende Februar. Reicht für meine Zwecke völlig aus. Schickes Teil :).
     
  9. ko5tik, 28.03.2010 #9
    ko5tik

    ko5tik Android-Experte

    Beiträge:
    620
    Erhaltene Danke:
    40
    Registriert seit:
    14.10.2009
    Phone:
    HTC Hero
    ... frueher waere es gar nicht gegangen :)
     
  10. Markus, 08.09.2011 #10
    Markus

    Markus Gewerbliches Mitglied

    Beiträge:
    76
    Erhaltene Danke:
    8
    Registriert seit:
    19.01.2009
  11. RED-BARON, 08.01.2013 #11
    RED-BARON

    RED-BARON Android-Hilfe.de Mitglied

    Beiträge:
    146
    Erhaltene Danke:
    19
    Registriert seit:
    06.10.2009
    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:
     
  12. GENiALi, 11.01.2013 #12
    GENiALi

    GENiALi Erfahrener Benutzer

    Beiträge:
    248
    Erhaltene Danke:
    10
    Registriert seit:
    25.08.2011
    Warum wurde eigentlich Ormlite noch nicht erwähnt? Setzte es in zwei Projekten erfolgreich ein.
     
  13. RED-BARON, 12.01.2013 #13
    RED-BARON

    RED-BARON Android-Hilfe.de Mitglied

    Beiträge:
    146
    Erhaltene Danke:
    19
    Registriert seit:
    06.10.2009
    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.
     
  14. GENiALi, 12.01.2013 #14
    GENiALi

    GENiALi Erfahrener Benutzer

    Beiträge:
    248
    Erhaltene Danke:
    10
    Registriert seit:
    25.08.2011
    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.
     

Diese Seite empfehlen