Przykłady kodów transakcji Android SQLite, które widziałem, wydają się automatycznie wywoływać db.setTransactionSuccessful()
tuż przed db.endTransaction()
.Android - kiedy zadzwonić do db.setTransactionSuccessful()?
Zastanawiam się, czy to rzeczywiście najlepsza praktyka lub czy przed wybraniem numeru db.setTransactionSuccessful()
powinno nastąpić sprawdzenie warunkowe.
W moim przypadku, ja nadrzędnymi bulkInsert()
metodę ContentProvider
„s i jeśli mogę użyć czek warunkowego, jak opisano, moja metoda będzie wyglądać następująco ...
@Override
public int bulkInsert(Uri uri, ContentValues[] valuesArray) {
// Open a read/write database to support the transaction.
SQLiteDatabase db = dbHelper.getWritableDatabase();
switch (uriMatcher.match(uri)) {
case BRANDS_SEARCH:
int numInserts = 0;
db.beginTransaction();
for (int i = 0; i < valuesArray.length; i++) {
// Insert the values into the table
long rowId = db.insert(BRAND_NAMES_TABLE, null, valuesArray[i]);
if (rowId > -1) {
// Increment numInserts
numInserts++;
// Construct the URI of the newly inserted row.
Uri insertedId = ContentUris.withAppendedId(CONTENT_URI_BRANDS, rowId);
// Notify any observers of the change in the data set.
getContext().getContentResolver().notifyChange(insertedId, null);
}
}
boolean allInsertAttemptsWereSuccessful = (numInserts == valuesArray.length);
if (allInsertAttemptsWereSuccessful) {
db.setTransactionSuccessful(); //todo - should this be conditional?
}
else {
//todo - ???
}
db.endTransaction();
return numInserts;
default:
//break;
throw new IllegalArgumentException("Unsupported URI: " + uri);
}
}
... czy to jest prawidłowe podejście ?
A jakie działania należy podjąć w przypadku, gdy allInsertAttemptsWereSuccessful
== false
?
(Szukałem w Android docs, ale bardzo mało informacji jest przewidziane.)
Update - New Code ...
Dzięki laalto's answer, to moja nowa (poprawna) kod. ..
/**
* Attempts a bulk insert. Outcome will either be all inserts succeeded
* or all inserts failed.
*/
@Override
public int bulkInsert(Uri uri, ContentValues[] valuesArray) {
/*
* Open a read/write database to support the transaction.
*/
SQLiteDatabase db = dbHelper.getWritableDatabase();
switch (uriMatcher.match(uri)) {
case BRANDS_SEARCH:
/*
* Begin the transaction
*/
db.beginTransaction();
try {
for (int i = 0; i < valuesArray.length; i++) {
/*
* Insert the values into the table
*/
long rowId = db.insert(BRAND_NAMES_TABLE, null, valuesArray[i]);
if (rowId > -1) {
/*
* Construct the URI of the newly inserted row.
*/
Uri insertedId = ContentUris.withAppendedId(CONTENT_URI_BRANDS, rowId);
/*
* Notify any observers of the change in the data set.
*/
getContext().getContentResolver().notifyChange(insertedId, null);
}
else {
/*
* Give up (as we need all insert attempts to succeed)
*/
throw new Exception("Could not insert row");
}
}
/*
* All insert attempts succeeded
*/
db.setTransactionSuccessful();
return valuesArray.length;
}
catch(Exception e) {
/*
* If any insert attempt failed, then setTransactionSuccessful() will not be called so no rows will actually be inserted
*/
return 0;
}
finally {
/*
* Always end the transaction
*/
db.endTransaction();
}
default:
//break;
throw new IllegalArgumentException("Unsupported URI: " + uri);
}
}
Dzięki za wszystkie odpowiedzi. Laalto, zaktualizowałem swój kod (i dodałem go do mojego pytania) zgodnie z twoimi danymi wejściowymi. Twoje zdrowie. –