REGISTROS DUPLICADOS CON db.insert("clientes", null, valores) EN ANDROID Y SQLITE

771 views
Skip to first unread message

Leandro Jourdan

unread,
Sep 2, 2014, 6:01:48 PM9/2/14
to desarrollad...@googlegroups.com
hola buenas tardes a todos!

hace tiempo ya estoy en el tema de desarrollo de aplicaciones para android y me surgio un inconveniente: de vez en cuando la sentencia de insert() me genera registros duplicados con exactamente los mismos datos. Uso una sentencia parecida a esta db.insert("clientes", null, valores); en todos los casos en donde me paso ese problema...

quisiera saber si alguien tubo el mismo problema y como lo solucionó

desde ya muchisimas gracias por su tiempo. Saludos

Rafa Couto

unread,
Sep 3, 2014, 3:30:11 AM9/3/14
to desarrollad...@googlegroups.com

Nope, eso no ocurre porque sí: en algún momento se está llamando al insert más de una vez.

1. Busca en el código todos los "db.insert" que tengas para "clientes".
2. Por cada uno de esos "db.insert" añade al lado esta otra llamada: Log.v("db.insert", Arrays.toString(Thread.getCurrentThread().getStackTrace()));
3. Ejecuta la aplicación y queda atento al log en modo verbose.


--
Rafa Couto
GNU/Linux user #99126 - http://bit.ly/LC-99126
GPG key - http://bit.ly/GPG-D76ABDEC

Leandro Jourdan

unread,
Sep 3, 2014, 2:56:13 PM9/3/14
to desarrollad...@googlegroups.com
Mucahas gracias caligari! voy a probar con eso para ver que pasa! saludos

Leandro Jourdan

unread,
Sep 3, 2014, 3:16:02 PM9/3/14
to desarrollad...@googlegroups.com
Este es el mensaje que me da el log

[dalvik.system.VMStack.getThreadStackTrace(Native Method), java.lang.Thread.getStackTrace(Thread.java:591), com.example.sodacachito.ABMNuevoCliente.clickguardarnuevocliente(ABMNuevoCliente.java:194), java.lang.reflect.Method.invokeNative(Native Method), java.lang.reflect.Method.invoke(Method.java:511), android.view.View$1.onClick(View.java:3642), android.view.View.performClick(View.java:4147), android.view.View$PerformClick.run(View.java:17161), android.os.Handler.handleCallback(Handler.java:615), android.os.Handler.dispatchMessage(Handler.java:92), android.os.Looper.loop(Looper.java:213), android.app.ActivityThread.main(ActivityThread.java:4787), java.lang.reflect.Method.invokeNative(Native Method), java.lang.reflect.Method.invoke(Method.java:511), com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789), com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556), dalvik.system.NativeStart.main(Native Method)]

alguna sugerencia?

Matias Camiletti

unread,
Sep 3, 2014, 8:51:10 PM9/3/14
to desarrollad...@googlegroups.com
Hola Leandro, no debería suceder ese problema, es muy difícil encontrar tu solución sin tener el código a mano, pero trata de buscar si la llamada al insert : db.insert("clientes", null, valores);)  la tenes dentro de un metodo, busca todas las llamadas a ese metodo, verifica que no se este llamando dos veces, fijate de poner un mensaje en la consola justo despues del insert : System.out.println("Ya se ejecuto el insert");  es mas que seguro que se te va a imprimir dos veces ese mensaje.

Rafa Couto

unread,
Sep 4, 2014, 2:29:32 AM9/4/14
to desarrollad...@googlegroups.com

Sólo te ha hecho un insert, verdad? Lo que tienes que encontrar es el caso en el que ocurran 2 inserts y revisar el log desde donde se llama para que arreglar el problema...


--
Para participar es necesario que leas detenidamente las normas del grupo: http://goo.gl/8h8ez2
---
Has recibido este mensaje porque estás suscrito al grupo "desarrolladores-android" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a desarrolladores-a...@googlegroups.com.
Para publicar en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/desarrolladores-android.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/desarrolladores-android/b1f1bc3f-5b94-4ea3-a581-8ab10f34fa91%40googlegroups.com.

Para acceder a más opciones, visita https://groups.google.com/d/optout.

Leandro Jourdan

unread,
Sep 4, 2014, 2:25:49 PM9/4/14
to desarrollad...@googlegroups.com
aca les dejo la clase que uso para dar de alta a un cliente nuevo

package com.example.sodacachito;

import java.util.Arrays;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.content.Intent;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.EditText;
import android.widget.Toast;

