BeginTransaction (), endTransaction () y setTransactionSuccessful (). ¿Qué hacen exactamente?
Tengo que proporcionar sincronización al insertar, consultar, actualizar y eliminar elementos de una base de datos. Por lo que entiendo beginTransaction()
y beginTransactionNonExclusive()
son los métodos que necesito.
Además la documentación de SQLite describe EXCLUSIVE
, IMMEDIATE
y DEFERRED
bastante bien.
- ¿Debo usar siempre transacciones en android sqlite?
- ¿Está bien actualizar fragmentos en lugar de crear nuevas instancias?
- Las inserciones de SQLite se vuelven más lentas incluso con transacciones
- Fragmento de duplicación en la transacción de fragmentos
- ¿Las transacciones SQLite con ContentOrter de Google IO REST?
Las transacciones pueden ser diferidas, inmediatas o exclusivas. Diferido significa que no se obtienen bloqueos en la base de datos hasta que se accede por primera vez a la base de datos.
Si la transacción es inmediata, los bloqueos RESERVED se obtienen en todas las bases de datos tan pronto como se ejecute el comando BEGIN, sin esperar a que se utilice la base de datos. Después de BEGIN IMMEDIATE, ninguna otra conexión de base de datos podrá escribir en la base de datos o realizar BEGIN IMMEDIATE o BEGIN EXCLUSIVE. Sin embargo, otros procesos pueden seguir leyendo desde la base de datos.
Una transacción exclusiva hace que los bloqueos EXCLUSIVE sean adquiridos en todas las bases de datos. Después de BEGIN EXCLUSIVE, ninguna otra conexión de base de datos excepto las conexiones read_uncommitted podrá leer la base de datos y ninguna otra conexión sin excepción podrá escribir la base de datos hasta que la transacción esté completa.
Parece proporcionar cierta protección contra inserciones no deseadas y consultas mientras que algún hilo está trabajando con la base de datos. Pero no estoy seguro de que garantice la sincronización.
Existe el método insert
de mi ContentProvider
.
@Override public Uri insert(Uri baseUri, ContentValues values) { try { mDatabase = mHelper.getWritableDatabase(); mDatabase.beginTransaction(); // EXCLUSIVE switch (sUriMatcher.match(baseUri)) { case UriCodes.COUNTRIES: case UriCodes.CONTINENTS: case UriCodes.ORGS: String table = baseUri.getLastPathSegment(); long rowId = mDatabase.insert(table, null, values); Uri uri = Uri.withAppendedPath(baseUri, Long.toString(rowId)); mDatabase.setTransactionSuccessful(); return uri; default: mDatabase.endTransaction(); throw new IllegalArgumentException(UNSUPPORTED_URI + SPACE + baseUri); } } finally { mDatabase.endTransaction(); } }
No he tenido ningún problema sin beginTransaction()
, endTransaction()
y setTransactionSuccessful()
antes. ¿Realmente necesito agregarlos?
- SQLiteDatabase transacción anidada y solución alternativa
- Administrador de paquetes de Android ha muerto con TransactionTooLargeException
- ormlite para android: ayuda de diseño y más
- Fragmento no se muestra cuando el método add () se llama
- Android: niveles de aislamiento de transacciones SQLite (ORMLite)
- Transacción de la base de datos Android
- Fragmento Transacciones con transición - Los nombres de transición únicos son necesarios
- Borrar backstack y reemplazar fragmento actual con un fragmento de nivel superior
¡Por supuesto con Android! Si está trabajando para una manipulación fiable de datos, es importante utilizar los siguientes métodos soportados.
BeginTransaction(); SetTransactionSuccessful(); EndTransaction();
Para ver más esto … En android es muy importante utilizar las transacciones cuando se trabaja con bases de datos.
Si, SQLite considera un cursor como una transacción, así que si usamos begin transaction () antes de insertar gran cantidad de datos, entonces use setTransactionSuccessful () second, then endTransaction () en finalmente, SQLite considerará esto Insertar evento como una transacción, en lugar de cientos de transacciones.
- Rendimiento de la serialización y Google Android
- Cómo obtener el marco de archivo de vídeo en android