package net.bradmont.supergreen.fields; import net.bradmont.supergreen.fields.constraints.ConstraintError; import net.bradmont.supergreen.models.*; import android.widget.*; import android.database.Cursor; import android.view.View; import android.util.Log; public class ForeignKeyField extends IntField { DBModel relatedModel = null; public ForeignKeyField(String name){ super(name); } public ForeignKeyField(String name, DBModel references){ super(name); relatedModel = references; } /** * Push the value to the specified view. Will select the apropriate * record in a Spinner fed by a CursordAdapter; assumes the field's * present value corresponds to column 0 in the CursorAdapter's result * set. */ @Override public void putToView(View v){ putToView(v, 0); } public void putToView(View v, int cursor_column){ if (v instanceof Spinner){ Spinner spinner = (Spinner) v; SpinnerAdapter adapter = spinner.getAdapter(); if (adapter instanceof CursorAdapter){ Cursor cur = ((CursorAdapter) adapter).getCursor(); cur.moveToFirst(); while (!cur.isAfterLast()){ if (cur.getInt(cursor_column) == getInt()){ spinner.setSelection(cur.getPosition()); return; } } } } else { stringToView(v, Integer.toString(value)); } } @Override public String getSQLTableConstraint(){ String sql = "FOREIGN KEY (%s) REFERENCES %s (%s)"; sql = String.format(sql, getColumnName(), relatedModel.getTableName(), relatedModel.getPrimaryKey().getColumnName() ); return sql; } /** * Gets the model to which this key refers */ @Override public DBModel getRelated(){ return relatedModel.newInstance(getInt()); } @Override public void setValue(DBModel model){ setValue(model.getPrimaryKey().getInt()); } }