Russian Qt Forum
Ноябрь 25, 2024, 02:27 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: 1 [2] 3   Вниз
  Печать  
Автор Тема: Как создать объект с уникальным для него идентификатором?  (Прочитано 18366 раз)
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #15 : Январь 20, 2009, 14:38 »

ну... что-то вроде как в винде дескрипрор на что-то там.. его же само ядро ОС генерит.. и он уникальный! (наверное) Улыбающийся

Дискрипотор это тоже какой-то интергральный тип, который имеет свой придел Улыбающийся
Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #16 : Январь 20, 2009, 14:40 »

Цитировать
а если айди при создании устанавливать в "0", а после записи в БД выгребать уникальный айди , который сгенерила база?

а как база сама сгенерит?
Записан

ArchLinux x86_64 / Win10 64 bit
spirit
Гость
« Ответ #17 : Январь 20, 2009, 14:46 »

primary key -- может генирится самой базой, как это делается зависит от конкретного сервера:
в MYSQL -- при создании таблы добавляется AUTO_INCREMENT,
в Oracle -- клепается последовательность (sequence),
в PostgreSql -- при создании таблы добавляется SERIAL,
в SqLite -- вроде так же как и в MySql (точно не помню).
получать этот айди можно через QVariant QSqlQuery::lastInsertId () const, но для Oralce & PostgreSql не возвращает.
для них я получал айди самописным методом.
но имхо, самый быстрый вариант -- это тот , о котором говорил я и пастор.
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #18 : Январь 20, 2009, 14:58 »

ОК Улыбающийся

спс... буду делать через счетчик.
Записан

ArchLinux x86_64 / Win10 64 bit
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #19 : Январь 20, 2009, 15:15 »

вообще задачка по ID объекта из области "именованного/нумерованого одиночки", я думаю такой вариант и надо использовать.
Записан

Юра.
Winstrol
Гость
« Ответ #20 : Январь 20, 2009, 15:32 »

Нужно будет завести словарь  std::map<IdInDBType,KewlClass*> и в рантайме конвертировать ID в указатель на объект. 
« Последнее редактирование: Январь 20, 2009, 15:35 от Winstrol » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #21 : Январь 20, 2009, 15:51 »

Цитировать
вообще задачка по ID объекта из области "именованного/нумерованого одиночки", я думаю такой вариант и надо использовать.
я не понял ничего Улыбающийся

Цитировать
Нужно будет завести словарь  std::map<IdInDBType,KewlClass*> и в рантайме конвертировать ID в указатель на объект. 

а по подробнее идею растолкуйте Улыбающийся
Записан

ArchLinux x86_64 / Win10 64 bit
Winstrol
Гость
« Ответ #22 : Январь 20, 2009, 15:54 »

primary key -- может генирится самой базой, как это делается зависит от конкретного сервера:
Давно с БД не имел дела, но на край на SQL можно эмулировать авто инкремент как-то так select max(ID)+1 from ...
Записан
spirit
Гость
« Ответ #23 : Январь 20, 2009, 15:56 »

primary key -- может генирится самой базой, как это делается зависит от конкретного сервера:
Давно с БД не имел дела, но на край на SQL можно эмулировать авто инкремент как-то так select max(ID)+1 from ...
можно, но зачем велосипед изобретать, если все уже есть?  Подмигивающий
Записан
panAlexey
Гипер активный житель
*****
Offline Offline

Сообщений: 864

Акцио ЗАРПЛАТА!!!!! :(


Просмотр профиля
« Ответ #24 : Январь 20, 2009, 16:47 »

Автоинкремент в данном случае не подходит.
Я так понимаю, что у него разные классы, а следовательно автоинкременные значения могут попросту совпасть.
Если конечно у него экземпляры классов хранятся в разных таблицах.
Если в одной, то - ОК.
Если в разных, то сводная таблица+транзакция или составное значение: видКласса+ID объекта.
« Последнее редактирование: Январь 20, 2009, 16:49 от panAlexey » Записан

Win Xp SP-2, Qt4.3.4/MinGW. http://trdm.1gb.ru/
Dendy
Гость
« Ответ #25 : Январь 20, 2009, 17:52 »

А в каком виде вам нужен этот уникальный идентификатор? Я так понимаю - это целое неповторяющееся число из определённого диапазона с возможностью утилизировать удалённые идентификаторы во избежание переполнения счётчика. Верно?
Записан
lit-uriy
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3880


Просмотр профиля WWW
« Ответ #26 : Январь 20, 2009, 17:58 »

Цитировать
вообще задачка по ID объекта из области "именованного/нумерованого одиночки", я думаю такой вариант и надо использовать.
я не понял ничего Улыбающийся
Это шаблон проектирования такой - "одиночка", он же "singleton"
Записан

Юра.
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #27 : Январь 21, 2009, 08:37 »

Цитировать
А в каком виде вам нужен этот уникальный идентификатор?

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

Цитировать
Я так понимаю - это целое неповторяющееся число из определённого диапазона с возможностью утилизировать удалённые идентификаторы во избежание переполнения счётчика. Верно?

ага... и не только удалять, но и использовать для вновь создаваемых объектов идентификаторы ранее удаленных объектов

---
я пока алгоритм такой наваял:

(при создании нового объекта вручную)
1. счетчик = 0
2. создаем объект
3. инкремент счетчика (т.е ID-ы будут от 1 до ....)
4. проверяем ID-ы уже имеющихся объектов и сравниваем их значения с текущим значением счетчика..
5. если есть совпадения ID-ов - переход к п. 3
6. присваиваем созданному объекту ID = тек. значение счетчика...

(при создании объектов автоматически - т.е при чтении конфига БД)
1. проверку на повторяющиеся ID-ы не делаем, т.к подразумеваем что в БД все ID-ы уже разные и все там правильно
Записан

ArchLinux x86_64 / Win10 64 bit
kirill
Гость
« Ответ #28 : Январь 21, 2009, 11:26 »

Алгоритм полного перебора, мягко говоря, неоптимален по времени.
А может использовать ID, создаваемый таймером ?

#include <time.h>
clock_t ID = clock();
Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #29 : Январь 21, 2009, 12:40 »

Цитировать
Алгоритм полного перебора, мягко говоря, неоптимален по времени.
А может использовать ID, создаваемый таймером ?

#include <time.h>
clock_t ID = clock();

а этот ID разве не может повториться ?
Записан

ArchLinux x86_64 / Win10 64 bit
Страниц: 1 [2] 3   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.248 секунд. Запросов: 23.