Android 事务还是触发器?

发布于 2024-10-30 05:36:44 字数 1379 浏览 0 评论 0原文

我正在开发一个燃料使用应用程序,该应用程序将在 Android 1.6 及以上版本上运行。 v1.6 上捆绑的 SQLite 不执行外键,因此我必须手动处理它。到目前为止,我已经使用 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 am working on a fuel use application which will run on Android 1.6 onwards. The bundled SQLite on v1.6 doesn't do foreign keys, so I've had to handle it manually. So far, I have done this using an Android transaction:

    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. fuel data cannot be entered unless there is a matching vehicle registration number in the database.

My question is, is there a better way to do this? I'm not a database expert, but I know you can set up triggers to enforce rules - are triggers more suited to handle constraints?

Cheers,
Barry

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

等你爱我 2024-11-06 05:36:44

触发器可以很好地解决这个问题。

事实上,有一种自动方式来生成模拟外键的触发器。 SQLite for PC 提供了一个名为“genfkey”的实用程序,它可以检查使用外键的现有数据库并输出相应的触发器。

Triggers would be a good solution to this problem.

In fact there is an automated way to generate triggers for simulating foreign keys. SQLite for PC provides a utility called "genfkey" which can examine an existing database which uses foreign keys and outputs the corresponding triggers.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文