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

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

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

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

есть картинка с путём 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. В...

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

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

21
Эксперт по электронике
5982 / 2698 / 284
Регистрация: 28.10.2011
Сообщений: 10,185
Записей в блоге: 6
13.09.2013, 10:30 2
В этом примере есть подобные функции (загрузка картинки в базу данных, извлечение из нее и отображение в окне).
Чем он не подошел?
1
30 / 31 / 0
Регистрация: 26.08.2013
Сообщений: 282
13.09.2013, 11:25  [ТС] 3
locm, да, да видел я этот пример но он черезчур мудрёный, да и там размер места освобождаемого в памяти идёт отдельной ячейкой...
Вобщем тот пример нечитабелен для меня, если не трудно то можеш написать код по вышенаписаному образцу?
0
Эксперт по электронике
5982 / 2698 / 284
Регистрация: 28.10.2011
Сообщений: 10,185
Записей в блоге: 6
13.09.2013, 14:40 4
Лучший ответ Сообщение было отмечено как решение

Решение

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

Добавление картинки в базу (файл 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
30 / 31 / 0
Регистрация: 26.08.2013
Сообщений: 282
15.09.2013, 18:29  [ТС] 5
locm, спасибо, почти помогло: но есть ешё одна неясность,- в склите на сколько я знаю, поля имеют чисто символическую типизацию (то есть в колонку с типом нумерик можно поместить текст) ну и как следствие вышеприведённый код отказывается работать если в колонке есть текст, хотя остальные ячейки имеют формат блоб.
Ну и соответственно просьба: изменить вторую часть кода чтобы она брала в качестве исходного текстовую переменную со значением блоб типа txt.s=??? то есть картинка находится в текстовой переменной.
И по возможности нужно определить в переменной текст или блоб....

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

Лучше выложите ваш код который не работает как задумано.
0
30 / 31 / 0
Регистрация: 26.08.2013
Сообщений: 282
15.09.2013, 19:51  [ТС] 7
locm, на врятли я смогу найти версию кода которую пытался "оживить" так как сохраняю только рабочие фрагменты. Что касается функции DatabaseColumnType() то она почемуто всегда возвращает тип "text" вне зависимости от поля,- даже индексные столбцы с автоинкрементом она возвращает как текст, поэтому я решил что определение типа средствами пб невозможно. Но что касается кода то помню что команда DatabaseColumnSize(0, 0) возвращала ноль, где естественно 0,0 были изменены на рабочие. Но и естественно работа данной функции не совсем ясна так как исходя из описания она возвращает размер столбца а не ячейки. При попытке обхода, то есть к примеру принуддительном создании размера освобождаемой памяти в 100 кб код вылетал на следующих строках.
Но буду откровенен,- я совершенно не представляю как работает данный код, поэтому не исключаю вероятность своей ошибки...
Цитата Сообщение от locm Посмотреть сообщение
нуль-терминированная
для меня это абракадабра, в таком случае мб стоит изначально текст определять как блоб а уж затем переводить его в текстовую переменную?
0
Эксперт по электронике
5982 / 2698 / 284
Регистрация: 28.10.2011
Сообщений: 10,185
Записей в блоге: 6
15.09.2013, 21:29 8
Цитата Сообщение от 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
30 / 31 / 0
Регистрация: 26.08.2013
Сообщений: 282
16.09.2013, 19:56  [ТС] 9
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
Эксперт по электронике
5982 / 2698 / 284
Регистрация: 28.10.2011
Сообщений: 10,185
Записей в блоге: 6
16.09.2013, 20:59 10
В коде нужно после выбора таблицы и перед работой с колонками (ячейками), указать желаемую строку (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
30 / 31 / 0
Регистрация: 26.08.2013
Сообщений: 282
19.09.2013, 07:13  [ТС] 11
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
Эксперт по электронике
5982 / 2698 / 284
Регистрация: 28.10.2011
Сообщений: 10,185
Записей в блоге: 6
19.09.2013, 09:55 12
Цитата Сообщение от 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
30 / 31 / 0
Регистрация: 26.08.2013
Сообщений: 282
19.09.2013, 10:33  [ТС] 13
locm, извиняюсь конечно, но поправки результата не дали, всё равно ноль... прикрепил код целиком, мб гдето в ином месте накосячил.... а FillMemory от безысходности пытался впихнуть вместо GetDatabaseBlob, так как пример применения GetDatabaseBlob совершенно не похож на то что в справке о ней написано...
Пробовал на разных бд, в смысле на созданых разными программами, положительного эфекта не наблюдается....
Вложения
Тип файла: zip Новая сжатая ZIP-папка.zip (6.9 Кб, 11 просмотров)
0
Эксперт по электронике
5982 / 2698 / 284
Регистрация: 28.10.2011
Сообщений: 10,185
Записей в блоге: 6
19.09.2013, 11:20 14
Цитата Сообщение от logincyberforu Посмотреть сообщение
извиняюсь конечно, но поправки результата не дали, всё равно ноль
Я конечно тоже извиняюсь, но в выложенном коде (2.pb) нет этого участка кода.
Вообще при разработке программы, нужно понимать что делаете, а не просто подставлять разные команды - а вдруг заработает.

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

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

Цитата Сообщение от locm Посмотреть сообщение
Вообще при разработке программы, нужно понимать что делаете, а не просто подставлять разные команды - а вдруг заработает
вообщето верно, но если совершенно не представляеш каким образом это сделать, то есть два варианта: либо попытаться применить пример в слепую либо обратиться на форум... ну и мои познания в програмировании не на столько сильны чтобы свободно работать с областями памяти, темболее в новом для меня языке...
0
Эксперт по электронике
5982 / 2698 / 284
Регистрация: 28.10.2011
Сообщений: 10,185
Записей в блоге: 6
19.09.2013, 16:11 16
Может этот пример поможет понять как работать с базой. Он показывает все таблицы их содержимое.
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
30 / 31 / 0
Регистрация: 26.08.2013
Сообщений: 282
19.09.2013, 19:58  [ТС] 17
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
Эксперт по электронике
5982 / 2698 / 284
Регистрация: 28.10.2011
Сообщений: 10,185
Записей в блоге: 6
19.09.2013, 20:41 18
Цитата Сообщение от 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
30 / 31 / 0
Регистрация: 26.08.2013
Сообщений: 282
19.09.2013, 20:48  [ТС] 19
locm, теперь понятно, но думаю результат лучше в масиве так как с масивом проще работать...

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Как написать микросервис на Go/Golang с Kafka и GitHub CI/CD
InfoMaster 14.01.2025
Определение микросервиса, преимущества использования Go/ Golang Микросервис – это архитектурный подход к разработке программного обеспечения, при котором приложение состоит из небольших, независимо. . .
Как написать микросервис с нуля на C# с RabbitMQ, CQRS и CI/CD
InfoMaster 14.01.2025
В современном мире разработки программного обеспечения микросервисная архитектура стала стандартом де-факто для создания масштабируемых и гибких приложений. Этот архитектурный подход предполагает. . .
Как создать интернет-магазин на PHP и JavaScript
InfoMaster 14.01.2025
В современном мире электронная коммерция стала неотъемлемой частью бизнеса. Создание собственного интернет-магазина открывает широкие возможности для предпринимателей, позволяя достичь большей. . .
Как написать Тетрис на Ассемблере
InfoMaster 14.01.2025
Тетрис – одна из самых узнаваемых и популярных компьютерных игр, созданная в 1984 году советским программистом Алексеем Пажитновым. За прошедшие десятилетия она завоевала симпатии миллионы людей по. . .
Как создать игру "Танчики" на Unity3d и C#
InfoMaster 14.01.2025
Разработка игр – это увлекательный процесс, сочетающий в себе творчество и технические навыки. В этой статье мы рассмотрим создание классической игры "Танчики" с использованием Unity3D и языка. . .
Организую платный онлайн микро-курс по доработке Android-клиента Telegram
_Ivana 14.01.2025
Официальная версия и распространенные форки не полностью устраивают? Сделай свою кастомную версию клиента! 4 занятия по 2 часа (2 недели пн, ср 19:00-21:00 по Москве). Первое вводное занятие. . .
Как создать приложение для фитнеса для iOS/iPhone на Kotlin
InfoMaster 14.01.2025
Создание собственного фитнес-приложения — это не только захватывающий, но и полезный процесс, ведь оно может стать вашим верным помощником на пути к здоровому и активному образу жизни. В современных. . .
Как создать приложение магазина для iOS/iPhone на Swift
InfoMaster 14.01.2025
Введение в разработку iOS-приложений Разработка приложений для iPhone и других устройств на базе iOS открывает огромные возможности для создания инновационных мобильных решений. В данной статье мы. . .
Это работает. Скорость асинхронной логики велика. Вопрос видимо останется в стабильности. Плата - огонь!
Hrethgir 13.01.2025
По прошлому проекту в Logisim Evolution https:/ / www. cyberforum. ru/ blogs/ 223907/ blog8781. html прилагаю файл архива проекта в Gowin Eda. Восьмибитный счётчик из сумматора+ генератор сигнала. . .
UserScript для подсветки кнопок языков программировани­­­­я в зависимости от текущего раздела
volvo 13.01.2025
В результате работы этого скрипта подсвечиваются нужные кнопки не только в форме быстрого ответа, но и при редактировании сообщения: / / ==UserScript== / / @name CF_DefaultLangSelect / / . . .
Введение в модели и алгоритмы машинного обучения
InfoMaster 12.01.2025
Машинное обучение представляет собой одну из наиболее динамично развивающихся областей искусственного интеллекта, которая фокусируется на разработке алгоритмов и методов, позволяющих компьютерам. . .
Как на Python создать нейросеть для решения задач
InfoMaster 12.01.2025
В контексте стремительного развития современных технологий особое внимание уделяется таким инструментам, как нейросети. Эти структуры, вдохновленные биологическими нейронными сетями, используются для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru