ContentValues ​​() неправильно добавляет значения - PullRequest
1 голос
/ 16 июня 2011

Я использую следующий код для заполнения переменной 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 и desc добавляется в слот 7.

Все четыре ключа, конечно, разные значения, объявленные как окончательные строки.

Я пытался новых ContentValues ​​(4) , чтобы заставить их в нужное место, что было хуже. 2 значения были перезаписаны.

[Edit] Я только что попытался изменить порядок путов. Перемещая UUID так, чтобы он ставился () последним, он все равно перезаписывает слот 0 в hashmap. (Я знаю, что вы думаете, и ДА ключи уникальны.)

[РЕДАКТИРОВАТЬ] Я попробовал это со следующим кодом, и он отлично работает. Я в растерянности. Я также отредактировал исходный вопрос, потому что попробовал его с жестко закодированными строками, и это тоже не сработало.

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

Любая помощь будет оценена,

-I_Artist

Ответы [ 2 ]

1 голос
/ 16 июня 2011

Вы уверены, что это проблема? ContentValues ​​ - это, по сути, хеш-таблица , а не массив.Почти неизбежно, что между разными ключами будет коллизий .Но коллизии не означают, что вы потеряли свои данные.Единственный реальный способ убедиться, что ваши данные хранятся (или не хранятся) надлежащим образом, - это попытаться получить данных из объекта 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...

Держу пари, выобнаружите, что данные имеют свои правильные значения.Если нет, то здесь происходит нечто большее, чем тот код, который вы опубликовали.

0 голосов
/ 16 июня 2011

Что произойдет, если вы жестко закодируете свои клавиши как «Key1», «Key2», «Key3», «Key4»? Я знаю, что вы сказали, что уверены, что ваши ключи уникальны, однако мне все еще любопытно, может ли быть что-то, чего мы все не видим ... Может быть, вы могли бы показать нам пример значений, устанавливаемых для ключей и их значений?

(Ха! Первый раз, используя stackoverflow, очевидно, это не ответ ...)

(Так что на самом деле это может быть ваш ответ)

HashMap вычисляет индекс в этом массиве, используя hashCode () ключа. Он не только использует hashCode () по модулю размера массива, но и использует более сложную функцию hashCode ().

Возможно, что ключи: "blt_UUID" И "blt_name" хэшируются с одинаковым значением. В этом случае двум ключам присваивается один и тот же индекс, и происходит «коллизия», а значение перезаписывается. Попробуйте сменить ключ на что-то другое, возможно, используя всю заглавную букву, и попробуйте снова.

Желаем удачи.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...