2011-04-02 120 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”的实用程序,它可以检查使用外键的现有数据库并输出相应的触发器。