SQLiteException: A NOT NULL constraint failed

Bom dia,

Estou tentando salvar dados de um programa em Java para o SQLite. Achei que por eu ter colocado a chave primária como autoincrement que o BD faria esse incremento sozinho, mas não está funcionando.

Seguem os códigos:

Java:

   public boolean saveUserData(Usuario u){ //obj chega ok
        
        try{
        stmt = con.prepareStatement("INSERT INTO Usuario (nome, sobrenome, "
                + "usuario, dtNascimento, telefone) VALUES (?,?,?,?,?)");
              
        stmt.setString(1, u.getNome());
        stmt.setString(2, u.getSobrenome());
        stmt.setString(3, u.getUsuario());
        
        //TODO melhorar data (essa e PainelCad)
        java.util.Date d = u.getDtNascimento();
        stmt.setDate(4, new java.sql.Date(d.getTime()));
        
        stmt.setString(5, u.getTelefone());
        stmt.executeUpdate();
        return true;
        } catch (SQLException e) {
            System.err.println("Erro ao inserir usuário ou conta\n");
            e.printStackTrace();
            return false;
    }
}

SQL:

create table CONTA( 
id_conta INTEGER NOT NULL PRIMARY KEY
   --GENERATED ALWAYS AS IDENTITY    //Tentei isso e não funcionou, vi num fórum
  -- (START WITH 1, INCREMENT BY 1),
email TEXT,
senha TEXT
)



create table USUARIO(
id_usuario INTEGER PRIMARY KEY AUTOINCREMENT,
id_conta INT NOT NULL,
nome TEXT NOT NULL,  
sobrenome TEXT NOT NULL,
usuario TEXT NOT NULL,
dtNascimento DATE,
telefone TEXT,
FOREIGN KEY (id_conta) REFERENCES CONTA (id_conta)
)

Estou recebendo o erro:

org.sqlite.SQLiteException: [SQLITE_CONSTRAINT_NOTNULL] A NOT NULL constraint failed (NOT NULL constraint failed: USUARIO.id_conta)

Podem ajudar?

Bom sua exception está te dizendo que o id da conta está nullo.

Verique se no momento do insert existe o objeto conta. E se ele possui um id válido.
Caso seje uma nova conta, será necessário inseri-la antes. Só aí o seu insert de usuário irá funcionar.

Nota: Eu relacionaria o USUARIO > CONTA. conta.id_usuario

1 curtida

Então, fiz isso, mas continuo recebendo o mesmo erro:

    public boolean saveUserData(Usuario u){
        try{
        stmt = con.prepareStatement("INSERT INTO Conta (email, senha) VALUES"
                + "(?,?)");
        stmt.setString(1, u.getConta().getEmail());
        String pass = new String(u.getConta().getPass());
        stmt.setString(2, pass);
        
        }catch(SQLException e){
            e.printStackTrace();
        }
     
        try{
        stmt = con.prepareStatement("INSERT INTO Usuario (nome, sobrenome, "
                + "usuario, dtNascimento, telefone) VALUES (?,?,?,?,?)");
              //TODO erro pk ... no guj
        stmt.setString(1, u.getNome());
        stmt.setString(2, u.getSobrenome());
        stmt.setString(3, u.getUsuario());
        
        //TODO melhorar data (essa e PainelCad)
        java.util.Date d = u.getDtNascimento();
        stmt.setDate(4, new java.sql.Date(d.getTime()));
        
        stmt.setString(5, u.getTelefone());
        stmt.executeUpdate();
        return true;
        } catch (SQLException e) {
            System.err.println("Erro ao inserir usuário ou conta\n");//TODO trocar por exeption
            e.printStackTrace();
            return false;
    }
}

Erro ao inserir usuário ou conta

org.sqlite.SQLiteException: [SQLITE_CONSTRAINT_NOTNULL] A NOT NULL constraint failed (NOT NULL constraint failed: USUARIO.id_conta)

Você mudou o relacionamento sim ou não?

De qualquer maneira verifique na tabela usuário a coluna id_conta. Pois ela está como NOT NULL e você não está passando valor para ela. Repare sua SQL.[quote=“nanquim, post:3, topic:340923”]
stmt = con.prepareStatement("INSERT INTO Usuario (nome, sobrenome, "
+ “usuario, dtNascimento, telefone) VALUES (?,?,?,?,?)”);
[/quote]

Você não está passando valor para o campo usuario.id_conta e o mesmo é um campo NOT NULL. Pois não consta na sua instrução e ele não é AUTO_INCREMENT.

Preste atenção!

Vai manter o campo usuario.id_conta?
Se sim, ele pode ser nulo? caso sim remova apenas o NOT NULL dele.
Caso não, corriga sua SQL e parametrizea.

Ele vai receber valor no momento do insert do usuário?
Se sim, adicione ele na sua intrução SQL e não se esqueça de setar ela no STMT.

Não vai manter o campo?
Apenas remova a coluna e ta tudo certo.

1 curtida

Ok, tirei o null e tá funcionando

Obrigada