public class ABMNuevoCliente extends Activity {
    int request_code;
   
    EditText txvPridosclie;
    EditText txvSegochclie;
    EditText txvUltunoclie;
    EditText txvRasociclie;
    EditText txvDireccclie;
    EditText txvCelulaclie;
    EditText txvTelefoclie;
    EditText txvE_mailclie;
    EditText txvConivaclie;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.abmclientes);
    }
   
    public void clickbuscarcondivacliente (View vwbuscarcondivacliente) {
        //ARMO EL INTENT PARA LLAMAR A LA OTRA PANTALLA
        Intent vercondivacliente = new Intent();
        vercondivacliente.setClass(this,FrmBuscarCondivaCliente.class);
        startActivityForResult(vercondivacliente, request_code);
    }
   
    public void clickguardarnuevocliente (View view) {
       
        int LnError = 0;
       
        String LcRasociclie = "";
        String LcDireccclie = "";
        String LcCelulaclie = "";
        String LcTelefoclie = "";
        String LcE_mailclie = "";
        String LcConivaclie = "";
        String LcPridosclie = "";
        String LcSegochclie = "";
        String LcUltunoclie = "";
        String LcNucuitclie = "--";
       
        txvPridosclie = (EditText)findViewById(R.id.txfpridosclie);
        txvSegochclie = (EditText)findViewById(R.id.txfsegochclie);
        txvUltunoclie = (EditText)findViewById(R.id.txfultunoclie);

        txvRasociclie = (EditText)findViewById(R.id.txfrasociclie);
        txvDireccclie = (EditText)findViewById(R.id.txfdireccclie);
        txvCelulaclie = (EditText)findViewById(R.id.txfcelulaclie);
        txvTelefoclie = (EditText)findViewById(R.id.txftelefoclie);
        txvE_mailclie = (EditText)findViewById(R.id.txfe_mailclie);
        txvConivaclie = (EditText)findViewById(R.id.txfconivaclie);
       
        LcRasociclie = txvRasociclie.getText().toString();
        LcDireccclie = txvDireccclie.getText().toString();
        LcCelulaclie = txvCelulaclie.getText().toString();
        LcTelefoclie = txvTelefoclie.getText().toString();
        LcE_mailclie = txvE_mailclie.getText().toString();
        LcConivaclie = txvConivaclie.getText().toString();
       
        LcPridosclie = txvPridosclie.getText().toString();
        LcSegochclie = txvSegochclie.getText().toString();
        LcUltunoclie = txvUltunoclie.getText().toString();
       
        //completo con ceros los ocho dijitos del cuit
        while(LcSegochclie.length()<8){
            LcSegochclie = "0"+LcSegochclie;
        }
       
        //completo con ceros los dos dijitos del cuit
        while(LcPridosclie.length()<2){
            LcPridosclie = "0"+LcPridosclie;
        }
       
        //completo con ceros los dos dijitos del cuit
        while(LcUltunoclie.length()<1){
            LcUltunoclie = "0"+LcUltunoclie;
        }


        LcNucuitclie = LcPridosclie.toString() + "-" + LcSegochclie.toString() + "-" + LcUltunoclie.toString();
       
        //pregunto si hay ingresado nombre o direccion
        if(txvRasociclie.getText().toString().equals("") || txvDireccclie.getText().toString().equals("")){
           
            LnError = 1;
           
            AlertDialog.Builder builder = new AlertDialog.Builder(this);
            builder.setMessage("No ingreso Nombre o Dirección")
                    .setTitle("Atención")
                    .setCancelable(false)
                    .setPositiveButton("Aceptar",new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int id) {
                            dialog.cancel();
                        }
            });
            AlertDialog alert = builder.create();
            alert.show();
       
        }else{
           
            // pregunta por condicion de iva y cuit
            if(txvConivaclie.getText().toString().equals("RESPONSABLE INSCRIPTO") || txvConivaclie.getText().toString().equals("RESPONSABLE MONOTRIBUTO") || txvConivaclie.getText().toString().equals("EXENTO")){
                if (LcNucuitclie.equals("--") || LcNucuitclie.length() < 13){
                   
                    LnError = 1;
                   
                    AlertDialog.Builder builder = new AlertDialog.Builder(this);
                    builder.setMessage("No ingreso numero de CUIT o está incompleto")
                            .setTitle("Atención")
                            .setCancelable(false)
                            .setPositiveButton("Aceptar",new DialogInterface.OnClickListener() {
                                public void onClick(DialogInterface dialog, int id) {
                                    dialog.cancel();
                                }
                    });
                    AlertDialog alert = builder.create();
                    alert.show();
                }
            }
        }
               
        if (LnError == 0){    
            ManejoBaseDatos admin = new ManejoBaseDatos(this);
            SQLiteDatabase db = admin.getWritableDatabase();
            if(db != null){
   
                ContentValues valores = new ContentValues();
                valores.put("RASOCICLIE", LcRasociclie);
                valores.put("DIRECCCLIE", LcDireccclie);
                valores.put("TELEFOCLIE", LcTelefoclie);
                valores.put("CELULACLIE", LcCelulaclie);
                valores.put("E_MAILCLIE", LcE_mailclie);
                valores.put("CONIVACLIE", LcConivaclie);
                valores.put("NUCUITCLIE", LcNucuitclie);
                valores.put("COZONACLIE", 0);
                valores.put("NOZONACLIE", " ");
                valores.put("CBARRICLIE", 0);
                valores.put("COLOCACLIE", 0);
                valores.put("CPROVICLIE", 0);
                valores.put("COCATECLIE", 0);
                valores.put("NUEVO_CLIE", 1);
                valores.put("CODCLIAGRU", 0);
                valores.put("CONREMITO", 0);
               
                Cursor numeros = null;
                try {
                   
                    //tomo los datos de la tabla repartos para grabar en gastos reparto
                    Cursor repartos1 = db.rawQuery("SELECT CODIZONA FROM repartos WHERE ACTIVO = 1", null);
                    repartos1.moveToFirst();
                   
                    //tomo los datos de la tabla numeros para hacer el numero de la nueva venta
                    String columnas_numero[] = {"CLIENNUEVO"};
                    numeros = db.query("numeros", columnas_numero, null, null, null, null, null);
                   
                    //ARMO NUMERO DE CLIENTE
                    numeros.moveToFirst();
                    //tomo el dato del numero de movil y del numero de la ultima venta
                    int LnNroclie = Integer.parseInt(numeros.getString(0).toString().trim());
                   
                    //suma uno al numero anterior de venta
                    LnNroclie = LnNroclie + 1;
                    //String LnNroclieC = String.valueOf(LnNroclie);
                   
                    //termino de completar conten values de cliente con el numero y la marca de nuevo cliente
                    valores.put("CODIGOCLIE", LnNroclie);
                    valores.put("ZONAREPA", repartos1.getString(0));
                   
                    //arma contenT values para guardar el nuevo numero de cliente
                    ContentValues nro_cliente = new ContentValues();
                    nro_cliente.put("CLIENNUEVO", LnNroclie);
                   
                    //guarda el numero de cliente
                    db.update("numeros", nro_cliente, null, null);
                   
                    //guarda clientes
                    db.insert("clientes", null, valores); Log.v("db.insert", Arrays.toString(Thread.currentThread().getStackTrace()));
                   
                   
                    Toast.makeText(this, "Cliente guardado con exito", Toast.LENGTH_LONG).show();
                   
                    txvRasociclie.setText("");
                    txvDireccclie.setText("");
                    txvCelulaclie.setText("");
                    txvTelefoclie.setText("");
                    txvE_mailclie.setText("");
                    txvConivaclie.setText("CONSUMIDOR FINAL");
                    txvPridosclie.setText("");
                    txvSegochclie.setText("");
                    txvUltunoclie.setText("");
                   
                } catch (Exception e) {
                    e.printStackTrace();
                   
                    Toast.makeText(this, "No se pudo guadar cliente", Toast.LENGTH_LONG).show();
                }
                db.close();  
            }
        }
    }
   
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent vercondivacliente) {
        if ((requestCode == request_code) && (resultCode == RESULT_OK)){
           
            // instancio el objeto que se asocia a la caja de condicion de iva de la pantalla
            txvConivaclie = (EditText) findViewById (R.id.txfconivaclie);
           
            // le asigno a la caja de texto destino el valor de la variable
            txvConivaclie.setText(vercondivacliente.getStringExtra("LcConivaclie"));

        }
    }
}


los registros duplicados no se dan siempre y se me esta haciendo dificil encontrar el problema ya que por el log no me salio ninguna vez una llamada del mismo insert. Gracias
Para anular la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a desarrolladores-android+unsub...@googlegroups.com.

Para publicar en este grupo, envía un correo electrónico a desarrollad...@googlegroups.com.
Visita este grupo en http://groups.google.com/group/desarrolladores-android.
Reply all
Reply to author
Forward
0 new messages