ContentValues()错误地添加值

时间:2011-06-16 15:38:44

标签: android database

我正在使用以下代码填充ContentValues变量。

public ContentValues getContentValues() {
  ContentValues initialValues = new ContentValues();

  initialValues.put("blt_name", m_name);
  initialValues.put("blt_pictureURI", m_pictureURI);
  initialValues.put("blt_description", m_description);
  initialValues.put("blt_UUID", getUUID().toString());

  return initialValues;
}

我的问题是put()将UUID和名称放在同一个哈希位置!我不知道为什么。在创建initialValues变量时,它会创建一个具有7个插槽的内部散列映射。当放置值时,密钥在插槽0中添加,名称也在插槽0中添加(覆盖uuid),在插槽3中添加pic,在插槽7中添加desc。

当然,所有四个键都是不同的值,声明为最终字符串。

我尝试了新的ContentValues(4)以强制他们进入正确的位置,这更糟糕。 2个值被覆盖。

[编辑]我刚尝试改变了看跌期权的顺序。通过移动UUID以使其最后放置(),它仍然会覆盖hashmap中的插槽0。 (我知道你在想什么,是的,钥匙是独一无二的。)

[编辑]我尝试使用以下代码,它完美无缺。我迷路了。我还编辑了原始问题,因为我尝试使用硬编码字符串,但这也没有用。

  initialValues.put("a", m_name);
  initialValues.put("b", m_pictureURI);
  initialValues.put("c", m_description);
  initialValues.put("d", getUUID().toString());

任何帮助将不胜感激,

-I_Artist

2 个答案:

答案 0 :(得分:1)

你确定这是一个问题吗? ContentValues本质上是hash table,而不是数组。在不同的密钥之间存在collisions几乎是不可避免的。但是碰撞意味着您丢失了数据。确保数据正确存储(或不存储)的唯一真正方法是尝试获取来自ContentValues对象的数据:

  String newName = initialValues.get("blt_name");
  String newPicture = initialValues.get("blt_pictureURI");
  String newDesc = initialValues.get("blt_description");
  String newUUID = initialValues.get("blt_UUID");
  // now do something with these values to check if they're right...

我打赌你会发现数据的值正确。如果没有,那么比你发布的代码可以向我们展示的更多。

答案 1 :(得分:0)

如果您将密钥硬编码为“Key1”,“Key2”,“Key3”,“Key4”会怎样?我知道你说你确定你的钥匙是独一无二的,但我仍然很好奇,如果可能有一些我们都没有看到的东西......也许你可以告诉我们一个关于钥匙及其价值设定值的例子? / p>

(哈!第一次使用stackoverflow,显然这不是答案......)

(所以这可能是你的回答)

HashMap使用键的hashCode()计算该数组的索引。它不仅使用hashCode()模数组大小,而是使用hashCode()的更复杂函数。

键:“blt_UUID”和“blt_name”可能被散列为相同的值。在这种情况下,两个键被赋予相同的索引并且正在发生“冲突”并且值被覆盖。尝试将密钥更改为其他内容,可能使用全部大小写,然后再次尝试。

祝你好运。