Russian Qt Forum
Ноябрь 25, 2024, 04:25
Добро пожаловать,
Гость
. Пожалуйста,
войдите
или
зарегистрируйтесь
.
Вам не пришло
письмо с кодом активации?
1 час
1 день
1 неделя
1 месяц
Навсегда
Войти
Начало
Форум
WIKI (Вики)
FAQ
Помощь
Поиск
Войти
Регистрация
Russian Qt Forum
>
Forum
>
Qt
>
Общие вопросы
>
Как создать объект с уникальным для него идентификатором?
Страниц:
1
[
2
]
3
Вниз
« предыдущая тема
следующая тема »
Печать
Автор
Тема: Как создать объект с уникальным для него идентификатором? (Прочитано 18372 раз)
pastor
Administrator
Джедай : наставник для всех
Offline
Сообщений: 2901
Re: Как создать объект с уникальным для него идентификатором?
«
Ответ #15 :
Январь 20, 2009, 14:38 »
Цитата: kuzulis от Январь 20, 2009, 14:34
ну... что-то вроде как в винде дескрипрор на что-то там.. его же само ядро ОС генерит.. и он уникальный! (наверное)
Дискрипотор это тоже какой-то интергральный тип, который имеет свой придел
Записан
Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
kuzulis
Джедай : наставник для всех
Offline
Сообщений: 2812
Re: Как создать объект с уникальным для него идентификатором?
«
Ответ #16 :
Январь 20, 2009, 14:40 »
Цитировать
а если айди при создании устанавливать в "0", а после записи в БД выгребать уникальный айди , который сгенерила база?
а как база сама сгенерит?
Записан
ArchLinux x86_64 / Win10 64 bit
spirit
Гость
Re: Как создать объект с уникальным для него идентификатором?
«
Ответ #17 :
Январь 20, 2009, 14:46 »
primary key -- может генирится самой базой, как это делается зависит от конкретного сервера:
в MYSQL -- при создании таблы добавляется AUTO_INCREMENT,
в Oracle -- клепается последовательность (sequence),
в PostgreSql -- при создании таблы добавляется SERIAL,
в SqLite -- вроде так же как и в MySql (точно не помню).
получать этот айди можно через
QVariant QSqlQuery::lastInsertId () const
, но для Oralce & PostgreSql не возвращает.
для них я получал айди самописным методом.
но имхо, самый быстрый вариант -- это тот , о котором говорил я и пастор.
Записан
kuzulis
Джедай : наставник для всех
Offline
Сообщений: 2812
Re: Как создать объект с уникальным для него идентификатором?
«
Ответ #18 :
Январь 20, 2009, 14:58 »
ОК
спс... буду делать через счетчик.
Записан
ArchLinux x86_64 / Win10 64 bit
lit-uriy
Джедай : наставник для всех
Offline
Сообщений: 3880
Re: Как создать объект с уникальным для него идентификатором?
«
Ответ #19 :
Январь 20, 2009, 15:15 »
вообще задачка по ID объекта из области "именованного/нумерованого одиночки", я думаю такой вариант и надо использовать.
Записан
Юра.
Winstrol
Гость
Re: Как создать объект с уникальным для него идентификатором?
«
Ответ #20 :
Январь 20, 2009, 15:32 »
Нужно будет завести словарь std::map<IdInDBType,KewlClass*> и в рантайме конвертировать ID в указатель на объект.
«
Последнее редактирование: Январь 20, 2009, 15:35 от Winstrol
»
Записан
kuzulis
Джедай : наставник для всех
Offline
Сообщений: 2812
Re: Как создать объект с уникальным для него идентификатором?
«
Ответ #21 :
Январь 20, 2009, 15:51 »
Цитировать
вообще задачка по ID объекта из области "именованного/нумерованого одиночки", я думаю такой вариант и надо использовать.
я не понял ничего
Цитировать
Нужно будет завести словарь std::map<IdInDBType,KewlClass*> и в рантайме конвертировать ID в указатель на объект.
а по подробнее идею растолкуйте
Записан
ArchLinux x86_64 / Win10 64 bit
Winstrol
Гость
Re: Как создать объект с уникальным для него идентификатором?
«
Ответ #22 :
Январь 20, 2009, 15:54 »
Цитата: spirit от Январь 20, 2009, 14:46
primary key -- может генирится самой базой, как это делается зависит от конкретного сервера:
Давно с БД не имел дела, но на край на SQL можно эмулировать авто инкремент как-то так select max(ID)+1 from ...
Записан
spirit
Гость
Re: Как создать объект с уникальным для него идентификатором?
«
Ответ #23 :
Январь 20, 2009, 15:56 »
Цитата: Winstrol от Январь 20, 2009, 15:54
Цитата: spirit от Январь 20, 2009, 14:46
primary key -- может генирится самой базой, как это делается зависит от конкретного сервера:
Давно с БД не имел дела, но на край на SQL можно эмулировать авто инкремент как-то так select max(ID)+1 from ...
можно, но зачем велосипед изобретать, если все уже есть?
Записан
panAlexey
Гипер активный житель
Offline
Сообщений: 864
Акцио ЗАРПЛАТА!!!!! :(
Re: Как создать объект с уникальным для него идентификатором?
«
Ответ #24 :
Январь 20, 2009, 16:47 »
Автоинкремент в данном случае не подходит.
Я так понимаю, что у него разные классы, а следовательно автоинкременные значения могут попросту совпасть.
Если конечно у него экземпляры классов хранятся в разных таблицах.
Если в одной, то - ОК.
Если в разных, то сводная таблица+транзакция или составное значение: видКласса+ID объекта.
«
Последнее редактирование: Январь 20, 2009, 16:49 от panAlexey
»
Записан
Win Xp SP-2, Qt4.3.4/MinGW.
http://trdm.1gb.ru/
Dendy
Гость
Re: Как создать объект с уникальным для него идентификатором?
«
Ответ #25 :
Январь 20, 2009, 17:52 »
А в каком виде вам нужен этот уникальный идентификатор? Я так понимаю - это целое неповторяющееся число из определённого диапазона с возможностью утилизировать удалённые идентификаторы во избежание переполнения счётчика. Верно?
Записан
lit-uriy
Джедай : наставник для всех
Offline
Сообщений: 3880
Re: Как создать объект с уникальным для него идентификатором?
«
Ответ #26 :
Январь 20, 2009, 17:58 »
Цитата: kuzulis от Январь 20, 2009, 15:51
Цитировать
вообще задачка по ID объекта из области "именованного/нумерованого одиночки", я думаю такой вариант и надо использовать.
я не понял ничего
Это шаблон проектирования такой - "одиночка", он же "singleton"
Записан
Юра.
kuzulis
Джедай : наставник для всех
Offline
Сообщений: 2812
Re: Как создать объект с уникальным для него идентификатором?
«
Ответ #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
Гость
Re: Как создать объект с уникальным для него идентификатором?
«
Ответ #28 :
Январь 21, 2009, 11:26 »
Алгоритм полного перебора, мягко говоря, неоптимален по времени.
А может использовать ID, создаваемый таймером ?
#include <time.h>
clock_t ID = clock();
Записан
kuzulis
Джедай : наставник для всех
Offline
Сообщений: 2812
Re: Как создать объект с уникальным для него идентификатором?
«
Ответ #29 :
Январь 21, 2009, 12:40 »
Цитировать
Алгоритм полного перебора, мягко говоря, неоптимален по времени.
А может использовать ID, создаваемый таймером ?
#include <time.h>
clock_t ID = clock();
а этот ID разве не может повториться ?
Записан
ArchLinux x86_64 / Win10 64 bit
Страниц:
1
[
2
]
3
Вверх
Печать
« предыдущая тема
следующая тема »
Перейти в:
Пожалуйста, выберите назначение:
-----------------------------
Qt
-----------------------------
=> Вопросы новичков
=> Уроки и статьи
=> Установка, сборка, отладка, тестирование
=> Общие вопросы
=> Пользовательский интерфейс (GUI)
=> Qt Quick
=> Model-View (MV)
=> Базы данных
=> Работа с сетью
=> Многопоточное программирование, процессы
=> Мультимедиа
=> 2D и 3D графика
=> OpenGL
=> Печать
=> Интернационализация, локализация
=> QSS
=> XML
=> Qt Script, QtWebKit
=> ActiveX
=> Qt Embedded
=> Дополнительные компоненты
=> Кладовая готовых решений
=> Вклад сообщества в Qt
=> Qt-инструментарий
-----------------------------
Программирование
-----------------------------
=> Общий
=> С/C++
=> Python
=> Алгоритмы
=> Базы данных
=> Разработка игр
-----------------------------
Компиляторы и платформы
-----------------------------
=> Linux
=> Windows
=> Mac OS X
=> Компиляторы
===> Visual C++
-----------------------------
Разное
-----------------------------
=> Новости
===> Новости Qt сообщества
===> Новости IT сферы
=> Говорилка
=> Юмор
=> Объявления
Загружается...