Android ContentValues()不正确地添加值

Android ContentValues()不正确地添加值,android,database,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_descriptio

我使用以下代码填充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。在输入值时,key添加到插槽0中,name也添加到插槽0中(覆盖uuid),pic添加到插槽3中,desc添加到插槽7中

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

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

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

[编辑]我用下面的代码进行了尝试,效果非常好。我迷路了。我还编辑了原来的问题,因为我用硬编码字符串进行了尝试,但也没用

  initialValues.put("a", m_name);
  initialValues.put("b", m_pictureURI);
  initialValues.put("c", m_description);
  initialValues.put("d", getUUID().toString());
任何帮助都将不胜感激


-I_Artist

如果将按键硬编码为“Key1”、“Key2”、“Key3”、“Key4”,会发生什么情况?我知道你说过你确信你的钥匙是独一无二的,但是我仍然好奇是否有我们都看不到的东西。。也许您可以给我们展示一个为键及其值设置的值的示例

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

(所以这可能就是你的答案)

HashMap使用键的hashCode()将索引计算到该数组中。它不仅使用hashCode()对数组大小进行模化,还使用hashCode()的一个更复杂的函数

键“blt_UUID”和“blt_name”可能被散列为相同的值。在这种情况下,两个键被赋予相同的索引,并且发生“冲突”,并且该值被覆盖。尝试将键更改为其他键,可能使用所有大小写,然后重试


祝你好运

如果将按键硬编码为“Key1”、“Key2”、“Key3”、“Key4”,会发生什么情况?我知道你说过你确信你的钥匙是独一无二的,但是我仍然好奇是否有我们都看不到的东西。。也许您可以给我们展示一个为键及其值设置的值的示例

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

(所以这可能就是你的答案)

HashMap使用键的hashCode()将索引计算到该数组中。它不仅使用hashCode()对数组大小进行模化,还使用hashCode()的一个更复杂的函数

键“blt_UUID”和“blt_name”可能被散列为相同的值。在这种情况下,两个键被赋予相同的索引,并且发生“冲突”,并且该值被覆盖。尝试将键更改为其他键,可能使用所有大小写,然后重试


祝你好运

你确定这是个问题吗?本质上是一个数组,而不是数组。几乎不可避免的是,不同的按键之间会有不同的声音。但是碰撞并不意味着数据丢失。确保数据正确存储(或未正确存储)的唯一实际方法是尝试从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...

我打赌你会发现数据的值是正确的。如果没有,那么您发布的代码将无法向我们展示更多信息。

您确定这是一个问题吗?本质上是一个数组,而不是数组。几乎不可避免的是,不同的按键之间会有不同的声音。但是碰撞并不意味着数据丢失。确保数据正确存储(或未正确存储)的唯一实际方法是尝试从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...

我打赌你会发现数据的值是正确的。如果没有,那么您发布的代码所能显示的内容就太多了。

如果您尝试
从ContentValues中获取(…)
值会发生什么?为什么不直接使用BlockTypeTable值作为键?我没有尝试获取()值。我不明白重点。我直接使用BlockTypeTables,我只是修改了代码,将其发布到这里,以便人们看到我的键实际上是字符串。如果尝试
从ContentValues获取(…)
值,会发生什么?为什么不直接使用BlockTypeTable值作为键?我没有尝试获取()值。我不明白重点。我直接使用BlockTypeTables,我只是修改了代码将其发布到这里,这样人们就会看到我的键实际上是字符串。我自己也得出了这个结论。我会试着改名,如果你的答案一整天都有效的话,我会接受你的答案。我只希望我能真正验证这一点……而且,Hashmap没有实现链表。这就是LinkedHashMap,它扩展了HashMap。(LeffelMania)表不是一个链表(它是一个数组),但每个条目都是一个条目对象,带有指向下一个条目的指针。迭代此链表以查找给定表索引的匹配键。您可以自己在GrepCode上查看实现。他的UUID正在消失这一事实对我来说仍然是个谜。事实上我自己也得出了这个结论。我会试着改名,如果你的答案一整天都有效的话,我会接受你的答案。我只希望我能真正验证这一点……而且,Hashmap没有实现链表。这就是LinkedHashMap,它扩展了HashMap。(LeffelMania)表不是一个链表(它是一个数组),但每个条目都是一个条目对象,带有指向下一个条目的指针。迭代此链表以查找给定表索引的匹配键。您可以自己在GrepCode上查看实现。他的UUID正在消失这一事实仍然是我的疑问