2016-12-01 11 views
-1

SQLiteのアップグレード中にトランザクションが失敗した場合、ドロップテーブルは何も実行していません。ドロップSQLは例外をスローしません。Android SQLite - アップグレード中にトランザクションが失敗した後のドロップテーブル

私はこれを動作させるための唯一の方法は、トランザクションの処理をすべて削除することですが、アップグレード中に何が問題になったのかを分析するためにデータベースを変更しないようにします。

private void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){ 
    try { 
     db.beginTransaction(); 
     // Exception occurs here 
     db.setTransactionSuccessful(); 
     db.endTransaction(); 
    }catch(Exception e){ 
     db.endTransaction(); // Transaction is unsuccessful and changes rolled back 
     // Save for analyses 
     db.execSQL("DROP TABLE ..."); // Drop table does nothing 
    } 
} 

答えて

0

onUpgradeは既にトランザクションブロックにあります。 (トランザクションが終了したにもかかわらず、トランザクションが終了しませんでしたが)これを動作させるには:

// Path to db on local storage 
private String mDbToUpload = null; 

@Override 
private void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion){ 
    try { 
     // Exception occurs here 
    }catch(Exception e){ 
     db.endTransaction(); // End transaction to rollback changes 
     mDbToUpload = ...// Save db to local storage 
    } 
} 

@Override 
private void onOpen(SQLiteDatabase db){ 
    if(mDbToUpload != null){ 
    ... // Upload db from path 
    mDbToUpload = null; 
    } 
} 
0

endtransactionを呼び出した後、ドロップテーブルクエリが実行されています。注文を確認してください。それが理由かもしれません。

+0

トランザクションからの変更がロールバックされるように、終了トランザクション後に実行する必要があります。 – Ryan

+0

エンドトランザクションはロールバックを行います。右? –

+0

最終的に完全なテーブルを削除したときに変更がロールバックされるのはなぜですか? – Nitesh

0
それが execSQL()ある場合は、 insertOrThrow()を使用し、挿入を使用している場合、あなたは、すべての例外をキャッチします Exception eを期待しないでください、例外 SQLExceptionをキャッチする必要があり、beingTransactionとENDTRANSACTIONの間にあるコードの種類

..

+1

これは単なるコード例です。トランザクションがロールバックされ、テーブルが削除されただけで何が例外になるのかは関係ありません。いずれにしても、これは例外ではないため、SQLExceptionはExceptionから導出されます。https://docs.oracle.com/javase/7/docs/api/java/sql/SQLException.html – Ryan

1

SQLiteOpenHelperonUpgrade()などのライフサイクルメソッドがトランザクション内で実行されます。 sqliteはネストされたトランザクションをサポートしておらず、AndroidのSQLiteDatabaseは参照カウントでネストされたトランザクションのみをエミュレートしますが、このようなエミュレートされたネストされたトランザクションは実際は実際のトランザクションではありません。

ライフサイクルメソッドで問題が発生した場合は、例外をスローすると、フレームワークは一番外側の実際のトランザクションをロールバックします。

+0

パーフェクト!これは私が探していたものです。 https://developer.android.com/reference/android/database/sqlite/SQLiteOpenHelper.html#onUpgrade(android.database.sqlite.SQLiteDatabase、int、int) 特定の部分を実行する方法はわかりますかアップグレード後のコードは失敗しましたか? – Ryan

+0

'onUpgrade() 'で例外をキャッチして再発行することができます – laalto

+0

これは、' getWriteableDatabase'が呼び出されたときに例外をキャッチすることを意味します。 – Ryan

関連する問題