Transacción de la base de datos Android
He creado una base de datos. Quiero hacer la transacción. SaveCustomer()
contiene más de una instrucción para insertar registros en Customer, CustomerControl, Profile, Payment
tabla de Customer, CustomerControl, Profile, Payment
en ese momento.
Cuando un usuario llama SaveCustomer()
método SaveCustomer()
entonces esos datos irán a estas 4 tablas.so ¿Cómo puedo realizar la transacción? Si los insertos de una tabla fallaron, entonces necesitas revertir todo. Por ejemplo, cuando la 3ra tabla inserta el expediente conseguí un error, después necesito rodar los expedientes del pedazo de la tabla anterior dos también.
- Fragmento Transacciones con transición - Los nombres de transición únicos son necesarios
- Ormlite Android inserciones masivas
- Administrador de paquetes de Android ha muerto con TransactionTooLargeException
- ¿Cómo obtengo el mejor rendimiento con SQLite en Android?
- ¿Está bien actualizar fragmentos en lugar de crear nuevas instancias?
Vea mi código:
public void saveCustomer(){ DBAdapter dbAdapter = DBAdapter.getDBAdapterInstance(RetailerOrderKeyActivity.this); dbAdapter.openDataBase(); ContentValues initialValues = new ContentValues(); initialValues.put("CustomerName",customer.getName()); initialValues.put("Address",customer.getAddress()); initialValues.put("CustomerPID",strPID); initialValues.put("Date",strDateOnly); long n = dbAdapter.insertRecordsInDB("Customer", null, initialValues); }
Del mismo modo otra declaración también allí.
El código DBAdpter es:
public long insertRecordsInDB(String tableName, String nullColumnHack,ContentValues initialValues) { long n =-1; try { myDataBase.beginTransaction(); n = myDataBase.insert(tableName, nullColumnHack, initialValues); myDataBase.endTransaction(); myDataBase.setTransactionSuccessful(); } catch (Exception e) { // how to do the rollback e.printStackTrace(); } return n; }
Este es el código completo:
public class DBAdapter extends SQLiteOpenHelper { private static String DB_PATH = "/data/data/com.my.controller/databases/"; private static final String DB_NAME = "customer"; private SQLiteDatabase myDataBase; private final Context myContext; private static DBAdapter mDBConnection; private DBAdapter(Context context) { super(context, DB_NAME, null, 1); this.myContext = context; DB_PATH = "/data/data/" + context.getApplicationContext().getPackageName() + "/databases/"; // The Android's default system path of your application database is // "/data/data/mypackagename/databases/" } public static synchronized DBAdapter getDBAdapterInstance(Context context) { if (mDBConnection == null) { mDBConnection = new DBAdapter(context); } return mDBConnection; } public void createDataBase() throws IOException { boolean dbExist = checkDataBase(); if (dbExist) { // do nothing - database already exist } else { // By calling following method // 1) an empty database will be created into the default system path of your application // 2) than we overwrite that database with our database. this.getReadableDatabase(); try { copyDataBase(); } catch (IOException e) { throw new Error("Error copying database"); } } } private boolean checkDataBase() { SQLiteDatabase checkDB = null; try { String myPath = DB_PATH + DB_NAME; checkDB = SQLiteDatabase.openDatabase(myPath, null,SQLiteDatabase.OPEN_READONLY); } catch (SQLiteException e) { // database does't exist yet. } if (checkDB != null) { checkDB.close(); } return checkDB != null ? true : false; } private void copyDataBase() throws IOException { InputStream myInput = myContext.getAssets().open(DB_NAME); String outFileName = DB_PATH + DB_NAME; OutputStream myOutput = new FileOutputStream(outFileName); byte[] buffer = new byte[1024]; int length; while ((length = myInput.read(buffer)) > 0) { myOutput.write(buffer, 0, length); } // Close the streams myOutput.flush(); myOutput.close(); myInput.close(); } /** * Open the database * @throws SQLException */ public void openDataBase() throws SQLException { String myPath = DB_PATH + DB_NAME; myDataBase = SQLiteDatabase.openDatabase(myPath, null, SQLiteDatabase.OPEN_READWRITE); } @Override public synchronized void close() { if (myDataBase != null) myDataBase.close(); super.close(); } /** * Call on creating data base for example for creating tables at run time */ @Override public void onCreate(SQLiteDatabase db) { } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("ALTER TABLE WMPalmUploadControl ADD Testing int"); } public void upgradeDb(){ onUpgrade(myDataBase, 1, 2); } public Cursor selectRecordsFromDB(String tableName, String[] tableColumns, String whereClase, String whereArgs[], String groupBy, String having, String orderBy) { return myDataBase.query(tableName, tableColumns, whereClase, whereArgs, groupBy, having, orderBy); } public ArrayList<ArrayList<String>> selectRecordsFromDBList(String tableName, String[] tableColumns, String whereClase, String whereArgs[], String groupBy, String having, String orderBy) { ArrayList<ArrayList<String>> retList = new ArrayList<ArrayList<String>>(); ArrayList<String> list = new ArrayList<String>(); Cursor cursor = myDataBase.query(tableName, tableColumns, whereClase, whereArgs, groupBy, having, orderBy); if (cursor.moveToFirst()) { do { list = new ArrayList<String>(); for(int i=0; i<cursor.getColumnCount(); i++){ list.add( cursor.getString(i) ); } retList.add(list); } while (cursor.moveToNext()); } if (cursor != null && !cursor.isClosed()) { cursor.close(); } return retList; } public long insertRecordsInDB(String tableName, String nullColumnHack,ContentValues initialValues) { long n =-1; try { myDataBase.beginTransaction(); n = myDataBase.insert(tableName, nullColumnHack, initialValues); myDataBase.endTransaction(); myDataBase.setTransactionSuccessful(); } catch (Exception e) { // how to do the rollback e.printStackTrace(); } return n; } public boolean updateRecordInDB(String tableName, ContentValues initialValues, String whereClause, String whereArgs[]) { return myDataBase.update(tableName, initialValues, whereClause, whereArgs) > 0; } public int updateRecordsInDB(String tableName, ContentValues initialValues, String whereClause, String whereArgs[]) { return myDataBase.update(tableName, initialValues, whereClause, whereArgs); } public int deleteRecordInDB(String tableName, String whereClause, String[] whereArgs) { return myDataBase.delete(tableName, whereClause, whereArgs); } public Cursor selectRecordsFromDB(String query, String[] selectionArgs) { return myDataBase.rawQuery(query, selectionArgs); } public ArrayList<ArrayList<String>> selectRecordsFromDBList(String query, String[] selectionArgs) { ArrayList<ArrayList<String>> retList = new ArrayList<ArrayList<String>>(); ArrayList<String> list = new ArrayList<String>(); Cursor cursor = myDataBase.rawQuery(query, selectionArgs); if (cursor.moveToFirst()) { do { list = new ArrayList<String>(); for(int i=0; i<cursor.getColumnCount(); i++){ list.add( cursor.getString(i) ); } retList.add(list); } while (cursor.moveToNext()); } if (cursor != null && !cursor.isClosed()) { cursor.close(); } return retList; } }
Problema de bloqueo de la base de datos en HTC Desire .
Quiero retroceder si se producen problemas al insertar los datos de la tabla.
por favor, ayúdame
Gracias.
Miré esta misma pregunta relacionada:
- BeginTransaction (), endTransaction () y setTransactionSuccessful (). ¿Qué hacen exactamente?
- Fragmento no se muestra cuando el método add () se llama
- ormlite para android: ayuda de diseño y más
- SQLiteDatabase transacción anidada y solución alternativa
- Borrar backstack y reemplazar fragmento actual con un fragmento de nivel superior
- Fragmento de duplicación en la transacción de fragmentos
- ¿El yieldIfContendedSafely () pierde los beneficios de una transacción?
- La transacción de Sqlite bloquea Android ui
En realidad usted está haciendo mal. Debe establecer iniciar transacción si tiene varios registros para insertar en base de datos o si tiene que anular datos de otra tabla si hay un problema en insertar datos en una de la tabla de base de datos.
Por ejemplo
Tienes dos mesas
- UN
- segundo
Ahora desea insertar datos en estas dos tablas pero tendrá que revertir la transacción si obtiene cualquier error en el momento de insertar los datos en las tablas.
Ahora usted ha insertado con éxito los datos en la tabla A y ahora está intentando insertar datos en la tabla B. Ahora si usted consigue error en el momento de insertar datos en la tabla B entonces usted tiene que suprimir datos relevantes de la tabla A que significa usted Tiene que revertir la transacción.
Cómo se puede utilizar la transacción de base de datos en Android
- Si desea iniciar la transacción hay un método
beginTransaction()
- Si desea confirmar la transacción hay un método
setTransactionSuccessful()
quesetTransactionSuccessful()
los valores en la base de datos - Si había iniciado la transacción, debe cerrar la transacción para que haya un método
endTransaction()
que finalizará la transacción de la base de datos
Ahora hay dos puntos principales
- Si desea establecer la transacción con éxito necesita escribir
setTransactionSuccessful()
y luegoendTransaction()
después debeginTransaction()
- Si desea revertir la transacción, necesita
endTransaction()
sin comprometer la transacción porsetTransactionSuccessful()
.
Puede obtener información detallada sobre la transacción de la base de datos SQLite desde aquí
En tu caso
Puede llamar a su función saveCustomer()
en try and catch blocks
db.beginTransaction(); try { saveCustomer(); db.setTransactionSuccessful(); } catch { //Error in between database transaction } finally { db.endTransaction(); }
Usted debe agregar endTransaction
en su finally
, no en su bloque try
finally { myDataBase.endTransaction(); }
Los cambios se revertirán si se termina cualquier transacción sin estar marcada como limpia (llamando a setTransactionSuccessful). De lo contrario, se comprometerán.
Insertar registro mediante transacción, esto es muy rápido
String sql = "INSERT INTO table (col1, col2) VALUES (?, ?)"; db.beginTransaction(); SQLiteStatement stmt = db.compileStatement(sql); for (int i = 0; i < values.size(); i++) { stmt.bindString(1, values.get(i).col1); stmt.bindString(2, values.get(i).col2); stmt.execute(); stmt.clearBindings(); } db.setTransactionSuccessful(); db.endTransaction();
- Android AlarmManager – RTC_WAKEUP vs ELAPSED_REALTIME_WAKEUP
- Android LinearLayout: Añadir borde con sombra alrededor de un linearLayout