SQLite на PocketBook

 
Найти сообщения без ответов
Начать новую тему   Ответить на тему    Список форумов The-eBook -> PocketBook -> PocketBook Free
 
Автор Сообщение

blackbird
Зрелый участник форума

Зрелый участник форума



Зарегистрирован: 02.10.2009
Сообщения: 28



СообщениеДобавлено: 31.10.2009 23:53     Цитата

подключил к программе SQLite в виде амальгамации,
скомпилировал. К эмуляторе всё ок, на книжке ведёт себе очень странно, например сортирует ORDER BY в обратном порядке. И не записывает в базу, такое ощущение, что не флашит буфер, т.е. после нексольких успешных вызовов типа "update table set bla-bla-bla" видны последствия только первого. хотя перед выходом делаю честный sqlite3_close(). Я еще не вполне понял механику возникновения упомянутых проблем, но может какой-то тоже пробовал SQLite с аналогичными проблемами и знает простой ответ?
 
Профиль Сообщение ^

blackbird
Зрелый участник форума

Зрелый участник форума



Зарегистрирован: 02.10.2009
Сообщения: 28



СообщениеДобавлено: 02.11.2009 01:03     Цитата

Итого, простая база:
Код:
CREATE TABLE cards (
   text TEXT NOT NULL,
   due FLOAT NOT NULL
);
INSERT INTO cards VALUES('second',1255355329.671);
INSERT INTO cards VALUES('first', 1255355260.546);

в ответ на запрос "select * from cards order by due"
выдаёт в эмуляторе и в любой другой среде на десктопе
Код:
text = first
due = 1255355260.546

text = second
due = 1255355329.671
, на книжке -
Код:
text = second
due = -3.34648431592573e+233

text = first
due = -1.93784766618264e+150

пример вызывающей программы http://dumpz.org/13898/
 
Профиль Сообщение ^

Finom1
Член клуба The eBook

Член клуба The eBook



Зарегистрирован: 08.05.2008
Сообщения: 1855


Откуда: Одесса

СообщениеДобавлено: 02.11.2009 02:22     Цитата

Может я что-то не понимаю, но после order by due можно указать порядок сдедования desc или asc.
blackbird писал(а):
в виде амальгамации
Что это?
 
Профиль Сообщение ICQ ^

blackbird
Зрелый участник форума

Зрелый участник форума



Зарегистрирован: 02.10.2009
Сообщения: 28



СообщениеДобавлено: 02.11.2009 13:11     Цитата

FINoM писал(а):
Может я что-то не понимаю, но после order by due можно указать порядок сдедования desc или asc.

Да, можно указать, но по умолчанию asc.
В любом случае добавления явного указания направления сортировки в запрос ничего не изменило.

FINoM писал(а):
blackbird писал(а):
в виде амальгамации
Что это?

Это когда все файлы собраны в обин большой инклуд, который просто подключается к проекту и компилируется вместе с ним. По крайней мере так это называют сами SQLite-овцы, самый, в общем, кроссплатформенный вариант.
 
Профиль Сообщение ^

a_lone
Член клуба The eBook

Член клуба The eBook



Зарегистрирован: 16.09.2004
Сообщения: 1704



СообщениеДобавлено: 02.11.2009 17:11     Цитата

blackbird
по выборке похоже, что order by игнорируется, или сортирует по какому-то другому due
попробуйте отсортировать по text asc & desc, работает ли так, а кроме того, избегайте таких названий полей, они могут значить нечто другое, или подвязывайте к алиасам (кто знает, что в данной инкарнации базы данных значит due)
_________________
Palm T|X, V3Ext, SGS
Kindle 3 3G -> Sony PRS-650BC -> Nook Touch -> Kindle Paperwhite
 
Профиль Сообщение ICQ ^

blackbird
Зрелый участник форума

Зрелый участник форума



Зарегистрирован: 02.10.2009
Сообщения: 28



СообщениеДобавлено: 02.11.2009 18:01     Цитата

