1. Mitglieder surfen ohne Werbung auf Android-Hilfe.de! ✔ Jetzt kostenlos Mitglied in unserer Community werden.
  1. Scogit, 08.03.2010 #1
    Scogit

    Scogit Threadstarter Android-Hilfe.de Mitglied

    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

  3. Scogit, 24.03.2010 #3
    Scogit

    Scogit Threadstarter Android-Hilfe.de Mitglied

    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

    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

    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

    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

    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

    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

    ... frueher waere es gar nicht gegangen :)
     
  10. Markus, 08.09.2011 #10
    Markus

    Markus Gewerbliches Mitglied

  11. RED-BARON, 08.01.2013 #11
    RED-BARON

    RED-BARON Erfahrener Benutzer

    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

    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 Erfahrener Benutzer

    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

    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.
     
Die Seite wird geladen...
Ähnliche Themen Forum Datum
Android Studio: Auf Datenbank mit zwei Spinner zugreifen. Android App Entwicklung 07.06.2018
Android Studio: Failed to chmod Android App Entwicklung 06.06.2018
App wird nach start sofort beendet! Android App Entwicklung 21.05.2018
Mit Webview.findallasync ein Wert überprüfen -Hilfe Android App Entwicklung 29.04.2018
Daten von Android Wear zur Handy-App senden geht nicht Android App Entwicklung 03.04.2018
Benötigte Zugriff ausschalten Android App Entwicklung 07.03.2018
Fragen zu all den Layouts Android App Entwicklung 12.02.2018
Alertdialog mit Button erweitern Android App Entwicklung 02.02.2018
Bluetooth Kommunikation funktioniert ab Android 7 nicht mehr Android App Entwicklung 25.01.2018
android emulator root Android App Entwicklung 19.01.2018
Du betrachtest das Thema "ORM u. Android" im Forum "Android App Entwicklung",
  1. Android-Hilfe.de verwendet Cookies um Inhalte zu personalisieren und dir den bestmöglichen Service zu gewährleisten. Wenn du auf der Seite weitersurfst stimmst du der Cookie-Nutzung zu.  Ich stimme zu.