2011-08-02 12 views
12

私はデータベースsynをやっています。 sqliteとsqliteの間でデータをダウンロードしています。sqliteでレコードを更新/挿入しているときには、インターネット接続が遅くなったり、ロールバックしたりする必要があります。Android sqliteロールバック

public void insertTableRecords(String strTableName, String[] strToFields, String[] strValues){ 
    DBAdapter dbAdapter = DBAdapter.getDBAdapterInstance(DownlaodTableActivity.this); 
    dbAdapter.openDataBase(); 
    ContentValues initialValues = new ContentValues(); 
    for(int i=0 ;i<strToFields.length;i++){ 
     initialValues.put(strToFields[i],strValues[i]); 
    } 
    long n = dbAdapter.insertRecordsInDB(strTableName, null, initialValues); 
    System.out.println(" -- inserted status : --- " + n); 
} 

私を助けてください。

事前に感謝しますが...

答えて

0

この挿入は、変数をチェックすることによって、一つだけtable.Soを達成されたnあなたはデータが挿入されているかnot.Thereがit.Noの間に何もないかどうかを見つけることができますが、ここで任意のトランザクションを必要としています。

0

追加した行をロールバックすることを意味する場合は、これはむしろ簡単です...追加された各行にTIMESTAMPを追加し、その値をSystem.currentTimeMillis()に設定することができます。最初にSystem.currentTimeMillis()を保存し、ロールバックする場合は、DELETEテーブルから保存するタイムスタンプの後にすべての行を追加できますあなたのプログラムあなたが1行全体を持った後、あなただけのテーブルを更新しているようだ


は...ここに電話がまだネットワークに接続されているかどうかを判断するのに役立ちますコードであり、それに応じて、次のことができます行の検索を継続するかどうかを指定します。


manifest

チェック接続されており、ここでは(デシベルは、以下でSQLiteDatabaseインスタンスである)のSQLiteでトランザクションを使用しての簡単な例だ

ConnectivityManager conManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); 
NetworkInfo networkInfo = conManager.getActiveNetworkInfo(); 
if(networkInfo.isConnected()){ 
    //YOUR CODE 
} 

38

を続けた場合:

try { 
    db.beginTransaction(); 
    // your sql stuff 
    db.setTransactionSuccessful(); 
} catch(SQLException e) { 
    // do some error handling 
} finally { 
    db.endTransaction(); 
} 

「//あなたのSQLのもの」をスローと例外に置き換える方法を選択することが重要です。 insertOrThrow()を使用するか、より柔軟なSQLiteStatementインスタンスが必要な場合(それらの.executeメソッドは常にエラー時に例外をスローします)。

ロールバックを明示的に行う必要はありません。 .setTransactionSuccessful()を指定せずにdb.endTransaction()を呼び出すと、自動的にロールバックされます。

ちょうどネットワークタイムアウトの例外をキャッチし、あなたの最後のSQLException投げる方法:)あなたは簡単に別のcatchブロックでこれを拡張することができ

後setTransactionSuccessfulを置くことを常に覚えています。