a_lone писал(а):
blackbird
по выборке похоже, что order by игнорируется, или сортирует по какому-то другому due
попробуйте отсортировать по text asc & desc, работает ли так, а кроме того, избегайте таких названий полей, они могут значить нечто другое, или подвязывайте к алиасам (кто знает, что в данной инкарнации базы данных значит due)

По какому, пардон, другому due? в таблице всего две строки и два столбца. Один с текстом, другой с вещественными числами, трудно представить более прозрачный пример. Не называть же их SAMPLE_COLUMN_OF_BIG_FLOATS Smile
Сортировка по тексту работает, только непонятно чем это помогает. В принципе видно, что проблема с обработкой больших чисел - sqlite возвращает все значения select-a в виде строк, и в них, как видно на примере выше - числа уже исковерканы. Какой уж тут order by
 
Профиль Сообщение ^

a_lone
Член клуба The eBook

Член клуба The eBook



Зарегистрирован: 16.09.2004
Сообщения: 1704



СообщениеДобавлено: 03.11.2009 11:36     Цитата

blackbird писал(а):

По какому, пардон, другому due? в таблице всего две строки и два столбца. Один с текстом, другой с вещественными числами, трудно представить более прозрачный пример. Не называть же их SAMPLE_COLUMN_OF_BIG_FLOATS Smile
Сортировка по тексту работает, только непонятно чем это помогает. В принципе видно, что проблема с обработкой больших чисел - sqlite возвращает все значения select-a в виде строк, и в них, как видно на примере выше - числа уже исковерканы. Какой уж тут order by


я имел в виду понятие "зарезервированные слова".
Используйте тип данных Numeric и будет вам счастье

Posted after 2 minutes 22 seconds:

Если, конечно, он есть в SQLLite. В Sybase это помогло решить проблему

Posted after 10 minutes 10 seconds:

Почитал доку SQLLite - непонятно.
Может, стоит использовать DOUBLE - это двойной FLOAT, или REAL - если только он 8-байтовый.
В любом случае у Вас банальное переполнение данных
 
Профиль Сообщение ICQ ^

blackbird
Зрелый участник форума

Зрелый участник форума



Зарегистрирован: 02.10.2009
Сообщения: 28



СообщениеДобавлено: 03.11.2009 12:01     Цитата

Да, в SQLite есть NUMERIC, но, к великому сожалению, базы генерирует не моё приложение, я делаю только вьювер для книжки.

И да, похоже на переполнение, но очень бы хотелось понять какой именно нюанс компиляции/ в каком месте библиотеки приводит к таким печальным последствиям, чтобы написать либо авторам базы, либо в SQLite, либо, в идеале - исправить самостоятельно.

Ибо писать "ребята, тут ваша библиотека че-то не работает у меня на книжке" будет менее продуктивно Smile

Posted after 7 minutes 38 seconds:

кстати сейчас проверю с numeric этот же пример

Posted after 10 minutes 54 seconds:

вообще интересно: с NUMERIC сортирует (если это не случайность), но данные возвращает также испорченные.
 
Профиль Сообщение ^

a_lone
Член клуба The eBook

Член клуба The eBook



Зарегистрирован: 16.09.2004
Сообщения: 1704



СообщениеДобавлено: 03.11.2009 12:59     Цитата

А DOUBLE здесь нет?
Говоря про NUMERIC, Я имел в виду тип данных NUMERIC(v, n), где v - кол-во знаков до запятой, n - после.
_________________
Palm T|X, V3Ext, SGS
Kindle 3 3G -> Sony PRS-650BC -> Nook Touch -> Kindle Paperwhite
 
Профиль Сообщение ICQ ^

blackbird
Зрелый участник форума

Зрелый участник форума



Зарегистрирован: 02.10.2009
Сообщения: 28



СообщениеДобавлено: 03.11.2009 20:07     Цитата

и DOUBLE тут есть, только толку от него нет. Прежде всего я не могу формат базы менять, а вообще попробовал и дабл - всё равно значение портится. Размер интов/флоатов на книжке такой же, странно, что один и тот же код ведёт себя по-разному. Может быть они используют какой-то библиотечный вызов для конвертации строк во флоаты, который как раз и сбоит на длинных числах :-\

