1. Gewinne jetzt ein UMiDIGI C Note - alle Informationen findest du hier!!
  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 Android-Hilfe.de Mitglied

    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 Android-Hilfe.de Mitglied

    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
Hilfe bei Fehler in Quellcode benötigt Android App Entwicklung Freitag um 23:01 Uhr
[OFFEN] Android Spiel Android App Entwicklung Freitag um 09:34 Uhr
[OFFEN] Android Studio Ram voll nach 5h arbeit Android App Entwicklung 15.06.2017
[OFFEN] Android Studio - Code Style Android App Entwicklung 08.06.2017
[OFFEN] SharedPreferences und ViewPager, unique key Android App Entwicklung 06.06.2017
[OFFEN] Android Icon Pack dynamisch erstellen Android App Entwicklung 05.06.2017
[ERLEDIGT] Android 7 nougat merkwürdiges Verhalten URL HttpURLConnection %27 Android App Entwicklung 31.05.2017
[OFFEN] Android Studio - Apk-Generierung dauert sehr lange Android App Entwicklung 26.05.2017
[ERLEDIGT] Eine Klasse um das aufrufen anderer Intents zu regeln Android App Entwicklung 24.05.2017
[OFFEN] git-Problem in Android Studio (Windows) Android App Entwicklung 24.05.2017
Du betrachtest das Thema "ORM u. Android" im Forum "Android App Entwicklung",