2011-04-02 94 views
2

我正在開發Android 1.6以上的燃料使用應用程序。捆綁在v1.6上的SQLite不會執行外鍵,所以我不得不手動處理它。到目前爲止,我已經使用Android交易完成了這項工作:Android事務或觸發器?

public static long addFuelUp(String registrationNumber, String date) 
{ 
    SQLiteDatabase db = uKMpgData.getReadableDatabase(); 
    long result = -1; 
    ContentValues values = new ContentValues(); 
    Cursor vehicleCursor = VehicleDataProvider.getVehicle(registrationNumber); 

    if(vehicleCursor.moveToNext()) 
    { 
     Cursor fuelUpsCursor = getFuelUps(registrationNumber, date); 
     if(!fuelUpsCursor.moveToNext()) 
     { 
      db.beginTransaction(); 
      try 
      { 
        values.put(REGISTRATION_NO_COLUMN, registrationNumber.replace(" ", "")); 
        values.put(DATE_TIME_COLUMN, date); 
        result = db.insertOrThrow(FUEL_USE_TABLE_NAME, null, values); 
        db.setTransactionSuccessful(); 
      } 
      catch(SQLException e) 
      { 
       Log.d("addFuelUp", e.getMessage()); 
      } 
      finally 
      { 
       db.endTransaction(); 
       vehicleCursor.close(); 
       fuelUpsCursor.close(); 
      } 
     } 
    } 
    return result; 
} 

I.e.除非數據庫中有匹配的車輛註冊號碼,否則不能輸入燃料數據。

我的問題是,有沒有更好的方法來做到這一點?我不是數據庫專家,但我知道你可以設置觸發器來執行規則 - 觸發器是否更適合處理約束?

乾杯, 巴里

回答

0

觸發器將是一個很好的解決這個問題。

事實上,有一種自動生成模擬外鍵的觸發器的方法。用於PC的SQLite提供了一個名爲「genfkey」的實用程序,它可以檢查使用外鍵的現有數據庫並輸出相應的觸發器。