Форум программистов, компьютерный форум, киберфорум
Pure Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/26: Рейтинг темы: голосов - 26, средняя оценка - 4.54
 Аватар для logincyberforu
30 / 31 / 0
Регистрация: 26.08.2013
Сообщений: 282

Изображения в sqlite

13.09.2013, 07:10. Показов 4983. Ответов 21
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Вобщем проблема с изображениями в базе данных...
Описывать проблему не буду так как сложновато будет, но попрошу пример вида:

есть картинка с путём imgfile
есть бд с путём file
есть таблица table с колонкой img
нужно поместить картинку imgfile в таблицу table в ячеку 1,img
затем нужно извлечь картинку и нарисовать её
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
13.09.2013, 07:10
Ответы с готовыми решениями:

Сохранение изображения в БД SQLite
Народ поскажите как сохранить изображение в БД и главное как эго потом от туда достать. А то уже перелопатил кучу кода ве никак не...

Android: Сохранение и загрузка изображения в/из SQLite
Доброго времени суток. Необходимо записать в базу только что нарисованное изображение на canvas. В базу записываю как byte. Тип в SQLite...

Как написать формулы в sqlite или отказаться от использования sqlite вовсе
Доброго времени суток. Друзья, пишу справочник по физике, недавно столкнулся с проблемой - как написать формулы в sqlite? пользуюсь DB...

21
Эксперт по электронике
6569 / 3196 / 335
Регистрация: 28.10.2011
Сообщений: 12,475
Записей в блоге: 7
13.09.2013, 10:30
В этом примере есть подобные функции (загрузка картинки в базу данных, извлечение из нее и отображение в окне).
Чем он не подошел?
1
 Аватар для logincyberforu
30 / 31 / 0
Регистрация: 26.08.2013
Сообщений: 282
13.09.2013, 11:25  [ТС]
locm, да, да видел я этот пример но он черезчур мудрёный, да и там размер места освобождаемого в памяти идёт отдельной ячейкой...
Вобщем тот пример нечитабелен для меня, если не трудно то можеш написать код по вышенаписаному образцу?
0
Эксперт по электронике
6569 / 3196 / 335
Регистрация: 28.10.2011
Сообщений: 12,475
Записей в блоге: 7
13.09.2013, 14:40
Лучший ответ Сообщение было отмечено как решение

Решение

То есть нужен пример, чем проще тем лучше?
Тогда вот.

Добавление картинки в базу (файл Test.png должен находится в одной папке с прогой).
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
UseSQLiteDatabase()
 
