/** * Saves this entity to the database, inserts or updates as needed. * * @return number of rows affected on success, -1 on failure * @throws ActiveRecordException */ public long save() throws ActiveRecordException { long r = -1; if (m_Database == null) throw new ActiveRecordException("Set database first"); if (null == findByID(this.getClass(), _id)) { if (insert() > 0) { r = 1; } } else { r = update(); } for (Field column : getColumnFields()) { if (column.getType() == List.class) { try { List<ActiveRecordBase> listObjects = (List<ActiveRecordBase>) column.get(this); Field itemOwner = null; if (listObjects != null && listObjects.size() > 0) { for (Field childColumn : listObjects.get(0).getColumnFields()) { // Try to find the parent column and set it // automatically to save time from those setters // and getters if (childColumn.getType() == this.getClass()) { itemOwner = childColumn; break; } } for (ActiveRecordBase item : listObjects) { if (item.getDatabase() == null) { item.setDatabase(getDatabase()); } if (itemOwner != null) { itemOwner.set(item, this); } item.save(); } } } catch (IllegalAccessException e) { e.printStackTrace(); } catch (IllegalArgumentException e) { e.printStackTrace(); } } } s_EntitiesMap.set(this); return r; }
/** Creates the ContentValues to be used for data insertion */ public ContentValues createContentValues() throws ActiveRecordException { List<Field> columns = _id > 0 ? getColumnFields() : getColumnFieldsWithoutID(); ContentValues values = new ContentValues(columns.size()); for (Field column : columns) { Annotation ignore = column.getAnnotation(ActiveRecordIgnoreAttribute.class); Annotation manyToMany = column.getAnnotation(ManyToManyRelation.class); if (manyToMany != null) { // TODO: Fixme continue; } try { if (column.getType().getSuperclass() == ActiveRecordBase.class) { ActiveRecordBase col = (ActiveRecordBase) column.get(this); // This is another entry and if it doesn't already have an ID // it means we should persist *it* before we try to grab it's // value if (col != null && col.getID() < 0) { if (col.getDatabase() == null) { col.setDatabase(getDatabase()); } col.save(); } String columnName = CamelNotationHelper.toSQLName(column.getName()); String value = String.valueOf(col != null ? col.getID() : 0); values.put(columnName, value); } else if (column.getType() == List.class) { } else if (ignore != null) { continue; } else { values.put( CamelNotationHelper.toSQLName(column.getName()), String.valueOf(column.get(this))); } } catch (IllegalArgumentException e) { throw new ActiveRecordException("No column " + column.getName()); } catch (IllegalAccessException e) { throw new ActiveRecordException("No column " + column.getName()); } } return values; }