powered by simpleCommunicator - 2.0.38     © 2025 Programmizd 02
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Sqlite long
14 сообщений из 14, страница 1 из 1
Sqlite long
    #38854792
Елдос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как можно хранить числа в числовом формате в sqlite,
хотелось бы хранить long значения сейчас хранятся значения в формате integer но переходят в минус.
если я буду хранить в real смогу ли я сравнивать их как числа
...
Рейтинг: 0 / 0
Sqlite long
    #38854800
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Елдос,
real тебе тут точно не нужен.
не должно ничего переходить в минус
покажи код как ты пишешь в базу long?
в api есть два метода
sqlite3_column_int()
sqlite3_column_int64()

http://stackoverflow.com/questions/13832103/sqlite-integer-value-bytes
...
Рейтинг: 0 / 0
Sqlite long
    #38855744
Елдос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PPAЕлдос,
real тебе тут точно не нужен.
не должно ничего переходить в минус
покажи код как ты пишешь в базу long?
в api есть два метода
sqlite3_column_int()
sqlite3_column_int64()

http://stackoverflow.com/questions/13832103/sqlite-integer-value-bytes
забыл объяснить что я использую java и там класс Date хранит это значение в миллисекундах что больше диапазона int, потому и переходит в минус, а если я храню в секундах, то есть делю эти милисекунды на 1000 то при обратном воспроизведении в дату показывает дату 1969 года, хотя там даты как и в линукс начинаются с 1970 года,
...
Рейтинг: 0 / 0
Sqlite long
    #38855745
Елдос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PPA,

и еще я пишу это на sqlite для andorid
...
Рейтинг: 0 / 0
Sqlite long
    #38855747
Елдос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PPA,

и еще я не нашел как применять int 64, писать при создании INTEGER(64) или как то по другому.
...
Рейтинг: 0 / 0
Sqlite long
    #38855867
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Елдос,

В таблице поле называй просто integer - sqlite к этом относится прохладно... в отличии от других баз

http://www.sqlite.org/datatype3.html
"INTEGER. The value is a signed integer, stored in 1, 2, 3, 4, 6, or 8 bytes depending on the magnitude of the value."

а из java при работе с полем бинди туда значение long - у вас ведь он 64 битный?
как у тебя int то оказался?
...
Рейтинг: 0 / 0
Sqlite long
    #38855923
Елдос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PPA,

я его и не трогаю так и пихаю туда в этом long значении, но он все равно переходит в минус,
я думал что в sql такой же диапазон чисел как и в java.
...
Рейтинг: 0 / 0
Sqlite long
    #38856557
Фотография PPA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Елдос,

Тогда, вероятно, нужно смотреть либу куда вы пихаете long
и почему она превращает ее в int
...
Рейтинг: 0 / 0
Sqlite long
    #38856636
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Елдосзабыл объяснить что я использую java и там класс Date хранит это значение в миллисекундах что больше диапазона int, потому и переходит в минус, а если я храню в секундах, то есть делю эти милисекунды на 1000 то при обратном воспроизведении в дату показывает дату 1969 года, хотя там даты как и в линукс начинаются с 1970 года,Может, программирование это не ваше?
Год это ~3,14*10^7 секунд, что приведёт к переполнению знакового целого в 2038 году. Приближается, но пока терпимо.
Код: java
1.
2.
3.
4.
5.
6.
int секунд;
long мсек;
// перед сохранением в базе
секунд = (int) (мсек + 500)/1000;
// после чтения из базы
мсек = секунд * 1000;
...
Рейтинг: 0 / 0
Sqlite long
    #38856719
Елдос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov,

я так и делаю, кроме прибавления пол секунды не очень важно,
она эти значения хранит правильно, но подстваляешь эти числа в new Date выдает дату 1969 года.
...
Рейтинг: 0 / 0
Sqlite long
    #38856796
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Елдосона эти значения хранит правильно, но подстваляешь эти числа в new Date выдает дату 1969 года.Я могу придумать только один вариант, когда это будет неправильно:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
public class Test {
  public static void main(String[] args) {
    int секунд, мсек;
    секунд = (int) (System.currentTimeMillis() + 500) / 1000;
    мсек = секунд * 1000;
    System.out.println(new java.util.Date(мсек));
  }
}


Код: plaintext
1.
java Test
Tue Dec 30 19:14:21 IRKT  1969 
...
Рейтинг: 0 / 0
Sqlite long
    #38856949
Елдос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovЕлдосона эти значения хранит правильно, но подстваляешь эти числа в new Date выдает дату 1969 года.Я могу придумать только один вариант, когда это будет неправильно:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
public class Test {
  public static void main(String[] args) {
    int секунд, мсек;
    секунд = (int) (System.currentTimeMillis() + 500) / 1000;
    мсек = секунд * 1000;
    System.out.println(new java.util.Date(мсек));
  }
}


Код: plaintext
1.
java Test
Tue Dec 30 19:14:21 IRKT  1969 

ну у меня так и сделано, подставляю данные из базы умножив их на 1000, а они предварительно были занесены в БД резделенными на 1000, и подставляю в new Date(мсек), а как должно быть правильно?
...
Рейтинг: 0 / 0
Sqlite long
    #38856998
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Елдоса как должно быть правильно?"Правильно заданный вопрос содержит, как минимум, половину ответа" - благодаря вам я нашёл уже свою ошибку:
Код: sql
1.
int сек = (int) (10_000_000_999 + 500) / 1000;

сначала приводит число типа long к целому, что и вызывает искажение данных.
А вот при обратном преобразовании надо сначала привести целое к типу long и только потом умножать на тысячу.
Итого:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class Test {
  public static void main(String[] args) {
    int секунд = (int) ((System.currentTimeMillis() + 500) / 1000);
    System.out.println(new java.util.Date((long) секунд * 1000));
    // Тоже правильно
    System.out.println(new java.util.Date(секунд * 1000L));
    // Ошибка
    System.out.println(new java.util.Date((long) (секунд * 1000)));
  }
}


Код: plaintext
1.
2.
3.
java Test
Sun Jan 18 18:18:29 IRKT 2015
Sun Jan 18 18:18:29 IRKT 2015
Wed Dec 31 15:55:34 IRKT 1969
...
Рейтинг: 0 / 0
Sqlite long
    #38857004
Елдос
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. SidorovЕлдоса как должно быть правильно?"Правильно заданный вопрос содержит, как минимум, половину ответа" - благодаря вам я нашёл уже свою ошибку:
Код: sql
1.
int сек = (int) (10_000_000_999 + 500) / 1000;

сначала приводит число типа long к целому, что и вызывает искажение данных.
А вот при обратном преобразовании надо сначала привести целое к типу long и только потом умножать на тысячу.
Итого:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class Test {
  public static void main(String[] args) {
    int секунд = (int) ((System.currentTimeMillis() + 500) / 1000);
    System.out.println(new java.util.Date((long) секунд * 1000));
    // Тоже правильно
    System.out.println(new java.util.Date(секунд * 1000L));
    // Ошибка
    System.out.println(new java.util.Date((long) (секунд * 1000)));
  }
}


Код: plaintext
1.
2.
3.
java Test
Sun Jan 18 18:18:29 IRKT 2015
Sun Jan 18 18:18:29 IRKT 2015
Wed Dec 31 15:55:34 IRKT 1969

да вот тоже как раз до этого додумался благодаря вам!
спасибо
...
Рейтинг: 0 / 0
14 сообщений из 14, страница 1 из 1
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Sqlite long
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]