2011-06-16 88 views
1

我正在使用以下代码填充ContentValues变量。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个槽的内部hashmap。当放置这些值时,密钥被添加到插槽0中,名称也被添加到插槽0中(覆盖uuid),图像被添加到插槽3中并且desc被添加到插槽7中。

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

我试过新的ContentValues(4)为了迫使他们进入正确的位置,那就更糟了。 2个值被覆盖。

[编辑]我只是试图改变放置的顺序。通过移动UUID以使其放在()最后,它仍然覆盖散列表中的插槽0。 (我知道你在想什么,是的钥匙是独一无二的。)

[编辑]我试了下面的代码,它完美的作品。我在迷路。我还编辑了原始问题,因为我用硬编码的字符串尝试了它,但这也不起作用。

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

任何帮助,将不胜感激,

-I_Artist

+0

如果您尝试从ContentValues获取(...)值,会发生什么情况?为什么不直接使用BlockTypeTable值作为关键字? – MicSim 2011-06-16 16:03:37

+0

我没有尝试获取()这些值。我没有看到这一点。我直接使用BlockTypeTables,我只是修改了代码在这里发布它,以便人们会看到我的键确实是字符串。 – MikeWallaceDev 2011-06-16 16:07:37

回答

0

会发生什么,如果你硬编码的钥匙为 “密钥1”, “密钥2”, “键3”, “键4”?我知道你说过,你确定你的钥匙是独一无二的,但是我仍然很好奇,如果有可能我们都没有看到的东西。也许你可以告诉我们一个为钥匙和它们的值设置的值的例子吗?

(哈!使用计算器第一次,显然这不是一个答案......)

(所以这实际上可能是你的答案)

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

关键字“blt_UUID”和“blt_name”被哈希到相同的值可能是可能的。在这种情况下,两个键被赋予相同的索引并且发生“碰撞”并且该值被覆盖。尝试将密钥更改为其他内容,也许使用全部大小写,然后重试。

祝你好运。

+0

我实际上是自己得出这个结论的。如果全天工作,我会尝试更改名称并接受您的答案。 我只是希望我真的可以验证这个... – MikeWallaceDev 2011-06-16 16:50:23

+0

另外,Hashmap没有实现一个链表。这将是扩展HashMap的LinkedHashMap。 (LeffelMania) – Stericson 2011-06-16 17:23:12

+2

该表不是一个链接列表(它是一个数组),但每个条目都是一个Entry对象,并带有指向下一个条目的指针。这个链表被迭代以找到给定表索引的匹配键。您可以在GrepCode上自己查看实现。他的UUID正在消失的事实对我来说仍然是一个谜。 – LeffelMania 2011-06-16 17:32:10

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... 

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

+2

包装HashMap的ContentValues使用Bucket Hashing,因此即使它映射到相同的索引,表中的每个条目实际上也是该索引的链接值列表。所以你很酷。 – LeffelMania 2011-06-16 17:06:54