Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Saving nested foreign objects with ORMLite on Android
- @DatabaseTable
- public class Parent {
- @DatabaseField(generatedId=true)
- public int id;
- @DatabaseField
- public String name;
- @DatabaseField
- public Child child;
- }
- @DatabaseTable
- public class Child {
- @DatabaseField(generatedId=true)
- public int id;
- @DatabaseField
- public String name;
- }
- Parent parent = new Parent();
- parent.name = "ParentName";
- Child child = new Child();
- child.name = "ChildName";
- parent.child = child;
- // .. get helper and create dao object...
- dao.create(parent);
- Parent parent = new Parent();
- parent.name = "ParentName";
- Child child = new Child();
- child.name = "ChildName";
- parent.child = child;
- // this will update the id in child
- childDao.create(child);
- // this saves the parent with the id of the child
- parentDao.create(parent);
- // assuming the id of the Parent is the name
- Parent parent = parentDao.queryForId("ParentName");
- System.out.println("Child id should be set: " + parent.child.id);
- System.out.println("Child name should be null: " + parent.child.name);
- // now we refresh the child object to load all of the fields
- childDao.refresh(parent.child);
- System.out.println("Child name should now be set: " + parent.child.name);
- // Debugging identity tag
- public static final String TAG = DatabaseHelper.class.getName();
- // Static map of common DAO objects
- @SuppressWarnings("rawtypes")
- private static final Map<Class, Dao<?, Integer>> sDaoClassMap = new HashMap<Class, Dao<?,Integer>>();
- /**
- * Persist an entity to the underlying database.
- *
- * @param context
- * @param entity
- * @return boolean flag indicating success
- */
- public static boolean create(Context context, Entity entity) {
- // Get our database manager
- DatabaseHelper databaseHelper = DatabaseHelper.getHelper(context);
- try {
- // Recursively save entity
- create(databaseHelper, entity);
- } catch (IllegalArgumentException e) {
- Log.e(TAG, "Object is not an instance of the declaring class", e);
- return false;
- } catch (IllegalAccessException e) {
- Log.e(TAG, "Field is not accessible from the current context", e);
- return false;
- } catch (SQLException e) {
- Log.e(TAG, "Unable to create object", e);
- return false;
- }
- // Release database helper
- DatabaseHelper.release();
- // Return true on success
- return true;
- }
- /**
- * Persist an entity to the underlying database.<br><br>
- * For each field that has a DatabaseField annotation with foreign set to true,
- * and is an instance of Entity, recursive attempt to persist that entity as well.
- *
- * @param databaseHelper
- * @param entity
- * @throws IllegalArgumentException
- * @throws IllegalAccessException
- * @throws SQLException
- */
- @SuppressWarnings("unchecked")
- public static void create(DatabaseHelper databaseHelper, Entity entity) throws IllegalArgumentException, IllegalAccessException, SQLException {
- // Class type of entity used for reflection
- @SuppressWarnings("rawtypes")
- Class clazz = entity.getClass();
- // Search declared fields and save child entities before saving parent.
- for(Field field : clazz.getDeclaredFields()) {
- // Inspect annotations
- for(Annotation annotation : field.getDeclaredAnnotations()) {
- // Only consider fields with the DatabaseField annotation
- if(annotation instanceof DatabaseField) {
- // Check for foreign attribute
- DatabaseField databaseField = (DatabaseField)annotation;
- if(databaseField.foreign()) {
- // Check for instance of Entity
- Object object = field.get(entity);
- if(object instanceof Entity) {
- // Recursive persist referenced entity
- create(databaseHelper, (Entity)object);
- }
- }
- }
- }
- }
- // Retrieve the common DAO for the entity class
- Dao<Entity, Integer> dao = (Dao<Entity, Integer>) sDaoClassMap.get(clazz);
- // If the DAO does not exist, create it and add it to the static map
- if(dao == null) {
- dao = BaseDaoImpl.createDao(databaseHelper.getConnectionSource(), clazz);
- sDaoClassMap.put(clazz, dao);
- }
- // Persist the entity to the database
- dao.create(entity);
- }
- @DatabaseField(foreign = true,foreignAutoCreate = true,foreignAutoRefresh = true)
- public Child child;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement