【问题标题】:ORMLite (Android) - Removing UUID dashes before persistORMLite (Android) - 在持久化之前删除 UUID 破折号
【发布时间】:2017-08-23 12:43:15
【问题描述】:

我开始在我的 Android 应用程序中使用 ORMLite,它几乎在每个表中都使用 UUID 作为主键。

我已经做到了,因此我可以将数据导入和导出到我的服务器应用程序并确保没有重复。

问题是:我在服务器端编写代码来保存 UUID 不带破折号,因为这样可以节省一些空间。 (现在我发现这没什么大不了的,但是改变它会很耗时)。

阅读ORMLite doc,我发现了这个:

java.util.UUID 类作为 VARCHAR 类型持续存在。它将它保存为 uuid.toString() 并使用 UUID.fromString(String) 方法将其再次转换回来。您还可以将 UUID 字段标记为生成 ID,在这种情况下,无论何时插入它,都会调用 java.util.UUID.randomUUID() 并在该字段上设置。请参阅具有 generatedId 的字段部分。

toString 方法返回带有破折号的 UUID,我无法扩展 UUID,因为它是最终的。

我需要以某种方式覆盖 UUID.toString() 或 ORMLite 的 pre-save 和 post-query 方法来执行此操作:

public static String getStringUUID(UUID valor) {
    if (valor == null) {
        return null;
    }
    return valor.toString().replaceAll("-", "");
}

public static UUID getValorUUID(String valor) {
    if (valor == null) {
        return null;
    }
    return UUID.fromString(valor.replaceFirst("([0-9a-fA-F]{8})([0-9a-fA-F]{4})([0-9a-fA-F]{4})([0-9a-fA-F]{4})([0-9a-fA-F]+)", "$1-$2-$3-$4-$5"));
}

我怎样才能做到这一点?

PS:我使用的是 SQLite,列类型是 blob。服务端数据库为Mysql,列类型为binary(16)

【问题讨论】:

    标签: android uuid ormlite


    【解决方案1】:

    我需要以某种方式覆盖 UUID.toString() 或 ORMLite 的 pre-save 和 post-query 方法来执行此操作:

    执行此操作的正确方法(如果您无法修改数据)是使用custom-persister。您可以轻松扩展 UuidType 并更改 sqlArgToJava(...)javaToSqlArg(...) 方法以根据需要添加和删除破折号。

    然后你会做这样的事情:

    @DatabaseField(persisterClass = MyUuidPersister.class)
    private UUID uuid;
    

    你的持久化类是这样的:

    public MyUuidPersister extends UuidType {
        ...
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-01
      • 2014-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多