Solo quiero una notificación después de que toda la inserción masiva se realice en la base de datos. Proporcione un ejemplo para usar la función bulkInsert(). No puedo encontrar un ejemplo adecuado en internet. ¡¡¡¡Por favor ayuda!!!!¿Cómo se usa la función bulkInsert() en android?
Respuesta
Esto es bulkInsert using ContentProvider.
public int bulkInsert(Uri uri, ContentValues[] values){
int numInserted = 0;
String table;
int uriType = sURIMatcher.match(uri);
switch (uriType) {
case PEOPLE:
table = TABLE_PEOPLE;
break;
}
SQLiteDatabase sqlDB = database.getWritableDatabase();
sqlDB.beginTransaction();
try {
for (ContentValues cv : values) {
long newID = sqlDB.insertOrThrow(table, null, cv);
if (newID <= 0) {
throw new SQLException("Failed to insert row into " + uri);
}
}
sqlDB.setTransactionSuccessful();
getContext().getContentResolver().notifyChange(uri, null);
numInserted = values.length;
} finally {
sqlDB.endTransaction();
}
return numInserted;
}
Llámalo solo una vez cuando tengas más ContentValues en ContentValues [] values array.
He buscado por siempre para encontrar un tutorial para implementar esto en el lado de la actividad y el lado del proveedor de contenido. Utilicé la respuesta de "Warlock" desde arriba y funcionó muy bien en el lado del proveedor de contenido. Utilicé la respuesta de this post para preparar la matriz ContentValues en el extremo de la actividad. También modifiqué mis valores de contenido para recibir de una cadena de valores separados por comas (o nuevas líneas, puntos, punto y coma). ¿Qué era la siguiente:
ContentValues[] bulkToInsert;
List<ContentValues>mValueList = new ArrayList<ContentValues>();
String regexp = "[,;.\\n]+"; // delimiters without space or tab
//String regexp = "[\\s,;.\\n\\t]+"; // delimiters with space and tab
List<String> splitStrings = Arrays.asList(stringToSplit.split(regexp));
for (String temp : splitStrings) {
Log.d("current student name being put: ", temp);
ContentValues mNewValues = new ContentValues();
mNewValues.put(Contract.KEY_STUDENT_NAME, temp);
mNewValues.put(Contract.KEY_GROUP_ID, group_id);
mValueList.add(mNewValues);
}
bulkToInsert = new ContentValues[mValueList.size()];
mValueList.toArray(bulkToInsert);
getActivity().getContentResolver().bulkInsert(Contract.STUDENTS_CONTENT_URI, bulkToInsert);
no pude encontrar una forma más limpia para unir la cadena de división trazada directamente a la matriz ContentValues para bulkInsert. Pero esto funciona hasta que lo encuentre.
Pruebe este enfoque.
public int bulkInsert(@NonNull Uri uri, @NonNull ContentValues[] values) {
final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
switch (sUriMatcher.match(uri)) {
case CODE_WEATHER:
db.beginTransaction();
int rowsInserted = 0;
try {
for (ContentValues value : values) {
long _id = db.insert(WeatherContract.WeatherEntry.TABLE_NAME, null, value);
if (_id != -1) {
rowsInserted++;
}
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();
}
if (rowsInserted > 0) {
getContext().getContentResolver().notifyChange(uri, null);
}
return rowsInserted;
default:
return super.bulkInsert(uri, values);
}
}
La respuesta de Warlock inserta todas o ninguna fila. Además, realice tareas mínimas entre setTransactionSuccessful()
y endTransaction()
y, por supuesto, no hay operaciones de base de datos entre estas dos llamadas a funciones.
Fuente de código: Udacity
- 1. Android cuando usar ContentResolver applyBatch o BulkInsert
- 2. ¿Cómo se usa Rundll32 para ejecutar la función DLL?
- 3. ¿Cómo se usa la Biblioteca de Facturación de Android?
- 4. C++ usa la función desnuda
- 5. ¿Cómo se usa find_module?
- 6. ¿Cómo se usa google calendar api en android?
- 7. ¿Cómo se usa gdb?
- 8. ¿Cómo se usa Dictionary (como iphone NSDictionary) en android?
- 9. ¿Qué es sharedUserId en Android y cómo se usa?
- 10. ¿Cómo se usa paramiko.RSAKey.from_private_key()?
- 11. ¿Cómo se usa/se refiere a la negación de una función booleana en Scala?
- 12. la función de devolución de llamada no funciona cuando se usa la función getJSON en jQuery
- 13. ¿para qué se usa realmente la función fwidth glsl?
- 14. ¿Cómo se usa `to_sql` en AREL cuando se usa` average() `?
- 15. ¿Cómo se usa la recompilación dinámica?
- 16. ¿Cómo se usa GetProcessMemoryInfo en C++?
- 17. ¿Por qué se usa "cuándo" en esta función?
- 18. ¿Cómo se usa TTStyledTextLabel?
- 19. ¿Cómo se usa CTEST_CUSTOM_PRE_TEST?
- 20. ¿Cómo se usa #define?
- 21. ¿Cómo se usa PowerShell?
- 22. ¿Cómo se usa NSDecimalNumber?
- 23. ¿Cómo se usa Resources.getFraction()?
- 24. ¿cómo se usa IME?
- 25. ¿Cómo se usa la función XPath en una instancia de XPathExpression mediante programación?
- 26. C++: ¿Cómo se usa el tipo en la función de plantilla para bifurcar?
- 27. mso - cómo se usa
- 28. ¿Cómo se usa Squeak?
- 29. ¿Cómo se mapea la memoria cuando se usa la horquilla?
- 30. ¿Cómo se usa AsyncTask para mostrar un ProgressDialog mientras se trabaja en segundo plano en Android?
Esto * no * terminará las inserciones restantes si una falla, ¿verdad? – Anthony
Esto revertirá/revertirá cada inserción individual si hay alguna excepción antes de llamar a setTransactionSuccessful en ese bloque try/catch. En resumen, si hay una excepción, no recibirá ninguna inserción. – Warlock
Me salió un error al decir que 'Variable' tabla 'puede no haberse inicializado'. Establecer la declaración a 'String table =" ";' resolvió el problema. –