Nano Hash - криптовалюты, майнинг, программирование

Использование UUID в качестве идентификатора в ORMLite (Android)

Я успешно создал таблицу с ORMLite, где, похоже, правильно добавлен столбец uuid в качестве первичного ключа, индекса и т. д.

public class Stat {
    @DatabaseField(id = true)
    protected UUID uuid = UUID.randomUUID();
...

Теперь я хотел бы иметь возможность использовать всю мощь предоставленного DAO и делать (Stat - это мой класс, который нужно сохранить, getUUID() возвращает UUID):

Stat statClassInstance = new Stat();
RuntimeExceptionDao<Stat, Integer> statDao = getHelper().getStatDataDao();

statDao.deleteById(statClassInstance.getUUID());

Компилятор выдает мне ошибку:

The method deleteById(Integer) in the type RuntimeExceptionDao<Stat,Integer> is not applicable for the arguments (UUID)

Чего мне не хватает, так это как использовать идентификаторы UUID в таких методах, как deleteById, которые принимают целые числа. Я читал, что UUID в качестве идентификатора был включен в ORMLite, но не упоминал, что он заходил только так далеко, что позволял им быть первичными ключами, не поддерживая все эти вспомогательные методы (queryForId, deleteIds) и т. д.

16.01.2012

  • почему бы вам не удалить запись как statData.delete(statClassInstance). вы обычно переопределяете hashCode() equals() в классе модели (ваш statClassInstance), и это должно работать нормально, как в примере. вы создаете список своих записей для удаления, затем выполняете итерацию и удаляете их. 16.01.2012
  • Дополнительные сведения о полях с generateId --- ormlite.com/javadoc/ ormlite-core/doc-files/ormlite_2.html#SEC21 16.01.2012
  • У меня часто бывает ситуация, когда у меня есть только UUID, а не экземпляр рассматриваемого объекта. Создание «фиктивного» объекта только для его удаления из БД не выглядит эффективным/чистым способом сделать это. 16.01.2012
  • ага, читай ссылку. надеюсь, это даст вам некоторое представление. 16.01.2012
  • UUID (DataType.UUID) Класс java.util.UUID сохраняется как тип VARCHAR. Он сохраняет его как uuid.toString() и использует метод UUID.fromString(String) для повторного преобразования. Вы также можете пометить поле UUID как сгенерированное идентификатором, и в этом случае всякий раз, когда оно будет вставлено, java.util.UUID.randomUUID() вызывается и устанавливается в поле. 16.01.2012
  • Я прочитал эту документацию, и это позволило мне указать uuid как идентификатор в таблице. Теперь я хотел бы иметь возможность использовать uuid как идентификатор во всех ситуациях, например, удалять запись, зная только ее uuid (и не прибегать к сложному использованию методов queryForFieldValues). 16.01.2012
  • Хорошо, у вас есть исключение, которое вы получаете, когда пытаетесь удалить запись, используя свое поле UUID? 16.01.2012
  • Компилятор не принимает UUID в качестве идентификатора, так как deleteByID ожидает int, а не UUID. Метод deleteById(Integer) в типе RuntimeExceptionDao‹Stat,Integer› неприменим для аргументов (UUID) 16.01.2012
  • как вы создали свое Дао? Дао‹Вашкласс, Целое› mahDao = DaoManager.createDao(connSource, Yourclass.class); вы должны использовать Dao‹Yourclass,UUID› 16.01.2012
  • Да, спасибо за этот последний совет, это была именно та концепция, которая ускользала от меня. Как только я поместил эту ошибку компилятора в сообщение, я начал задаваться вопросом, могу ли я поместить туда UUID. Вы подтвердили мои чувства. Пожалуйста, предоставьте это как ответ, чтобы я мог кредитовать его. 16.01.2012

Ответы:


1

Чтобы использовать метод deleteById(ID), Dao<T,ID> должен быть создан соответственно с соответствующими параметрами, которые были идентифицированы в вашем T-классе. Идентификатор будет интерпретироваться как любой тип, который вы определяете в своем T-классе как первичный ключ. В данном конкретном случае это тип UUID, и, глядя на исключение, DAO был создан с использованием Dao<Stat, Integer> и должен был быть создан следующим образом:

 Dao<Stat, UUID> statDao = DaoManager.createDao(connSource, Stat.class);

надеюсь это поможет

16.01.2012
  • Это правильно, Сергей, но здесь лучше дать какой-то контекст, а не только исправление. 16.01.2012
  • Извините, сэр, сделаю в следующий раз. Исправление предназначено для этого конкретного случая. Я добавлю больше мяса в следующий раз, чтобы описать его. 16.01.2012
  • Нп. Однако вы должны отредактировать свой ответ, чтобы предоставить больше контекста прямо сейчас. Помните, что вы не только отвечаете на этот вопрос, но и говорите для потомков с парнем, который поднимает этот вопрос через год. 16.01.2012
  • Спасибо Сергей. Выглядит отлично. +1 16.01.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..