Posted after 1 minute 18 seconds:

собственно double\float представляют разницу в точности, показатель-то должен одинаковый быть...

Posted after 10 minutes 56 seconds:

точнее будет сказать, что он понимает double в запросах, а в документации написано, что есть один тип real, но он умеет записывать данные в виде текста, если видет, что точность теряется. В любом случае проблема в том, как их оттуда прочитать.

Posted after 47 minutes 4 seconds:

в общем ни numeric ни float ни double ни real не сортируются и не возвращают данные. Там где выше я написал, что numeric поля отсортировались - это неверно.
из числа 1000000000.1 получается 1.78e-308. ох...

Posted after 8 minutes 45 seconds:

Ха-ха, а я сделал числа поменьше - и он всё равно не работает.
Поменьше - это типа 100.1, т.е. проблема не с переполнением
 
Профиль Сообщение ^

RedUser
Член клуба The eBook

Член клуба The eBook



Зарегистрирован: 22.01.2009
Сообщения: 569


Откуда: Мурманск

СообщениеДобавлено: 03.11.2009 21:18     Цитата

blackbird писал(а):
...... странно, что один и тот же код ведёт себя по-разному. Может быть они используют какой-то библиотечный вызов для конвертации строк во флоаты, который как раз и сбоит на длинных числах ...
Хе-хе, конкретно по теме ничего сказать не могу, но я тут намеревался сделать типа упрощенный библиотекарь, так в эмуляторе все идет на ура. Раскладывает книжки по жанрам и так, как мне надо еще... А на книжке тот же код вываливается. На обработке определенной книги (может и дальше так, пока одну нашел). Рядом сотни таких же - нормально проходят. А эта.... Уже всю ее вдоль и поперек изучил - ничего особенного. Вобщем забросил это дело...

А по теме. Не мое дело, конечно, но может проще сделать внешний конвертор? Из базы во что-то понимаемое книгой?
_________________
PocketBook 301+ ‹14.2› | PocketBook 360 ‹14.2›
Ищется работа. Мурманск
 
Профиль Сообщение ^

blackbird
Зрелый участник форума

Зрелый участник форума



Зарегистрирован: 02.10.2009
Сообщения: 28



СообщениеДобавлено: 03.11.2009 21:25     Цитата

еще пара несложных экспериментов показала, что портятся те числа, у которых есть что-то отличное от нуля после десятичной точки: 100 -ok, 100.0 - ок, 100.1 - fail

Posted after 4 minutes 40 seconds:

RedUser писал(а):

А по теме. Не мое дело, конечно, но может проще сделать внешний конвертор? Из базы во что-то понимаемое книгой?

ох, ну это самый крайний вариант, но пользователю будет ощутимо менее удобно. Обидно то, что на эмуляторе всё (по крайней мере в черновом варианте) уже работает. Решить проблему с SQLite - и можно было бы предоставлять на суд общественности.
 
Профиль Сообщение ^

blackbird
Зрелый участник форума

Зрелый участник форума



Зарегистрирован: 02.10.2009
Сообщения: 28



СообщениеДобавлено: 04.11.2009 21:52     Цитата

из SQLite-а пишут
Цитата:
I'm guessing that your hardward does not implement IEEE 754 floating point correctly. We've seen that sort of thing before, especially with GCC. There are some options to GCC (which escape my memory right now) that can force it to use strict IEEE 754 floating point rather than its preferred, speedier but non-standard alternative.

поскольку базу менять не вариант, осталось найти эту волшебную опцию

Posted after 16 minutes 56 seconds:

если это -msoft-float - то на книжке нет libfloat :-\
 
Профиль Сообщение ^

ni4
Недавний участник форума

Недавний участник форума



Зарегистрирован: 31.08.2009
Сообщения: 15



СообщениеДобавлено: 09.11.2009 01:08     Цитата

А зачем собственно привязка к float? Поставьте уже int, если это вызывает такие проблемы.
 
Профиль Сообщение ^

a_lone
Член клуба The eBook

Член клуба The eBook



