【问题标题】:How to process columns of an SQLite table in Java android?如何在 Java android 中处理 SQLite 表的列?
【发布时间】:2014-05-30 11:25:30
【问题描述】:

我有一个类似的 SQLite 表:

+---+-------------+----------------+
|_id| lap_time_ms |formatted_elapse|
+---+-------------+----------------+
| 1 |  5600       | 00:05.6        |
| 2 |  4612       | 00:04.6        |
| 3 |  4123       | 00:04.1        |
| 4 |  15033      | 00:15.0        |
| 5 |  4523       | 00:04.5        |
| 6 |  6246       | 00:06.2        |

其中 lap_time_ms 是 long 类型,表示一圈的时间量(以毫秒为单位),而 formatter_elapse 是一个字符串,表示第一列(elapse)的格式化(可显示)形式。

我的问题是,如果我想为每个 lap_time_ms 添加(比如说)5 秒 (5000),那么我使用如下语句:

DB.execSQL("update table_name set KEY_ELAPSE=KEY_ELAPSE+5000);

这很好,但是问题是 formatted_elapse 仍然保留其过时的值!

那么,如果我有如下函数,那么更新 formatted_elapse 列中的值的最佳方法是:

public static String getFormattedTime(long milliseconds) {
    // custom code that processes the long
    return processedString;
}

这可能是一个 镜头(当然是比喻性的说法;)但是是否可以让 SQLite 链接两列,这样如果我更新 lap_time_ms 行,formatted_elapse 将自动更新适当的。

提前致谢!

【问题讨论】:

    标签: java android sqlite sql-update


    【解决方案1】:

    理论上,可以创建a trigger 来更新该列,但前提是可以使用一些built-in SQLite function 进行格式化(Android 不允许用户定义函数):

    CREATE TRIGGER update_formatted_elapse
    AFTER UPDATE OF lap_time_ms ON MyTable
    FOR EACH ROW
    BEGIN
        UPDATE MyTable
        SET formatted_elapse = strftime('%M:%f', NEW.lap_time_ms, 'unixepoch')
        WHERE _id = NEW._id;
    END;
    

    但是,将格式化的字符串存储在数据库中是一个糟糕的设计;这将是重复的信息,有变得不一致的危险。

    删除formatted_elapse 列,只需在需要时在代码中调用getFormattedTime

    【讨论】:

    • 太棒了!我不知道 SQLite 触发器!我想到保留字符串是一个可能的漏洞,但我认为不保留它可能意味着性能问题,因为与它关联的 ListView 必须在用户滚动浏览它时不断格式化它。然而,这是一个很小的代价。谢谢!
    猜你喜欢
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 2017-07-22
    • 2017-01-14
    • 2015-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多