If CreateFile(0, "db.sqlite")
  CloseFile(0)
  
  
  If OpenDatabase(0, "db.sqlite", "", "", #PB_Database_SQLite)
    If DatabaseUpdate(0, "CREATE TABLE mytable (img BLOB)")
      
      ; Добавление картинки в базу.
      If ReadFile(0, "Test.png")
        
        Size = Lof(0)
        If Size>0
          
          *Point = AllocateMemory(Size)
          If *Point
            
            ReadData(0, *Point, Size) ; Считали картинку с диска в память.
            
            SetDatabaseBlob(0, 0, *Point, Size)
            
            ; Добавление картинка в базу.
            If DatabaseUpdate(0, "INSERT INTO mytable (img) VALUES (?)")
              MessageRequester("ОК", "Картинка добавлена в базу")
            Else
              MessageRequester("Ошибка DatabaseUpdate", DatabaseError())
            EndIf
            
            FreeMemory(*Point)
            
          Else
            MessageRequester("Ошибка", "Не удалось получить блок памяти")
          EndIf
          
        Else
          MessageRequester("Ошибка", "Файл-картинка должен быть не нулевого размера")
        EndIf
        
        CloseFile(0)
        
      Else
        MessageRequester("Ошибка", "Не удалось открыть файл-картинку")
      EndIf
      
    Else
      MessageRequester("Ошибка базы данных", "Не удалось создать таблицу"+#CRLF$+DatabaseError())
    EndIf
  Else
    MessageRequester("Ошибка открытия базы данных", DatabaseError())
  EndIf
  
  CloseDatabase(0)
  
Else
  MessageRequester("Ошибка", "Не удалось создать файл")
EndIf
Отображение в окне картинки из базы.
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
UseSQLiteDatabase()
UsePNGImageDecoder()
 
If OpenDatabase(0, "db.sqlite", "", "", #PB_Database_SQLite)
  If DatabaseQuery(0, "Select * FROM mytable")
    
    If FirstDatabaseRow(0) ; Выбираем первую колонку.
      
      Size = DatabaseColumnSize(0, 0)
      If Size>0
        
        *Point = AllocateMemory(Size)
        If *Point
          
          If GetDatabaseBlob(0, 0, *Point, Size)
            
            If CatchImage(0, *Point, Size)=0
              MessageRequester("Ошибка", "Не удалось загрузить картинку")
            EndIf
            
          Else
            MessageRequester("Ошибка GetDatabaseBlob", DatabaseError())
          EndIf
        
          FreeMemory(*Point)
      
        Else
          MessageRequester("Ошибка", "Не удалось получить блок памяти")
        EndIf
        
      Else
        MessageRequester("Ошибка DatabaseColumnSize", DatabaseError())
      EndIf
      
    Else
      MessageRequester("Ошибка FirstDatabaseRow", DatabaseError())
    EndIf
    
  Else
    MessageRequester("Ошибка DatabaseQuery", DatabaseError())
  EndIf
  
  CloseDatabase(0)
  
Else
  MessageRequester("Ошибка открытия базы данных", DatabaseError())
EndIf
 
 
 
If IsImage(0) ; ОК. Картинка из базы загружена.
  
  ImWidth = ImageWidth(0) ; Ширина картинки.
  ImHeight = ImageHeight(0) ; Высота картинки.
  
  OpenWindow(0, 0, 0, 400, 400, "", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
  ScrollAreaGadget(0, 0, 0, 400, 400, ImWidth, ImHeight)
  ImageGadget(1, 0, 0, ImWidth, ImHeight, ImageID(0))
  CloseGadgetList()
  
  Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
  
EndIf
3
 Аватар для logincyberforu
30 / 31 / 0
Регистрация: 26.08.2013
Сообщений: 282
15.09.2013, 18:29  [ТС]
locm, спасибо, почти помогло: но есть ешё одна неясность,- в склите на сколько я знаю, поля имеют чисто символическую типизацию (то есть в колонку с типом нумерик можно поместить текст) ну и как следствие вышеприведённый код отказывается работать если в колонке есть текст, хотя остальные ячейки имеют формат блоб.
Ну и соответственно просьба: изменить вторую часть кода чтобы она брала в качестве исходного текстовую переменную со значением блоб типа txt.s=??? то есть картинка находится в текстовой переменной.
И по возможности нужно определить в переменной текст или блоб....

Сам додуматься пробывал... но как видно безрезультатно....
0
Эксперт по электронике
6569 / 3196 / 335
Регистрация: 28.10.2011
Сообщений: 12,475
Записей в блоге: 7
15.09.2013, 18:50
Картинка это бинарные данные и их далеко не всегда можно хранить в текстовой переменной, поскольку она нуль-терминированная.
Тип колонки можно узнать используя функцию DatabaseColumnType().
Хотя честно не понимаю какие именно возникли проблемы, ведь в этом коде, в базе хранится как текст, так и бинарные данные (Blob) и проблем не возникает.

Лучше выложите ваш код который не работает как задумано.
0
 Аватар для logincyberforu
30 / 31 / 0
Регистрация: 26.08.2013
Сообщений: 282
15.09.2013, 19:51  [ТС]
locm, на врятли я смогу найти версию кода которую пытался "оживить" так как сохраняю только рабочие фрагменты. Что касается функции DatabaseColumnType() то она почемуто всегда возвращает тип "text" вне зависимости от поля,- даже индексные столбцы с автоинкрементом она возвращает как текст, поэтому я решил что определение типа средствами пб невозможно. Но что касается кода то помню что команда DatabaseColumnSize(0, 0) возвращала ноль, где естественно 0,0 были изменены на рабочие. Но и естественно работа данной функции не совсем ясна так как исходя из описания она возвращает размер столбца а не ячейки. При попытке обхода, то есть к примеру принуддительном создании размера освобождаемой памяти в 100 кб код вылетал на следующих строках.
Но буду откровенен,- я совершенно не представляю как работает данный код, поэтому не исключаю вероятность своей ошибки...
Цитата Сообщение от locm Посмотреть сообщение
нуль-терминированная
для меня это абракадабра, в таком случае мб стоит изначально текст определять как блоб а уж затем переводить его в текстовую переменную?
0
Эксперт по электронике
6569 / 3196 / 335
Регистрация: 28.10.2011
Сообщений: 12,475
Записей в блоге: 7
15.09.2013, 21:29
Цитата Сообщение от logincyberforu Посмотреть сообщение
Что касается функции DatabaseColumnType() то она почемуто всегда возвращает тип "text" вне зависимости от поля,- даже индексные столбцы с автоинкрементом
Наверное что-то не так делаете. Я же не зря просил показать код.
Функция DatabaseColumnType() работает нормально (база данных должна быть создана с помощью этого кода).
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
UseSQLiteDatabase()
If OpenDatabase(0, "db.sqlite", "", "", #PB_Database_SQLite)
  If DatabaseQuery(0, "Select * FROM mytable")
    FirstDatabaseRow(0)
    Select DatabaseColumnType(0, 0)
      Case #PB_Database_Long   : Debug "Long"
      Case #PB_Database_String : Debug "String"
      Case #PB_Database_Float  : Debug "Float"
      Case #PB_Database_Double : Debug "Double"
      Case #PB_Database_Quad   : Debug "Quad"
      Case #PB_Database_Blob   : Debug "Blob"
      Default                  : Debug "Неизвестный тип"
    EndSelect
  Else
    MessageRequester("Ошибка DatabaseQuery", DatabaseError())
  EndIf
Else
  MessageRequester("Ошибка открытия базы данных", DatabaseError())
EndIf
End
Цитата Сообщение от logincyberforu Посмотреть сообщение
Но что касается кода то помню что команда DatabaseColumnSize(0, 0) возвращала ноль, где естественно 0,0 были изменены на рабочие. Но и естественно работа данной функции не совсем ясна так как исходя из описания она возвращает размер столбца а не ячейки.
Она возвращает размер колонки (ячейки).
Цитата Сообщение от logincyberforu Посмотреть сообщение
для меня это абракадабра
http://ru.wikipedia.org/wiki/Н... ная_строка

Цитата Сообщение от logincyberforu Посмотреть сообщение
мб стоит изначально текст определять как блоб а уж затем переводить его в текстовую переменную?
Зачем? Если что-то работает не так, как задумано, то прежде чем искать обходные пути нужно разобраться почему не работает. Возможно причина в ошибке в коде.
0
 Аватар для logincyberforu
30 / 31 / 0
Регистрация: 26.08.2013
Сообщений: 282
16.09.2013, 19:56  [ТС]
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
opentable:
; проверка на открытие бд
Debug "opentable"
UseSQLiteDatabase()
If IsDatabase(1) 
    CloseDatabase(1)
EndIf
If OpenDatabase(1,file.s,"","",#PB_Database_SQLite) And IsDatabase(1)
 Else
    MessageRequester(_open_error,DatabaseError())
    Goto start
 EndIf
 ; получаем содержание всей бд и очищаем гаджеты
 DatabaseQuery(1, "SELECT * FROM '"+table+"'")
 For i=1 To 10000
    If IsGadget(i)
        FreeGadget(i)
        EndIf
        Next
; получаем именя столбцов 
col=DatabaseColumns(1)
Dim name.s(col)
For i=1 To col
    name(i) = DatabaseColumnName(1,i-1)
    If name(i)=tableindex
        innom=i
        EndIf
Next
 
; создаём двумерный масив со значением всех ячеек вида масив(колонка,строка)
row=0
 
While NextDatabaseRow(1) 
    row=row+1
    For num=1 To col    
        tx.s (num,row) = GetDatabaseString(1, num-1)
        
Next
Wend
 
; не помню зачем это
For i=1 To 100
    For c=1 To 100
If IsGadget(i*100+c)
    FreeGadget(i*100+c)
    EndIf
        Next
    Next
; выводим на экран содержимое масива, в данном случае текст выводится в текстовом поле, и картинка должна вывестись как картинка
For i=1 To col
    For c=1 To row
        size=DatabaseColumnSize(1, i)
        If size>0 ; всегда возвращает ноль, для любых баз данных
             *Point = AllocateMemory(size)
          
           GetDatabaseBlob(1, i, *Point, DatabaseColumnSize(1, i))
            
             CatchImage(0, *Point, Size)
 
          FreeMemory(*Point)
 
  
 
 
 
          IsImage(0) ; ОК. Картинка из базы загружена.
          
  
  ImWidth = ImageWidth(0) ; Ширина картинки.
  ImHeight = ImageHeight(0) ; Высота картинки.
  
  
  ImageGadget(1, (i-1)*55,c*20, ImWidth, ImHeight, ImageID(0))
            Else
                StringGadget(i*100+c,(i-1)*55,c*20,54,19,tx.s(i,c)); вывод текстового поля
            EndIf
            
 
    Next
Next
; опциональный код для смены размера окна
SetGadgetAttribute(0,#PB_ScrollArea_InnerWidth,(col+0)*55)
SetGadgetAttribute(0,#PB_ScrollArea_InnerHeight,(row+1)*20)
 
 
For i=1 To col
    TextGadget(i,(i-1)*55+2,0,54,18,name(i)); выводим имена столбцов как теест
Next
 
Return
то есть в этом коде происходит двойной цикл,- цикл столбцов и цикл строк. Где попытался сделать проверку на то что находится в переменной но ни одна картинка проверку не прошла... видимо гдето нужно сделать смену формата переменной как блоб....
короче я попытался тупо впихнуть твой код в мой, но не полуилось...

Добавлено через 4 минуты
оо у меня типа озарение,- я из базы беру строку, а не блоб, нужно либо брать блоб либо гденить преобразовывать текст в блоб, то есть нужен ещё один фильтр и соответственно ещё один масив для хранения блоб значений.... но сегодня проверять не буду,- устал неимоверно, еле еле сил на интернет хватает
0
Эксперт по электронике
6569 / 3196 / 335
Регистрация: 28.10.2011
Сообщений: 12,475
Записей в блоге: 7
16.09.2013, 20:59
В коде нужно после выбора таблицы и перед работой с колонками (ячейками), указать желаемую строку (Row).
PureBasic
1
2
3
4
If OpenDatabase(0, "db.sqlite", "", "", #PB_Database_SQLite) ; Открыли базу данных.
 If DatabaseQuery(0, "Select * FROM mytable") ; Выбрали таблицу в базе.
  FirstDatabaseRow(0) ; Выбрали первую строку.
  Select DatabaseColumnType(0, 0) ; Получили информацию об колонке (ячейке), выбранной строки и выбранной таблицы
Цитата Сообщение от logincyberforu Посмотреть сообщение
но ни одна картинка проверку не прошла
Это потому что нет текущей выбранной строки в базе.
Код проверки должен быть внутри этого цикла.
PureBasic
1
2
3
While NextDatabaseRow(1)
; Тут код работающий с колонками (ячейками) базы.
Wend
0
 Аватар для logincyberforu
30 / 31 / 0
Регистрация: 26.08.2013
Сообщений: 282
19.09.2013, 07:13  [ТС]
locm, сделал всё по рекомендациям, но на этот раз функция CatchImageвозвращает ноль...
есть вот такой код
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
DatabaseQuery(1, "SELECT * FROM '"+table+"'")
history=history+Chr(10)+"SELECT * FROM '"+table+"'"
col=DatabaseColumns(1)
Dim name.s(col)
Dim typ.s(col)
For i=1 To col
    name(i) = DatabaseColumnName(1,i-1)
    Select DatabaseColumnType(1,i-1)
        Case #PB_Database_Long
            typ(i) = "long"
        Case #PB_Database_String
            typ(i) = "string"
        Case #PB_Database_Float
            typ(i) = "float"
        Case #PB_Database_Double
            typ(i) =  "double"
        Case #PB_Database_Quad
            typ(i) = "quad"
        Case #PB_Database_Blob
            typ(i) = "blob"
    EndSelect
    Debug typ(i)
    TextGadget(i,(i-1)*wg+2,0,wg-1,ww-1,name(i))
Next
 
 glDBSQLite=1
gad=100
row=0
FirstDatabaseRow(1)
While NextDatabaseRow(1) 
    row=row+1
    For num=1 To col
            
        y=0
        If typ(num)="blob"
            Size = DatabaseColumnSize(1, num)
      If Size > 0
        *Memory = AllocateMemory(Size)
       FillMemory(*Memory,Size,Val(txt(row,num)),#PB_Byte)
        Image = CatchImage(#PB_Any, *Memory, Size)
        Debug CatchImage(#PB_Any, *Memory, Size)
        If IsImage(Image)
            Debug "ok"
            ImageGadget(gad,num*wg-wg,row*ww,wg-1,ww-1,ImageID(gad))
            y=1
        EndIf 
      EndIf
    EndIf
    
            If y=0
        txt (row,num) = GetDatabaseString(1, num-1)
        StringGadget(gad,num*wg-wg,row*ww,wg-1,ww-1,txt(row,num))
        EndIf 
        gad=gad+1
    Next
Wend
0
Эксперт по электронике
6569 / 3196 / 335
Регистрация: 28.10.2011
Сообщений: 12,475
Записей в блоге: 7
19.09.2013, 09:55
Цитата Сообщение от logincyberforu Посмотреть сообщение
функция CatchImageвозвращает ноль
Цитата Сообщение от logincyberforu Посмотреть сообщение
PureBasic
1
2
3
*Memory = AllocateMemory(Size)
FillMemory(*Memory,Size,Val(txt(row,num)),#PB_Byte)
Image = CatchImage(#PB_Any, *Memory, Size)
И не удивительно. В памяти в место данных - мусор (откройте справку и прочитайте описание функций FillMemory() и Val() и поймете почему)!
Более того, из базы даже не извлекаются данные!
Должно быть.
PureBasic
1
2
3
*Memory = AllocateMemory(Size)
GetDatabaseBlob(1, num, *Memory, Size)
Image = CatchImage(#PB_Any, *Memory, Size)
Весь код.
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
DatabaseQuery(1, "SELECT * FROM '"+table+"'")
history=history+Chr(10)+"SELECT * FROM '"+table+"'"
col=DatabaseColumns(1)
 
glDBSQLite=1
gad=100
row=0
Dim name.s(col)
Dim typ.s(col)
 
While NextDatabaseRow(1) 
  row=row+1
  For num=1 To col
    
    i=num
    name(i) = DatabaseColumnName(1,i-1)
    Select DatabaseColumnType(1,i-1)
      Case #PB_Database_Long
        typ(i) = "long"
      Case #PB_Database_String
        typ(i) = "string"
      Case #PB_Database_Float
        typ(i) = "float"
      Case #PB_Database_Double
        typ(i) =  "double"
      Case #PB_Database_Quad
        typ(i) = "quad"
      Case #PB_Database_Blob
        typ(i) = "blob"
    EndSelect
    Debug typ(i)
    TextGadget(i,(i-1)*wg+2,0,wg-1,ww-1,name(i))
    
    ;y=0
    If typ(num)="blob"
      Size = DatabaseColumnSize(1, num)
      If Size > 0
        *Memory = AllocateMemory(Size)
        GetDatabaseBlob(1, num, *Memory, Size)
        Image = CatchImage(#PB_Any, *Memory, Size)
        Debug Image
        If IsImage(Image)
          Debug "ok"
          ImageGadget(gad,num*wg-wg,row*ww,wg-1,ww-1,ImageID(gad))
          ;y=1
        EndIf 
      EndIf
    EndIf
    
    If typ(num)="string"
      txt (row,num) = GetDatabaseString(1, num-1)
      StringGadget(gad,num*wg-wg,row*ww,wg-1,ww-1,txt(row,num))
    EndIf 
    gad=gad+1
  Next
Wend
0
 Аватар для logincyberforu
30 / 31 / 0
Регистрация: 26.08.2013
Сообщений: 282
19.09.2013, 10:33  [ТС]
locm, извиняюсь конечно, но поправки результата не дали, всё равно ноль... прикрепил код целиком, мб гдето в ином месте накосячил.... а FillMemory от безысходности пытался впихнуть вместо GetDatabaseBlob, так как пример применения GetDatabaseBlob совершенно не похож на то что в справке о ней написано...
Пробовал на разных бд, в смысле на созданых разными программами, положительного эфекта не наблюдается....
Вложения
Тип файла: zip Новая сжатая ZIP-папка.zip (6.9 Кб, 11 просмотров)
0
Эксперт по электронике
6569 / 3196 / 335
Регистрация: 28.10.2011
Сообщений: 12,475
Записей в блоге: 7
19.09.2013, 11:20
Цитата Сообщение от logincyberforu Посмотреть сообщение
извиняюсь конечно, но поправки результата не дали, всё равно ноль
Я конечно тоже извиняюсь, но в выложенном коде (2.pb) нет этого участка кода.
Вообще при разработке программы, нужно понимать что делаете, а не просто подставлять разные команды - а вдруг заработает.

Цитата Сообщение от logincyberforu Посмотреть сообщение
пример применения GetDatabaseBlob совершенно не похож на то что в справке о ней написано
Там написано.
Возвращает содержимое указанной колонки базы данных #Database в виде указателя на блоб в памяти.
И если подумать логически, данные, записаны в базу с помощью SetDatabaseBlob(), нужно читать используя GetDatabaseBlob().
Вложения
Тип файла: zip 2.zip (3.6 Кб, 14 просмотров)
1
 Аватар для logincyberforu
30 / 31 / 0
Регистрация: 26.08.2013
Сообщений: 282
19.09.2013, 11:46  [ТС]
locm, YAHOO заработало, спс. Про GetDatabaseBlob имелось ввиду
PureBasic
1
2
3
Синтаксис
 
Result = GetDatabaseBlob(#Database, Column)
, по крайней мере так она описана в моей справке....

На счёт отсутствия кода,- выложил весь код так как думал что напортачил гдето в коде типа дважды переменные использовал и тп, отсутствие же кода объясняется тем что пытаюсь сохранять более-менее рабочие версии.

Цитата Сообщение от locm Посмотреть сообщение
Вообще при разработке программы, нужно понимать что делаете, а не просто подставлять разные команды - а вдруг заработает
вообщето верно, но если совершенно не представляеш каким образом это сделать, то есть два варианта: либо попытаться применить пример в слепую либо обратиться на форум... ну и мои познания в програмировании не на столько сильны чтобы свободно работать с областями памяти, темболее в новом для меня языке...
0
Эксперт по электронике
6569 / 3196 / 335
Регистрация: 28.10.2011
Сообщений: 12,475
Записей в блоге: 7
19.09.2013, 16:11
Может этот пример поможет понять как работать с базой. Он показывает все таблицы их содержимое.
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
#Color_Long    = $FFC3BC
#Color_String  = $D5FFCD
#Color_Float   = $CDF9FF
#Color_Double  = $FFFDCD
#Color_Quad    = $E9CDFF
#Color_Blob    = $E3DFD3
#Color_Unknown = $7979FF
 
; Получение списка таблиц в базе.
Procedure GetTables(Database, Gadget)
  Protected i, Count
  
  ClearGadgetItems(Gadget)
  
  If DatabaseQuery(Database, "select name from sqlite_master WHERE type='table' ORDER BY name;")
    Count=DatabaseColumns(Database)-1
    FirstDatabaseRow(Database)
    For i=0 To Count
      AddGadgetItem(Gadget, i, GetDatabaseString(Database, i))
    Next i
    Count+1
    FinishDatabaseQuery(Database)
  EndIf
  
  ProcedureReturn Count
EndProcedure
 
 
Procedure CountListIconColumns(Gadget_ID) ; count columns 
  Protected hHdr, lResult 
  hHdr    = SendMessage_(Gadget_ID,#LVM_GETHEADER,0,0) 
  lResult = SendMessage_(hHdr,#HDM_GETITEMCOUNT,#Null,#Null) 
  ProcedureReturn lResult 
EndProcedure 
 
 
; Простотр выбранной таблицы
Procedure TableView(Database, Gadget, Table.s)
  Protected i, Count, Row, String.s, Color
  
  ClearGadgetItems(Gadget)
  Count = CountListIconColumns(GadgetID(Gadget))
  
  For i=0 To Count
    RemoveGadgetColumn(Gadget, 0)
  Next
  
  If Table<>""
    If DatabaseQuery(0, "Select * FROM "+Table)
      
      Count=DatabaseColumns(Database)-1 ; Число колонок в таблице.
      For i=0 To Count
        AddGadgetColumn(Gadget, i, "Ячейка "+Str(i+1), 80)
      Next
      
      Row=0
      While NextDatabaseRow(Database) 
        
        ;String=""
        AddGadgetItem(Gadget, Row, "")
        
        For i=0 To Count
          Select DatabaseColumnType(Database, i)
            Case #PB_Database_Long
              String=Str(GetDatabaseLong(Database, i))
              Color = #Color_Long
            Case #PB_Database_String
              String=GetDatabaseString(Database, i)
              Color = #Color_String
            Case #PB_Database_Float
              String=StrF(GetDatabaseFloat(Database, i))
              Color = #Color_Float
            Case #PB_Database_Double
              String=StrD(GetDatabaseDouble(Database, i))
              Color = #Color_Double
            Case #PB_Database_Quad
              String=Str(GetDatabaseQuad(Database, i))
              Color = #Color_Quad
            Case #PB_Database_Blob 
              String="Данные ("+Str(DatabaseColumnSize(Database, i))+" байт)"
              Color = #Color_Blob
            Default
              String="????"
              Color = #Color_Unknown
          EndSelect
          
          SetGadgetItemText(Gadget, Row, String, i)
          SetGadgetItemColor(Gadget, Row, #PB_Gadget_BackColor, Color, i)
          
        Next i
        
        Row+1
      Wend
      
    EndIf
  EndIf
  
EndProcedure
 
 
Procedure CreateInfo(Image, Width, Height) ; Создание картинки с подсказкой о цветах в таблице.
  Protected ImageID, x
  
  LoadFont(0, "Tahoma", 8)
  
  If CreateImage(Image, Width, Height, 32)
    If StartDrawing(ImageOutput(Image))
      
      DrawingMode(#PB_2DDrawing_AlphaChannel) ; Работа только а альфа-каналом
      Box(0, 0, OutputWidth(), OutputHeight(), RGBA(0, 0, 0, 0)) ; Теперь картинка прозрачаная.
      
      DrawingMode(#PB_2DDrawing_Transparent|#PB_2DDrawing_AlphaBlend)
      FrontColor(RGBA(0, 0, 0, 255))
      DrawingFont(FontID(0))
      
      x=0
      Box(x, 4, 14, 14)
      Box(x+1, 5, 12, 12, #Color_Long | $FF000000) : x+20
      x = DrawText(x, 4,"Long") + 8
      
      Box(x, 4, 14, 14)
      Box(x+1, 5, 12, 12, #Color_String | $FF000000) : x+20
      x = DrawText(x, 4,"String") + 8
      
      Box(x, 4, 14, 14)
      Box(x+1, 5, 12, 12, #Color_Float | $FF000000) : x+20
      x = DrawText(x, 4,"Float") + 8
      
      Box(x, 4, 14, 14)
      Box(x+1, 5, 12, 12, #Color_Double | $FF000000) : x+20
      x = DrawText(x, 4,"Double") + 8
      
      Box(x, 4, 14, 14)
      Box(x+1, 5, 12, 12, #Color_Quad | $FF000000) : x+20
      x = DrawText(x, 4,"Quad") + 8
      
      Box(x, 4, 14, 14)
      Box(x+1, 5, 12, 12, #Color_Blob | $FF000000) : x+20
      x = DrawText(x, 4,"Blob") + 8
      
      Box(x, 4, 14, 14)
      Box(x+1, 5, 12, 12, #Color_Unknown | $FF000000) : x+20
      DrawText(x, 4,"Не поддерживаемый тип")
      
      StopDrawing()
      ImageID=ImageID(Image)
    EndIf
  EndIf
  
  FreeFont(0)
  
  ProcedureReturn ImageID
EndProcedure
 
UseSQLiteDatabase()
 
OpenWindow(0, 0, 0, 700, 400, "SQLiteView", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
 
ButtonGadget(0, 10, 10, 100, 24, "Открыть базу")
ListViewGadget(1, 10, 40, 100, 350)
ImageGadget(2, 120, 10, 570, 24, CreateInfo(0, 570, 24))
ListIconGadget(3, 120, 40, 570, 350, "Ячейка 1", 70, #PB_ListIcon_MultiSelect|#PB_ListIcon_GridLines)
SendMessage_(GadgetID(3), #LVM_SETEXTENDEDLISTVIEWSTYLE, #LVS_EX_LABELTIP|#LVS_EX_GRIDLINES, 
             #LVS_EX_LABELTIP|#LVS_EX_GRIDLINES)  
 
Repeat
  Event = WaitWindowEvent()
  
  If Event = #PB_Event_Gadget
    Select EventGadget()
      Case 0
        Path.s=OpenFileRequester("", "", "*.sqlite|*.sqlite", 0)
        If Path
          
          ClearGadgetItems(1)
          
          If IsDatabase(0)
            CloseDatabase(0)
          EndIf
          
          If OpenDatabase(0, Path, "", "", #PB_Database_SQLite)
            If GetTables(0, 1)>0
              SetGadgetState(1, 0)
              TableView(0, 3, GetGadgetItemText(1, 0))
            EndIf
          Else
            MessageRequester("Ошибка открытия базы данных", DatabaseError())
          EndIf
          
        EndIf
        
      Case 1
        
        Pos = GetGadgetState(1)
        If Pos>0
          TableView(0, 3, GetGadgetItemText(1, Pos))
        EndIf
        
      EndSelect
  EndIf
  
Until Event = #PB_Event_CloseWindow
1
 Аватар для logincyberforu
30 / 31 / 0
Регистрация: 26.08.2013
Сообщений: 282
19.09.2013, 19:58  [ТС]
locm, Пример смахивает на заготовку библиотеки, ну и прокоментирую его с нубского взгляда и с расчётом того что это когда либо станет библиотекой,-
1) первая процедура которая нужна это получение списка юзерских таблиц (то есть с вычетом системных) и как я понимаю результат нужен в масиве
2) вторая процедура должна возвращать список столбцов таблицы по ходу тоже в масиве
3) третья, желательно получить список типов, соответствующих масиву имён столбцов таблицы
4) нужен масив строки, то есть по запросу procedure(db,num) возвращается масив или лист строки
5) нужен масив столбца, то есть по запросу типа procedure(db,num) или procedure(db,name) возвращается масив столбца
6) процедура по возвращению ячейки типа procedure(num,num) или procedure(num,name) возвращает переменную и её тип
7) ну и завершающий этап это фильтр ввода переменной, то есть допустим тип столбца "текст" но пользователь вводит блоб то должно высвечиваться предупреждение. И отказ в принятии переменной если тип столбца не приемлит её.(типа нум не приемлит текст)
8) ну и былобы вааще шикарно еслибы была процедура по возврату изображения из столбцов разного типа.
(то есть суть темы решена на половину,- склтитепрофесионал прячет картинки в формате quad которые я не могу увидеть)
9) опционально. получить в результате список системных таблиц
10) ну и выбор кодировки, тоже не помешает...
11) ну и какой-никакой вывод ошибок тоже не лишний, если в нутри процедуры попытаться устранить ошибку, типа переход к следующему драйверу (или как его там) по работе с базами

ну вот как то так по моему должна выглядеть библа по работе с склите.....

в примере же, к примеру TableView(Database, Gadget, Table.s) непонятно что под гаджетом понимается...

то есть суть моего поста, пойми правильно, не в коем случае не критикую, но есть мелкие недоработки из-за которых данный код будет пылиться как образец. но всётаки бы хотелось бы иметь библу которую будет удобно использовать всем кто хоть поверхностно знаком с таблицами.

данный же код сложен, по крайней мере для меня так как ещё нет полуночи возможно по тому что он использовался как составная часть иного кода, либо по недостаточным комментам....
0
Эксперт по электронике
6569 / 3196 / 335
Регистрация: 28.10.2011
Сообщений: 12,475
Записей в блоге: 7
19.09.2013, 20:41
Цитата Сообщение от logincyberforu Посмотреть сообщение
1) первая процедура которая нужна это получение списка юзерских таблиц (то есть с вычетом системных) и как я понимаю результат нужен в масиве
Имеющийся код не сложно переделать чтобы результат был в массиве. Например, первая процедура.
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
; Получение списка таблиц в базе.
Procedure GetTables(Database, Array TablesName.s(1))
  Protected i, Count
  
  ; Запрос к базе
  If DatabaseQuery(Database, "select name from sqlite_master WHERE type='table' ORDER BY name;")
    
    Count=DatabaseColumns(Database) ; Количество таблиц в базе.
    ReDim TablesName(Count)    ; Устанавливаем размер массива, равным числу таблиц в базе.
    FirstDatabaseRow(Database) ; Первая строка в базе (в ней хранятся имена таблиц).
    For i=0 To Count-1
      TablesName(i) = GetDatabaseString(Database, i) ; Запись в массив имен таблиц.
    Next i
    FinishDatabaseQuery(Database) ; Освобождение ресурсов, выделенных в DatabaseQuery().
  EndIf
  
  ProcedureReturn Count
EndProcedure
Ее использование.
PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
UseSQLiteDatabase()
 
Dim Name.s(0)
 
If OpenDatabase(0, "db.sqlite", "", "", #PB_Database_SQLite)
  
  Count = GetTables(0, Name())
  Debug "Число таблиц "+Str(Count)
  
  If Count>0
    For i=0 To Count-1
      Debug Name(i)
    Next
  EndIf
  
Else
  MessageRequester("Ошибка открытия базы данных", DatabaseError())
EndIf
Цитата Сообщение от logincyberforu Посмотреть сообщение
в примере же, к примеру TableView(Database, Gadget, Table.s) непонятно что под гаджетом понимается
В данном случае, понимается ListIconGadget - таблица в окне, в которой отображаются данные из базы.
0
 Аватар для logincyberforu
30 / 31 / 0
Регистрация: 26.08.2013
Сообщений: 282
19.09.2013, 20:48  [ТС]
locm, теперь понятно, но думаю результат лучше в масиве так как с масивом проще работать...

и еще вопрос, но савсем не в тему,- откуда получать значения типа "кодировка таблицы" ,"максимальный вес страницы" и так далее... на сколько я представляю это всй делается по средствам запросов, и в таком случае, если не затруднит можно увидеть список всех возможных запросов? ну и вот такой вопрос,- не знаю даже с какой стороны подойти,- как получить полный список всех возможных системных таблиц?
0
Эксперт по электронике
6569 / 3196 / 335
Регистрация: 28.10.2011
Сообщений: 12,475
Записей в блоге: 7
19.09.2013, 20:53
Эти вопросы уместнее задавать в этом разделе.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
19.09.2013, 20:53
Помогаю со студенческими работами здесь

Файл cookies.sqlite не sqlite на самом деле, или как его открыть
хочу прочитать куки браузеров (это не противозаконно) оперу сделал, хром сделал, у хрома как раз sqlite как и у мозилы делаю...

Sqlite в c++ под linux, как правильно подключить sqlite?
Добрый день. Подскажите пожалуйста, как подключить sqlite к c++? Пишу приложение без сред разработки. в миднайте. есть .cpp файл, .h...

Редактирование связанных объектов через EF в SQLite, C#, EF 6.2, SQLite, C# Winforms
Здравствуйте. Суть: используя вышеперечисленные технологии, при чтении из базы данных связанных объектов после добавления, функция...

SQLite for Excel или как выгрузить данные в SQLite
Здравствуйте! Мне необходимо написать макрос для выгрузки данных из excel в sqlite. Нашла проект SQLite for Excel, но при запуске...

SQLite не найден SQLite.Interop,dll
работаю на виртуальной машине windows 7 x86. Установлен Visual Studio 2013. Через NuGet установил для своего проекта...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
Установка Emscripten SDK (emsdk) и CMake на Windows для сборки C и C++ приложений в WebAssembly (Wasm)
8Observer8 30.01.2026
Чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. Система контроля версиями Git. . .
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru