public void save() {
		final ColumnMapper mapper = getColumnMapper();
		final ContentValues values = new ContentValues();

		final Field[] fields = Reflection.getNonStaticDeclaredFields(getClass());
		for (Field field : fields) {
			if (!isMultiValued(field) && !isTransient(field)) {
				values.put(field.getName(), mapper.getValueFromObject(field, this));
			}
		}

		final String tableName = getTableName();
		synchronized (Lock) {
			SQLiteDatabase database = getHelper().getWritableDatabase();
			if (_id != null) {
				database.update(tableName, values, "_id=?", new String[] { _id.toString() });
			} else {
				final long newId = database.insertOrThrow(tableName, null, values);
				if (newId != -1) {
					this._id = (int) newId;
				}
			}
			database.close();
		}
	}