Erro na inserção de dados na base de dados sqlite: error code 19 :constraint failed

Boas pessoal, estou com um problema relacionado com a inserção de dados através do formulário da aplicação android, quando se clica para enviar os dados para a base de dados surge o erro error code 19 :constraint failed, realmente não sei como ultrapassar sou iniciante. Abaixo deixo o código

public class ScriptDLL {

	public static String getCreateTableReports() {
		StringBuilder sql = new StringBuilder();
		sql.append("create table if not exists reports( ");
		sql.append("idReport integer(4) primary key autoincrement,");
		sql.append("descricaoReport text(200) not null, ");
		sql.append("nomeFuncionario text(40) not null, ");
		sql.append("apelidoFuncionario text(40) not null, ");
		sql.append("departamento text(70) not null, ");
		sql.append("data text(10) not null, ");
		sql.append("hora text(5) not null, ");
		sql.append("piso integer);");
		return sql.toString();
	}

	public static String getCreateTableLogin() {
		StringBuilder sql = new StringBuilder();
		sql.append("create table if not exists login( ");
		sql.append("idUser integer primary key autoincrement not null, ");
		sql.append("codigoFuncionario integer(10)not null unique, ");
		sql.append("usuario varchar(10) not null default(''), ");
		sql.append("senha varchar(10) not null default(''), ");
		sql.append("foreign key(codigoFuncionario) references funcionario(codigoFuncionario));");
		return sql.toString();
	}
	
	public static String getCreateTableFuncionario(){
		StringBuilder sql = new StringBuilder();
		sql.append("create table if not exists funcionario( ");
		sql.append("idFuncionario integer primary key autoincrement not null, ");
		sql.append("codigoFuncionario varchar(5) unique not null default(''), ");
		sql.append("nomeFuncionario varchar(40) not null default(''), ");
		sql.append("apelidoFuncionario varchar(40) not null default(''), ");
		sql.append("departamento varchar(70) not null default(''), ");
		sql.append("reparticao varchar(70) not null default(''), ");
		sql.append("cargo varchar(50) not null default(''), ");
		sql.append("carreira varchar(50) not null default(''), ");
		sql.append("dataRegisto text not null default(''));");
		return sql.toString();
		
		
	}

}

public class ReportActivity extends Activity {
	private Button btnReportar;
	private EditText txtHora, txtData, txtNome, txtApelido, txtDepartamento, txtPiso, txtProblema;
	private ImageButton btnVoltar;
	
	private ReportRepositorio reportRepositorio;
	private SQLiteDatabase conexao;
	private DadosOpenHelper dadosOpenHelper;
	private Report report;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.reportform);
		txtHora = (EditText) findViewById(R.id.txtHora);
		txtData = (EditText) findViewById(R.id.txtData);
		txtNome = (EditText) findViewById(R.id.txtNome);
		txtApelido = (EditText) findViewById(R.id.txtApelido);
		txtDepartamento = (EditText) findViewById(R.id.txtDepartamento);
		txtPiso = (EditText) findViewById(R.id.txtPiso);
		txtProblema = (EditText) findViewById(R.id.txtProblema);
		btnReportar = (Button) findViewById(R.id.btnReportar);
		btnVoltar = (ImageButton) findViewById(R.id.btnVoltar);

		voltarMenu();
		criarConexao();  
		report();
		confirmar();
		
	}

	private void criarConexao() {
		try {
			dadosOpenHelper = new DadosOpenHelper(this);
			conexao = dadosOpenHelper.getWritableDatabase();
			Toast.makeText(getApplicationContext(), "Conexão criada com sucesso", Toast.LENGTH_SHORT).show();
			reportRepositorio = new ReportRepositorio(conexao);

		} catch (SQLException ex) {
			AlertDialog.Builder dlg = new AlertDialog.Builder(this);
			dlg.setTitle("Aviso!");
			dlg.setMessage(ex.getMessage());
			dlg.setNeutralButton("Ok", null);
			dlg.show();
		}
	}

	private void confirmar() {
		report = new Report();
		if (validaCampos() == false) {
			try {
				reportRepositorio.inserirReport(report);
				Toast.makeText(getApplicationContext(), "Reportado com sucesso", Toast.LENGTH_SHORT).show();
				finish();
			} catch (SQLException ex) {
				AlertDialog.Builder dlg = new AlertDialog.Builder(this);
				dlg.setTitle("Erro");
				dlg.setMessage(ex.getMessage());
				dlg.setNeutralButton("Ok", null);
				dlg.show();
			}

		}
	}
	
	private void report() {
		btnReportar.setOnClickListener(new View.OnClickListener() {
			
			@Override
			public void onClick(View v) {
				confirmar();
				
			}
		});
	}

	private boolean validaCampos() {

		boolean res = false;

		String nome = txtNome.getText().toString();
		String apelido = txtApelido.getText().toString();
		String departamento = txtDepartamento.getText().toString();
		String piso = txtPiso.getText().toString();
		String problema = txtProblema.getText().toString();
		String hora = txtHora.getText().toString();
		String data = txtData.getText().toString();

		report.nomeFuncionario = nome;
		report.apelidoFuncionario = apelido;
		report.departamento = departamento;
		report.piso = piso;
		report.problema = problema;
		report.data = data;
		report.hora = hora;

		if (res = isCampoVazio(nome)) {
			txtNome.requestFocus();
		} else

		if (res = isCampoVazio(apelido)) {
			txtApelido.requestFocus();
		} else

		if (res = isCampoVazio(departamento)) {
			txtDepartamento.requestFocus();
		} else

		if (res = isCampoVazio(piso)) {
			txtPiso.requestFocus();
		} else

		if (res = isCampoVazio(problema)) {
			txtProblema.requestFocus();
		}

		if (res) {
			AlertDialog.Builder dlg = new AlertDialog.Builder(this);
			dlg.setTitle("Aviso!");
			dlg.setMessage("Há campos vázios. Preencha por favor.");
			dlg.setNeutralButton("Ok", null);
			dlg.show();
		}

		return res;
	}

	private boolean isCampoVazio(String valor) {
		boolean resultado = (TextUtils.isEmpty(valor) || valor.trim().isEmpty()); // ira retornar mesmo que tenha dados
																					// espaco
		return resultado;

	};

	private void voltarMenu() {
		btnVoltar.setOnClickListener(new View.OnClickListener() {

			@Override
			public void onClick(View v) {
				finish();

			}
		});
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// Inflate the menu; this adds items to the action bar if it is present.
		getMenuInflater().inflate(R.menu.report_form, menu);
		return true;
	}

	
}

    public class DadosOpenHelper extends SQLiteOpenHelper {

	public DadosOpenHelper(Context context) {
		super(context, "reportappBD", null, 1);
		// TODO Auto-generated constructor stub
	}

	@Override
	public void onCreate(SQLiteDatabase db) { // será o local onde se irá criar as tabelas da base de dados
		db.execSQL(ScriptDLL.getCreateTableFuncionario()); //metodos criados na classe scriptdll
		db.execSQL(ScriptDLL.getCreateTableLogin());
		db.execSQL(ScriptDLL.getCreateTableReports());

	}

	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {// local onde irá se realizar
																				// actualizações da base dados
		// TODO Auto-generated method stub

	}

}

Você tem de criar a tabela de funcionário antes da tabela de login, pois não tem como você referenciar uma chave estrangeira de uma tabela que ainda não é existente!