【问题标题】:Android + ORMLite + java.sql.TimestampAndroid + ORMLite + java.sql.Timestamp
【发布时间】:2012-04-19 01:49:11
【问题描述】:

我有一个使用 ORMLite 的 Android 项目。一切正常,但对于数据库中的某些字段,它使用java.sql.Timestamp 作为字段类型。它在我之前使用的 ORMLite 4.10 上运行良好。但是现在我需要更新ORMLite,并且有问题.. 当我将 ORMLite 更新到新版本并运行它时,应用程序抛出异常:

W/System.err(  615): java.sql.SQLException: ORMLite can't store unknown class
    class java.sql.Timestamp for field 'createDate'.
    Serializable fields must specify dataType=DataType.SERIALIZABLE

之前createDate 字段没有dataType 参数。但是当我添加它时,错误并没有修复,应用程序也抛出了这个异常:(。项目已经在市场上,所以我不能将 dataType 更改为其他类型(如 Date),也可以删除这个字段。

我应该在较新的 ORMLite 上为时间戳使用什么?还是ORMLite bug?

更新: 通过将时间戳类型更改为可序列化类型来修复它。现在代码如下所示:

@DatabaseField(dataType = DataType.SERIALIZABLE)
public Serializable createDate;

public Timestamp getCreateDate()
{
    return (Timestamp)createDate;
}

【问题讨论】:

  • 为了后代,您应该不必必须这样做Serializable hack。您应该能够拥有任何实现 Serializable 的类型。

标签: java android sqlite ormlite


【解决方案1】:

对此@st1ing 感到抱歉。这当然可能是ORMLite 中的一个错误,但我怀疑它可能是不兼容的。在 4.14 版中,我们必须更改处理 Serializable 字段的方式。 Upgrade notes 在线。引用:

此外,序列化类型现在还必须指定它们的 dataType 值。您应该使用DataType.SERIALIZABLE 继续在数据库中存储序列化对象。这将允许我们在未来添加对其他序列化类型的直接支持,而不会破坏向后兼容性。

如果您已经在数据库中存储了Serializable 数据(byte[] 或其他对象),那么您需要在字段中添加类似以下内容:

@DatabaseField(dataType = DataType.SERIALIZABLE)
Serializable field;

实际上,例外是试图给您提示如何解决您的问题:

Serializable fields must specify dataType=DataType.SERIALIZABLE

因此,请尝试将其添加到您的 Timestamp 字段中。让我知道它是否有效。

【讨论】:

  • 我尝试添加 dataType,但它不起作用:(我将 @DatabaseField(dataType = DataType.SERIALIZABLE) 添加到字段,但它仍然从我的原始消息中抛出 SQLexception。我也尝试过使用其他数据类型,但没有任何帮助...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多