Зарегистрирован: 16.09.2004
Сообщения: 1704



СообщениеДобавлено: 09.11.2009 12:25     Цитата

ni4
автор же ясно написал "..поскольку базу менять не вариант.."
_________________
Palm T|X, V3Ext, SGS
Kindle 3 3G -> Sony PRS-650BC -> Nook Touch -> Kindle Paperwhite
 
Профиль Сообщение ICQ ^

t.t
Член клуба The eBook

Член клуба The eBook



Зарегистрирован: 20.10.2008
Сообщения: 431


Откуда: Киев

СообщениеДобавлено: 10.11.2009 11:44     Цитата

В ядре включён умолчательный эмулятор FPU. С float и double никаких проблем не было. От DmitryZ поступило предложение попробовать опцию -static-libgcc.
 
Профиль Сообщение ^

blackbird
Зрелый участник форума

Зрелый участник форума



Зарегистрирован: 02.10.2009
Сообщения: 28



СообщениеДобавлено: 10.11.2009 17:28     Цитата

t.t писал(а):
В ядре включён умолчательный эмулятор FPU. С float и double никаких проблем не было. От DmitryZ поступило предложение попробовать опцию -static-libgcc.

c -static-libgcc тоже не работает Sad
И только что вышедший sqlite 3.6.20 также не принёс облегчения.
Где-то видел тест на совместимость с этим самым стандартом, попробую найти еще раз и запустить на книжке.
 
Профиль Сообщение ^

Ian Gore
Новенький участник форума

Новенький участник форума



Зарегистрирован: 15.12.2009
Сообщения: 1



СообщениеДобавлено: 15.12.2009 15:38     Цитата

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

В общем так - попробуйте поставить следующий define в своем примере перед sqlite
Код:
#define SQLITE_MIXED_ENDIAN_64BIT_FLOAT
#include "libs/sqlite3.h"

в sqlite3.с про этот define написано, что его надо использовать, если в числе используется другой порядок байтов (в вашем примере такое предположение напрашивается). Сначала грешили на архитектуру ARM, но в поздних комментариях указывается на ядро Linux, которое эмулирует 48 битное кодирование флоата на некоторых процессорах с 32 мантиссой.

Как говорится - возможно, это наш случай. Попробуйте.
 
Профиль Сообщение ^

blackbird
Зрелый участник форума

Зрелый участник форума



Зарегистрирован: 02.10.2009
Сообщения: 28



СообщениеДобавлено: 16.12.2009 01:25     Цитата

Код:

#define SQLITE_MIXED_ENDIAN_64BIT_FLOAT
#include "libs/sqlite3.h"

не пойдёт, если sqlite.c компилируется отдельно, но можно передать в gcc опцию -DSQLITE_MIXED_ENDIAN_64BIT_FLOAT - и да, ОНО РАБОТАЕТ!!!!!!!
спасибо огромное, я уже было отчаялся Smile

Posted after 22 minutes 42 seconds:

на самом деле у меня тоже нет устройства, я надеюсь что я правильно написал тест и человек его правильно понял....
и осталось разобраться с почему таки часть изменения не сохраняется :-\
 
Профиль Сообщение ^

blackbird
Зрелый участник форума

Зрелый участник форума



Зарегистрирован: 02.10.2009
Сообщения: 28



СообщениеДобавлено: 17.12.2009 01:39     Цитата

так, с буферизацией - мой косяк был.
с вещественными числами - всё ок,
Код:
-DSQLITE_MIXED_ENDIAN_64BIT_FLOAT
помогает
проблему можно считать решенной
спасибо еще раз!
 
Профиль Сообщение ^
Показать сообщения:   
Начать новую тему   Ответить на тему    Список форумов The-eBook -> PocketBook -> PocketBook Free Часовой пояс: GMT + 4
Страница 1 из 1

 
Перейти:  
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах

© The-eBook, 1999-2014. © Design by Prohorenkov
Syndicating News | Powered by phpBB © 2001, 2005 phpBB Group.
Хостинг предоставлен компанией DatForce     Яндекс.Метрика