2016-03-22 9 views
1

オートインクリメントを使ってテーブルにレコードを挿入するという奇妙な状況が起こっています。ここでトランザクションが成功した後にSQLiteが値を記録しない

はテーブルです:

String CREATE_TABLE_ROUTES = "CREATE TABLE " + TABLE_ROUTES + 
       "(" + 
       PK_ROUTE_ID + " INTEGER PRIMARY KEY AUTOINCREMENT," + 
       FK_ROUTE_TRACK_ID + " INTEGER," + 
       COL_ROUTE_ORDER + " INTEGER(11)," + 
       COL_ROUTE_LAT + " FLOAT," + 
       COL_ROUTE_LONG + " FLOAT," + 
       COL_ROUTE_TIME + " FLOAT," + 
       COL_ROUTE_SPEED + " FLOAT," + 
       COL_ROUTE_TIME_MS + " INTEGER(3)" + 
       ")"; 

これは動作していない私のinsertメソッドです:

それをDebbuging
public void updateRoute(LatLongTime latLongTime, long track_id) { 

     long route_id = -2; 
     SQLiteDatabase db = getWritableDatabase(); 

     db.beginTransaction(); 

     try { 

      ContentValues values = new ContentValues(); 
      values.put(FK_ROUTE_TRACK_ID, track_id); 
      values.put(COL_ROUTE_ORDER, getLastOrderForTrack(track_id) + 1); 
      values.put(COL_ROUTE_LAT, latLongTime.getLatitude()); 
      values.put(COL_ROUTE_LONG, latLongTime.getLongitude()); 
      values.put(COL_ROUTE_SPEED, latLongTime.getSpeed()); 
      values.put(COL_ROUTE_TIME, latLongTime.getInstante()); 

      route_id = db.insert(TABLE_ROUTES, null, values); 

      db.setTransactionSuccessful(); 

     } catch (Exception e) { 
      Log.e(TAG, "ERROR Recording: " + e.getMessage()); 
     } finally { 
      Log.d(TAG, "Route inserted: " + route_id + " track id: " + track_id); 
      db.endTransaction(); 
      db.close(); 
     } 
    } 

私は成功したトランザクションを得たが、このメソッドが再び呼び出された後、同じroute_idが挿入メソッドによって生成されます。 コード実行後に何も記録されません(例外はありません)。

これは私がデバッグでは、いくつかの時間、この関数を呼び出すときに私が得るものです:

D /データベース:ルートが挿入された:9362トラック:103
D /データベース:ルートが挿入された:9362トラック:103
D /データベース:ルートが挿入された:9362トラック:103

私が最も奇妙見つける何が、私は、CTRL + U(Androidのメーカー)を使用し、分離したスレッドでそれをdebbug場合、この機能が正常に動作し始めるということです期待どおりにroute_idを増加させます。ただし、この手順のデバッグと繰り返しのみ:

db.beginTransaction();

try { 

     ContentValues values = new ContentValues(); 
     values.put(FK_ROUTE_TRACK_ID, track_id); 
     values.put(COL_ROUTE_ORDER, getLastOrderForTrack(track_id) + 1); 
     values.put(COL_ROUTE_LAT, latLongTime.getLatitude()); 
     values.put(COL_ROUTE_LONG, latLongTime.getLongitude()); 
     values.put(COL_ROUTE_SPEED, latLongTime.getSpeed()); 
     values.put(COL_ROUTE_TIME, latLongTime.getInstante()); 

     route_id = db.insert(TABLE_ROUTES, null, values); 

答えて

0

まあ、私はそれを理解しました。 私が(私は20の以上のメソッドを持っている)すべてのメソッドに同じ名前(デシベル)で

SQLiteDatabase db = getWritableDatabase(); 

としてSQLiteDatabaseを、定義されたことが起こります。

名前をdbtに変更するなどして問題を解決すれば、これで問題なく動作します。

これはローカル変数であるため、メソッドの終了後に使用して破棄する必要がありますが、理由はわかりません。 問題を解決したために誰かが何らかの説明をすることができればうれしいですが、何が起こっているのかを推測しているだけで、理由がわからないのは分かりません。

関連する問題