simple android orm collections ormlite foreign-collection

android - simple - Colecciones en ORMLite



java mysql orm (1)

Hay una serie de recursos y manuales que ayudan con el uso de ORMLite en Android.

http://ormlite.com/docs/android
http://ormlite.com/docs/android-examples

Para conservar una colección, primero debes obtener un Dao para la clase y luego crear cada uno de los objetos usando el Dao:

Dao<Person, Integer> personDao = DaoManager.createDao(androidConnectionSource, Person.class); for (Person person : personCollection) { personDao.create(person); }

Más o menos lo mismo para su clase de Phone también.

Realmente estaba preguntando cómo usar la función ForeignCollectionField de ORMLite. La documentación para esto se puede encontrar aquí:

http://ormlite.com/docs/foreign-collection

También hay un proyecto de ejemplo que lo usa. En el ejemplo anterior, falta un campo Person dentro del Phone . Si la persona tiene una colección de objetos telefónicos, entonces cada objeto del teléfono necesita tener una persona correspondiente. Esto se llama un "objeto extraño" en ORMLite.

http://ormlite.com/docs/foreign-object

Hola, quiero conservar algunos datos de colecciones con ORMlite en mi aplicación de Android. Por ejemplo :

class Person { @DatabaseField(generatedId=true) private int id; @DatabaseField private String name; @DatabaseField private String surname; @ForeignCollectionField private Collections<Phone> phones; } class Phone { @DatabaseField(generatedId=true) private int id; @DatabaseField private String number; @DatabaseField private String type; }

Cómo debería hacerlo para mantener esta colección.

EDITAR

Yo uso ForeignCollectionField como me dijiste. Pero ahora tengo otra pregunta: ¿es posible una construcción así? (Cambié de clase un poco)

@DatabaseTable public class Student { @DatabaseField(generatedId=true) private int id; @DatabaseField private String name; @DatabaseField private String surname; @DatabaseField private String semestr; @ForeignCollectionField private Collection<Adres> adres; } public class Adres implements Serializable { @DatabaseField(generatedId=true) private int id; @DatabaseField(foreign=true, columnName="student_id") private Student student; @DatabaseField private String miasto; @DatabaseField private String ulica; @DatabaseField private String nr; @ForeignCollectionField private Collection<Phone> phone; } public class Phone { @DatabaseField(generatedId=true) private int id; @DatabaseField private String number; @DatabaseField(foreign=true, columnName="adres_id" ) private Adres adres; }

Construyo esta estructura, la tengo en 3 tabelas.

Student queryForStudentMarcin = simpleDao.queryForId(studentMarcin.getId()); Collection<Adres> adres = queryForStudentMarcin.getAdres(); for (Adres a : adres) { int id = a.getId(); String miasto = a.getMiasto(); String ulica = a.getUlica(); String nr = a.getNr(); }

Entonces hago esto y aparece el error:

04-03 15:55:58.392: ERROR/AndroidRuntime(6506): FATAL EXCEPTION: main 04-03 15:55:58.392: ERROR/AndroidRuntime(6506): java.lang.NullPointerException 04-03 15:55:58.392: ERROR/AndroidRuntime(6506): at com.j256.ormlite.field.FieldType.buildForeignCollection(FieldType.java:579) 04-03 15:55:58.392: ERROR/AndroidRuntime(6506): at com.j256.ormlite.stmt.mapped.BaseMappedQuery.mapRow(BaseMappedQuery.java:58) 04-03 15:55:58.392: ERROR/AndroidRuntime(6506): at com.j256.ormlite.stmt.SelectIterator.nextThrow(SelectIterator.java:107) 04-03 15:55:58.392: ERROR/AndroidRuntime(6506): at com.j256.ormlite.stmt.SelectIterator.next(SelectIterator.java:120) 04-03 15:55:58.392: ERROR/AndroidRuntime(6506): at com.example.orm.MainActivity.dodajDoBazyCollection(MainActivity.java:140) 04-03 15:55:58.392: ERROR/AndroidRuntime(6506): at com.example.orm.MainActivity$2.onClick(MainActivity.java:66) 04-03 15:55:58.392: ERROR/AndroidRuntime(6506): at android.view.View.performClick(View.java:2408) 04-03 15:55:58.392: ERROR/AndroidRuntime(6506): at android.view.View$PerformClick.run(View.java:8816) 04-03 15:55:58.392: ERROR/AndroidRuntime(6506): at android.os.Handler.handleCallback(Handler.java:587) 04-03 15:55:58.392: ERROR/AndroidRuntime(6506): at android.os.Handler.dispatchMessage(Handler.java:92) 04-03 15:55:58.392: ERROR/AndroidRuntime(6506): at android.os.Looper.loop(Looper.java:123) 04-03 15:55:58.392: ERROR/AndroidRuntime(6506): at android.app.ActivityThread.main(ActivityThread.java:4627) 04-03 15:55:58.392: ERROR/AndroidRuntime(6506): at java.lang.reflect.Method.invokeNative(Native Method) 04-03 15:55:58.392: ERROR/AndroidRuntime(6506): at java.lang.reflect.Method.invoke(Method.java:521) 04-03 15:55:58.392: ERROR/AndroidRuntime(6506): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 04-03 15:55:58.392: ERROR/AndroidRuntime(6506): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 04-03 15:55:58.392: ERROR/AndroidRuntime(6506): at dalvik.system.NativeStart.main(Native Method)

Alguna sugerencia ?

Edit2

El problema fue leer los datos de db. Este procedimiento funciona bien, ahora está bien, pero lo uso para entender ORMlite. Thx much Grey por ayuda.

protected void czytajZBazy() throws SQLException { Dao<Student, Integer> simpleDao = getHelper().getSimpleDao(); Dao<Adres, Integer> adresDao = getHelper().getAdresDao(); Dao<Phone, Integer> phoneDao = getHelper().getPhoneDao(); /** * wyswietl adresy dla studenta Marcin */ QueryBuilder<Student, Integer> qbStudent = simpleDao.queryBuilder();; Where<Student, Integer> where = qbStudent.where(); where.eq("name", "Marcin"); PreparedQuery<Student> prepare = qbStudent.prepare(); CloseableIterator<Student> iterator = simpleDao.iterator(prepare); while(iterator.hasNext()){ Log.v("inside ", "loop"); Student next = iterator.next(); Log.v("sudent", ""+next.getId()+" "+next.getName()+" "+next.getSurname()); QueryBuilder<Adres, Integer> adresQB = adresDao.queryBuilder(); Where<Adres, Integer> where2 = adresQB.where(); where2.eq("student_id", next.getId()); PreparedQuery<Adres> preparedAdres = adresQB.prepare(); CloseableIterator<Adres> iterator2 = adresDao.iterator(preparedAdres); while(iterator2.hasNext()){ Log.v("iterator po adresie", "!!"); Adres nextAdres = iterator2.next(); Log.v("Adres", ""+nextAdres.getId()+" "+nextAdres.getMiasto()); //wypisz telefony QueryBuilder<Phone, Integer> queryPhone = phoneDao.queryBuilder(); Where<Phone, Integer> where3 = queryPhone.where(); where3.eq("adres_id", nextAdres.getId()); PreparedQuery<Phone> preparedPhone = queryPhone.prepare(); CloseableIterator<Phone> iterator3 = phoneDao.iterator(preparedPhone); while(iterator3.hasNext()){ Log.v("inside phone iterator", ""); Phone next2 = iterator3.next(); Log.v("phone", ""+next2.getId()+" "+next2.getNumber()); } iterator3.close(); } iterator2.close(); } iterator.close(); }