|
0 / 0 / 0
Регистрация: 12.07.2017
Сообщений: 7
|
||||||
SQLite Как загрузить базу SQLite из TStream?25.07.2017, 17:56. Показов 2536. Ответов 16
Здравствуйте!
Я использую Delphi XE и обрабатываю локальный файл SQLite 3 с помощью FireDac:
Подскажите, возможно ли это? Сейчас я реализовал эту возможность через перехват функций: когда FireDac пытается прочитать файл на жестком диске, я ему "подсовываю" TStream. Однако работатет через раз... Возможно посоветуете другой компонент, который может читать базу из TStream? P.S. Сохранить TStream в файл нельзя. Надо читать прямо из потока.
0
|
||||||
| 25.07.2017, 17:56 | |
|
Ответы с готовыми решениями:
16
Как открыть базу данных sqlite 3.x? Как вставить данные в базу sqlite |
|
0 / 0 / 0
Регистрация: 12.07.2017
Сообщений: 7
|
|
| 25.07.2017, 22:10 [ТС] | |
|
Восстановление удаленных файлов. Т.е. файла физически на диске нет, но есть его содержимое в памяти (TStream). Записывать на диск тоже ничего нельзя. В данном случае файл (базу данных) надо проанализировать, а не просто сохранить...
Есть вариант разобраться со строением структуры SQLite и читать ее самому, добавляя в FireDAC, но ооочень надеюсь, что есть вариант проще и этого делать не прийдется. Как я и говорил, приветствуются любые компоненты по чтению SQLite.
0
|
|
|
3763 / 2267 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
|
|
| 26.07.2017, 00:24 | |
|
Так зачем же так все усложнять? С незапамятных времен в ОС можно создать рам-диск, записать на него все что вам нужно и работать как с обычным диском.
0
|
|
|
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,609
|
||
| 26.07.2017, 01:28 | ||
|
И кому больше делать нечего.
0
|
||
|
0 / 0 / 0
Регистрация: 12.07.2017
Сообщений: 7
|
|
| 26.07.2017, 02:18 [ТС] | |
|
Спасибо за идею с РАМ, однако не все так просто. Про TStream я написал образно, чтобы не усложнять ситуацию и не отклоняться от темы. Конечно же я не гружу содержимое всего файла в ОЗУ. Сейчас я реализовал следующим образом: в кратце FireDAC обращается к файлу с желанием прочитать байты с 0 по 1023, например. Я перехватываю его попытки и загружаю в ОЗУ только первые 128 КБ содержимого файла и отдаю ему те, что нужны из этого сегмента, пока он просит из него. Позже загружаю следующую партию и отдаю оттуда и т.д. А если загружать весь файл, то про чтение больших БД можно забыть...
До этого со всеми компонентами и библиотеками, которые не поддерживают чтение из TStream я работал через перехват, однако с FireDAC он работает не стабильно, вот и ищу другой подход...
0
|
|
|
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,609
|
|
| 26.07.2017, 02:28 | |
|
hy5, Геморрой наше всё?
0
|
|
|
0 / 0 / 0
Регистрация: 12.07.2017
Сообщений: 7
|
|||
| 26.07.2017, 08:49 [ТС] | |||
Добавлено через 9 минут
0
|
|||
|
|
|
| 26.07.2017, 09:38 | |
|
что такое таблица? sqlite это единый файл бд. таблица в файле не может храниться последовательно. скорее всего она рассована по разным страницам - кускам этого файла
из вопроса следует, что вы хотите просто сделать свой сервер SQLite, т.к. существующие созданы для работы с файловой системой. здесь говорится, что можно создать ЧИСТУЮ БД в памяти, но нет упоминания о том, что можно ее туда загрузить Добавлено через 3 минуты часто такие запросы говорят, что в наличии попытка решения известной задачи неизвестным способом все уже придумано до нас нужно только знать настоящую исходную задачу
0
|
|
|
0 / 0 / 0
Регистрация: 12.07.2017
Сообщений: 7
|
|
| 26.07.2017, 09:42 [ТС] | |
|
Конечно не последовательно. Смысл такой: когда вы просматриваете таблицу, например через DBGrid, вы же не грузите ее всю в память ОЗУ. Вот мне нужно то же самое, только для TStream. Я пишу просмотр удаленных файлов SQLite.
Использовать FireDAC не обязательно. Подойдет любой компонент, у которого есть что-то типа: OnGetFileSize OnReadFile(AStart, ASize: Int64; Dest: buffer) Ну или может я вообще не в том направлении ищу, может какое-то другое решение подскажите. Добавлено через 2 минуты Абсолютно с Вами согласен: я на это и надеюсь, что все придумано давно до меня и велосипед изобретать не прийдется. Исходная задача: просмотр удаленного файла SQLite. То есть файла на диске нет, но я могу читать его содержимое (частями, само собой) в память
0
|
|
|
|
|
| 26.07.2017, 10:23 | |
|
когда вы просматриваете таблицу через ДБГрид, вы сначала загружаете данные в датасет посредством SQL запроса. этот запрос через драйвер поступает на сервер (в данном случае драйвер и сервер живут в одной длл), сервер разбирает запрос и смотрит в таблицу размещения "страниц бд" и формирует запрос на скачивание этой страницы в буфер. Менеджер страниц формирует запрос к ОС которая лазит по файлу и скачивает указанные сектора этого файла в буфер, чтобы собрать нужные страницы.
Итого из разрозненных кусочков собирается цельный блок данных, который передается клиенту. Никакой другой "таблицы" бд не существует. Конечно может SQLite устроены как-то по-другому и все таблицы в ней лежат непрерывно одним куском, но чо-то крестьяне сомневаюццо
0
|
|
|
0 / 0 / 0
Регистрация: 12.07.2017
Сообщений: 7
|
|
| 26.07.2017, 10:36 [ТС] | |
|
Вы все правильно объяснили, я и не отрицаю, что чтение БД как-то по-другому работает. Вопрос ведь не об этом. В конечном счете обработчик БД обращается к файлу и читает из него содержимое: сначала несколько секторов вначале файла, чтобы определить структуру БД, потом вытягивает из середины файла сектора с необходимым содержимым и т.д. Вот я и надеюсь найти компонент, который кроме
FileName="C:\1.db" будет поддерживать еще чтение из памяти, типа OnGetFileContent(const Start, Size; var Buffer)
0
|
|
|
Айлурофил
|
|
| 26.07.2017, 19:43 | |
|
SQLite распространяется с открытым кодом. Можно взять исходник, переделать место, где происходит физическое чтение из файла, и заменить на чтение из потока. И пользоваться. С надо знать только.
http://www.sqlite.org/download.html
1
|
|
|
0 / 0 / 0
Регистрация: 12.07.2017
Сообщений: 7
|
|
| 26.07.2017, 20:51 [ТС] | |
|
Большое спасибо! Я искал что-то подобное, но на Delphi, чтобы добраться к моменту чтения с файла. К сожалению, у FireDAC этого нельзя сделать, т.к. весь код ведет к скомпилированным библиотекам. Если не найду компонент чтения SQLite с полностью открытым кодом, будут копать в сторону Вашего совета...
0
|
|
|
|
|
| 27.07.2017, 06:35 | |
|
нет никакого открытого кода кроме того, что предоставляют разработчики
все остальные обращаются к драйверу. На windows это DLL на андроиде насколько я понимаю, нечто встроенное в систему, но идея та же\
0
|
|
|
Айлурофил
|
|
| 27.07.2017, 12:13 | |
|
По ссылке пройди, можешь скачать исходник этой DLL на C.
0
|
|
| 27.07.2017, 12:13 | |
|
Помогаю со студенческими работами здесь
17
Как подключить готовую базу Sqlite на проект Как загрузить базу на сервер? Как загрузить картинку в базу? Как загрузить данные в базу Access Как загрузить картинки в базу данных? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
Символьное дифференцирование
igorrr37 13.02.2026
/ *
Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2).
Унарный минус обозначается как !
*/
#include <iostream>
#include <stack>
#include <cctype>. . .
|
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
|
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу,
и светлой Луне.
В мире
покоя нет
и люди
не могут жить в тишине.
А жить им немного лет.
|
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила»
«Время-Деньги»
«Деньги -Пуля»
|
|
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога
Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога
Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
|
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога
Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
|
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
|