sql >> Base de Datos >  >> RDS >> SQLite

Insertar varias filas en SQLite Error (código de error =1)

Insertar varias filas en el error de SQLite

Realmente no me gusta tu enfoque. Es tan duro y parece un código de espagueti. Y su enfoque nunca funcionará porque una inserción solo puede tener un valor . Así que lo estás haciendo incorrectamente. ¿Qué hay de usar API insert()? método que diseñó directamente para insertar?

También desde el punto de vista del rendimiento de la velocidad y la seguridad, le recomiendo que use TRANSACTION así como. Pero vamos a escribir algo de código especialmente para ti.

public void insertMultiple(List<Contact> contacts) {
    Contact c = null;
    ContentValues values = new ContentValues();
    try {
        if (db != null) {
            db.beginTransaction();
            for (Contact c: contacts) {
                values.put(SQLConstants.FIRSTNAME, c.getFirstName());
                values.put(SQLConstants.LASTNAME, c.getLastName());
                ...
                db.insertOrThrow("Contacts", SQLConstants.FIRSTNAME, values);
                values.clear();
            }
            db.setTransactionSuccessful();
        }
    }
    finally {
        if (db != null && db.inTransaction()) {
            db.endTransaction();
        }
    }
}

Notas:

Como noté, tienes una tabla llamada Consacts así que le sugiero que cree su propio contacto de objeto eso representará su tabla en la capa de aplicación donde las propiedades del objeto son iguales a las columnas en la tabla. Te recomiendo que utilices este enfoque porque:

  • No es código spagetthi
  • Es bastante más rápido
  • Es mucho más seguro

Algunas sugerencias al final:

execSQL() no está mal, pero generalmente lo uso solo cuando creo SQLiteOpenHelper subclase para crear, eliminar y modificar tablas. Hay un uso es bastante adecuado. Pero como recomendaciones principales para ti están:

  • Cada vez que está insertando, actualizando, eliminando un uso de transacción siempre es una muy buena práctica, porque excepto el aumento del rendimiento de la velocidad (especialmente si está insertando una gran cantidad de filas) su trabajo con la base de datos es mucho más seguro.

Solo para información: Hice algunas pruebas cuando inserté 1000, 10 000, 100 000 filas en SQLite y puedo decirte que insertar 100 000 filas tomó solo 55 346 segundos. La inserción de 1000 filas sin transacción tomó incluso 73 398 segundos.

  • Cada vez que selecciona, inserta o actualiza desde una o más tablas, use marcadores de posición es decir, declaraciones parametrizadas y no codificadas. Con él, sus consultas serán más seguras, más rápidas y más legibles por humanos. En el caso de unirse, utilice siempre la cláusula de unión. Es mejor que puedas elegir.

Actualizar:

Aquí está trabajando su código:

insert into Contacts(ID, FirstName, LastName, PhoneNumber, EmailId, Status) 
select 'someId' as ID, 'xxx' as FirstName, 'xxx' as LastName , '9008987887' as PhoneNumber , '[email protected]' as EmaiId, 'Yes' as Status
union all select 'someId', 'xxx', 'xxx', '9008987887', '[email protected]', 'Yes'
union all select 'someId', 'xxx', 'xxx', '9008987887', '[email protected]', 'Yes'

Actualización 2:

Como señaló @Korniltsev Anatoly en SQLite, existe una restricción SQLITE_MAX_COMPOUND_SELECT eso significa que no puede usar más de 500 uniones a la vez.