我正在使用Couchbase Lite SDK for android并将MyClass
的对象实例保存为数据库中的文档。 MyClass
具有将日期存储在java.util.Date
中的属性。在运行时,我获取保存在数据库中的MyClass
的所有实例,并将它们存储在ArrayList<MyClass>
中。当我将新文档插入数据库并从数据库中读取值以显示所有输入的实例时,当我下次尝试从数据库中获取详细信息时,保存在数据库中的日期字段将被检索为Long
。我用来从数据库加载细节的代码是:
代码段1:
for (Field field: fields) {
field.setAccessible(true);
if (properties.containsKey(field.getName())) {
if ("date".equals(field.getName())) {
Log.d("DebugTag", properties.get(field.getName()) + "");
long dateLong = (Long) properties.get(field.getName());
details.setDate(new Date(dateLong));
} else {
field.set(details, properties.get(field.getName()));
}
} else if("_id".equals(field.getName())) {
details.set_id(document.getId());
} else {
final String msg = "Field " + field.getName() + " not present in document ";
Log.e(TAG, msg);
}
}
如果字段为date
,您可以看到我添加了额外的检查。这完全没问题。因此,我将一个新条目保存到数据库并返回到我看到所有条目进入数据库的页面。
现在,我已经实现了一项新功能来更新数据库中记录的详细信息。为了更新记录,我有以下实现:
代码段2:
public static boolean updateDocument(Database database, String docID, Map<String, Object> map) {
if (null == database || null == map || null == docID) {
return false;
}
boolean success = true;
Document document = database.getDocument(docID);
try {
// Have to put in the last revision id as well to update the document.
// If we do not do this, this will throw exception.
map.put("_rev", document.getProperty("_rev"));
// Putting new properties in the document ...
document.putProperties(map);
} catch (CouchbaseLiteException e) {
Log.e(TAG, "Error putting property", e);
success = false;
}
return success;
}
执行此操作后,当我尝试重新加载项目时,在我的代码段1 中读取日期字段时,它会让我异常,因为Date
对象无法被类型化为{{{ 1}}和应用程序崩溃。现在,当我再次打开应用程序时,它完全正常,所有对已编辑条目的更改都能正确反映。任何人都可以让我知道这个的原因吗?我怀疑,在我们关闭数据库连接之前,更改没有提交到实际的数据库位置,更新的条目中的日期字段在我的情况下作为Long
对象保存在缓存中。
PS:虽然我已经找到了解决方法,方法是将日期设置为有效负载中的Date
对象(函数{{1中的映射)在代码段2 )中,理解我遇到的问题仍然很有趣。
答案 0 :(得分:0)
进一步看,这可能是与自动装箱相关的原因,其中原始类型到对象包装类的长到长转换在尝试保存时使应用程序崩溃。
你试过了吗?
long value = Long.parseLong((String)...);
更具体地说,在代码段1中:
long dateLong = Long.parseLong((String)properties.get(field.getName()));