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í:
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.
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();
}