Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

Erro ao inserir/alterar dados

Depois dos videos 1 e 2, a agenda esta inserindo, mas apresentando este erro.

Error inserting 
                                                  android.database.sqlite.SQLiteConstraintException: UNIQUE constraint failed: pending_ops.tag, pending_ops.target_class, pending_ops.target_package, pending_ops.user_id (code 2067)
                                                      at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
                                                      at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:780)
                                                      at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
                                                      at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
                                                      at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1473)
                                                      at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1341)
                                                      at svp.a(:com.google.android.gms@11518470:208)
                                                      at sww.a(:com.google.android.gms@11518470:64)
                                                      at sww.a(:com.google.android.gms@11518470:7)
                                                      at sww.a(:com.google.android.gms@11518470:58)
                                                      at svm.run(:com.google.android.gms@11518470:3)
                                                      at mmo.run(:com.google.android.gms@11518470:25)
                                                      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1113)
                                                      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:588)
                                                      at mrv.run(:com.google.android.gms@11518470)
                                                      at java.lang.Thread.run(Thread.java:818)
10-19 09:26:06.330 1578-30457/? E/NetworkScheduler: Error persisting task: com.google.android.talk/com.google.android.apps.hangouts.concurrent.impl.GcmTriggeredNotifier{u=0 tag=":
5 respostas
solução!

Como o nome do erro sugere, acredito que exista algum outro registro com o mesmo ID que você esteja usando.

Seria o caso que você esteja tentando dar um UPDATE chamando um INSERT?

Prossegui com o curso e não está mais inserindo.

Vou apresentar qui os códigos:

Parte do DAO:

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "CREATE TABLE alunos (id INTEGER PRIMARY KEY, " +
                "nome TEXT NOT NULL, " +
                "email TEXT NOT NULL, " +
                "endereco TEXT, telefone " +
                "TEXT, site TEXT, " +
                "nota REAL, " +
                "caminhoFoto TEXT);";
        db.execSQL(sql);
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        String sql = "";
        switch (oldVersion) {
            case 1:
                sql = "ALTER TABLE alunos " +
                    "ADD COLUMN caminhoFoto TEXT";
                db.execSQL(sql);
            case 2:
                String criandoTabelaNova = "CREATE TABLE Alunos_novo (" +
                        "id CHAR(36) PRIMARY KEY," +
                        "nome TEXT NOT NULL, " +
                        "email TEXT NOT NULL, " +
                        "endereco TEXT, telefone " +
                        "TEXT, site TEXT, " +
                        "nota REAL, " +
                        "caminhoFoto TEXT);";
                db.execSQL(criandoTabelaNova);

                String inserindoAlunosNaTabelaNova = "INSERT INTO Alunos_novo" +
                        "(id, nome, endereco, telefone, site, nota, caminhoFoto) " +
                        "SELECT id, nome, endereco, telefone, site, nota, caminhoFoto " +
                        "FROM Alunos";
                db.execSQL(inserindoAlunosNaTabelaNova);

                String removeTabelaAntiga = "DROP TABLE Alunos";

                db.execSQL(removeTabelaAntiga);

                String alterandoNomeDaTabelaNova = "ALTER TABLE Alunos_novo "+
                        "RENAME TO Alunos";
                db.execSQL(alterandoNomeDaTabelaNova);
            case 3:
                String buscaAlunos = "SELECT * FROM Alunos";
                Cursor cursor = db.rawQuery(buscaAlunos, null);

                List<Aluno> alunos = populaAlunos(cursor);

                String atualizaIdDoAluno = "UPDATE Alunos SET id=? WHERE id=?";

                for(Aluno aluno: alunos) {

                    Log.i("UUID: ", geraUUID());
                    db.execSQL(atualizaIdDoAluno, new String[] {geraUUID(), aluno.getId() });
                }


        }
    }

    private String geraUUID() {
        return UUID.randomUUID().toString();
    }

    public void insere(Aluno aluno) {
        SQLiteDatabase db = getWritableDatabase();
        aluno.setId(geraUUID());
        ContentValues dados = pegaDadosDoAluno(aluno);

        db.insert("Alunos", null, dados);

    }

    @NonNull
    private ContentValues pegaDadosDoAluno(Aluno aluno) {
        ContentValues dados = new ContentValues();
        dados.put("id", aluno.getId());
        dados.put("nome", aluno.getNome());
        dados.put("email", aluno.getEmail());
        dados.put("endereco", aluno.getEndereco());
        dados.put("telefone", aluno.getTelefone());
        dados.put("site", aluno.getSite());
        dados.put("nota", aluno.getNota());
        dados.put("caminhoFoto", aluno.getCaminhoFoto());
        return dados;
    }

    public List<Aluno> buscaAlunos() {
        String sql = "SELECT * FROM alunos;";
        SQLiteDatabase db = getReadableDatabase();
        Cursor c = db.rawQuery(sql, null);
        List<Aluno> alunos = populaAlunos(c);
        c.close();
        return alunos;
    }
    @NonNull
    private List<Aluno> populaAlunos(Cursor c) {
        List<Aluno> alunos = new ArrayList<Aluno>();
        while(c.moveToNext()){
            Aluno aluno = new Aluno();
            aluno.setId(c.getString(c.getColumnIndex("id")));
            aluno.setNome(c.getString(c.getColumnIndex("nome")));
            aluno.setEmail(c.getString(c.getColumnIndex("email")));
            aluno.setEndereco(c.getString(c.getColumnIndex("endereco")));
            aluno.setTelefone(c.getString(c.getColumnIndex("telefone")));
            aluno.setSite(c.getString(c.getColumnIndex("site")));
            aluno.setNota(c.getDouble(c.getColumnIndex("nota")));
            aluno.setCaminhoFoto(c.getString(c.getColumnIndex("caminhoFoto")));

            alunos.add(aluno);
        }
        return alunos;
    }

Parte do listar alterado:

    private void carregaLista() {
        AlunoDAO dao = new AlunoDAO(this);
        List<Aluno> alunos = dao.buscaAlunos();
        dao.close();

        for (Aluno aluno : alunos) {
            Log.i("id do aluno: ", String.valueOf(aluno.getId()));
        }

        AlunosAdapter adapter = new AlunosAdapter(this, alunos);
        listaAlunos.setAdapter(adapter);
    }

Irei postar abaixo o FOrmularioActivity

FormularioActivity:

 @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch(item.getItemId()){
            case R.id.menu_formulario_ok:
                Aluno aluno = helper.pegaAluno();
                AlunoDAO dao = new AlunoDAO(this);
                if (aluno.getId() != null) {
                   dao.altera(aluno);
                }
                else {
                    dao.insere(aluno);
                }

                dao.close();

                //new InsereAlunoTask(aluno).execute();
                Call call = new RetrofitInicializador().getAlunoService().insere(aluno);

                call.enqueue(new Callback() {
                    @Override
                    public void onResponse(Call call, Response response) {
                        Log.i("onResponse: ", "requisicao com sucesso!");
                    }

                    @Override
                    public void onFailure(Call call, Throwable t) {
                        Log.e("onFailure: ", "rquisicao falhou");
                    }
                });

                Toast.makeText(FormularioActivity.this, "Aluno: " + aluno.getNome() + " salvo!", Toast.LENGTH_SHORT).show();
                finish();
                break;
        }

        return super.onOptionsItemSelected(item);
    }

Confere se o dao.altera está chamando um update ao invés de um outro insert.

Verifica também se você mudou a versão do banco no construtor.

Na hora não tinha, agora está 'correto', estou problema no listar, como abri em outro tópico