/*
* Copyright (c) 2013. wyouflf (wyouflf@gmail.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.lidroid.xutils.db.table;
import android.database.Cursor;
import com.lidroid.xutils.db.converter.ColumnConverter;
import com.lidroid.xutils.db.converter.ColumnConverterFactory;
import com.lidroid.xutils.db.sqlite.ColumnDbType;
import com.lidroid.xutils.util.LogUtils;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
public class Column {
private Table table;
private int index = -1;
protected final String columnName;
private final Object defaultValue;
protected final Method getMethod;
protected final Method setMethod;
protected final Field columnField;
protected final ColumnConverter columnConverter;
/* package */ Column(Class<?> entityType, Field field) {
this.columnField = field;
this.columnConverter = ColumnConverterFactory.getColumnConverter(field.getType());
this.columnName = ColumnUtils.getColumnNameByField(field);
if (this.columnConverter != null) {
this.defaultValue = this.columnConverter.getFieldValue(ColumnUtils.getColumnDefaultValue(field));
} else {
this.defaultValue = null;
}
this.getMethod = ColumnUtils.getColumnGetMethod(entityType, field);
this.setMethod = ColumnUtils.getColumnSetMethod(entityType, field);
}
@SuppressWarnings("unchecked")
public void setValue2Entity(Object entity, Cursor cursor, int index) {
this.index = index;
Object value = columnConverter.getFieldValue(cursor, index);
if (value == null && defaultValue == null) return;
if (setMethod != null) {
try {
setMethod.invoke(entity, value == null ? defaultValue : value);
} catch (Throwable e) {
LogUtils.e(e.getMessage(), e);
}
} else {
try {
this.columnField.setAccessible(true);
this.columnField.set(entity, value == null ? defaultValue : value);
} catch (Throwable e) {
LogUtils.e(e.getMessage(), e);
}
}
}
@SuppressWarnings("unchecked")
public Object getColumnValue(Object entity) {
Object fieldValue = getFieldValue(entity);
return columnConverter.fieldValue2ColumnValue(fieldValue);
}
public Object getFieldValue(Object entity) {
Object fieldValue = null;
if (entity != null) {
if (getMethod != null) {
try {
fieldValue = getMethod.invoke(entity);
} catch (Throwable e) {
LogUtils.e(e.getMessage(), e);
}
} else {
try {
this.columnField.setAccessible(true);
fieldValue = this.columnField.get(entity);
} catch (Throwable e) {
LogUtils.e(e.getMessage(), e);
}
}
}
return fieldValue;
}
public Table getTable() {
return table;
}
/* package */ void setTable(Table table) {
this.table = table;
}
/**
* The value set in setValue2Entity(...)
*
* @return -1 or the index of this column.
*/
public int getIndex() {
return index;
}
public String getColumnName() {
return columnName;
}
public Object getDefaultValue() {
return defaultValue;
}
public Field getColumnField() {
return columnField;
}
public ColumnConverter getColumnConverter() {
return columnConverter;
}
public ColumnDbType getColumnDbType() {
return columnConverter.getColumnDbType();
}
}