Страницы

Поиск по вопросам

вторник, 8 января 2019 г.

Неправильное сравнение дат в SQLite

В бд есть столбец DATE где дата хранится в формате dd.mm.yyyy. Пытаюсь таким запросом: DELETE FROM PRODUCTS WHERE DATE <= date('now','-30 day') удалить все строки старше 30 дней, но удаляются все строки. Что не так?


Ответ

В SQLite нет "настоящего" типа данных DATE - данные типа DATE/TIME могут храниться в одном из следующих видов:
строк/text (обычно используют ISO8601: "YYYY-MM-DD HH:MM:SS.SSS") целых чисел (UNIX epoch - число секунд прошедших с 1970-01-01 00:00:00 UTC) вещественных чисел (as Julian day numbers, the number of days since noon in Greenwich on November 24, 4714 B.C. according to the proleptic Gregorian calendar).
Соответственно, при использовании строк при сравнении будет использоваться лексикографическое сравнение. Например, "2" > "1999999", т.к. первый символ первой строки (двойка) больше единицы, первого символа во второй строке.
Это одна из причин почему в SQLite надо хранить дату/время только в одном из следующих форматов
YYYY-MM-DD YYYY-MM-DD HH:MM YYYY-MM-DD HH:MM:SS YYYY-MM-DD HH:MM:SS.SSS YYYY-MM-DDTHH:MM YYYY-MM-DDTHH:MM:SS YYYY-MM-DDTHH:MM:SS.SSS HH:MM HH:MM:SS HH:MM:SS.SSS now DDDDDDDDDD
Вывод: если вам нужен другой формат даты, то форматируйте его только для вывода, но не для хранения.

Как реализовать Анимацию выделения сектора окружности цветом от 0 до 360 градусов

Образно, процесс можно проиллюстрировать на примере стрелочных часов: одна стрелка неподвижна, другая двигается до определённого значения и пространство между ними заполняется цветом (стрелок при этом нет, это просто образная визуализация границ).


Ответ

CSS решение
Все стили перенес в css и анимация сделана с помощью правил css
.container { width:25%; height:25% } #crc { fill:none; stroke:green; stroke-width:100; stroke-dashoffset:314; stroke-dasharray:314; animation: draw 10s ease-out infinite forwards; } @keyframes draw { from { stroke-dashoffset: 314; } to { stroke-dashoffset: 0; } }


Приложение полностью адаптивно, так же как вариант решения SVG
Работает во всех современных браузерах, кроме IE, который не понимает анимацию по определению.

Несколько EditText с одинаковым ID

В LinearLayout циклом добавляется фрагмент, укомплектованный в другом .xml файле. Фрагмент содержит три EditText.
Задача: достать текст из каждого первого/второго/третьего EditText во всех фрагментах.
Помогите, пожалуйста.


Ответ

В цикле бежите по View которые внутри LinearLayout, достаёте фрагмент, а у него обращаетесь к editText
LinearLayout linearLayout = initLayout(); int count = linearLayout.getChildCount(); Fragment f = null; String reduce = ""; for(int i=0; i

Как правильно сделать такой эффект в пагинации?

Как сделать такую анимацию пагинации перемещения точек элементов между числами 01, 02 , 03 , 04 ?
.paination { display:flex; }



Ответ

Как было сказано в комментариях, подобный эффект можно сделать на HTML+CSS. (эффект работает при hover'e). Пример на Codepen с использованием цикла для генерации transform-delay in SCSS Update: Исправлена анимация.
var btn = document.getElementById("toggle"); var px = document.getElementsByClassName("px"); btn.onclick = function() { Array.from(px).forEach(function(el) { el.classList.add("offset"); }); } * { margin: 0; padding: 0; } #toggle { background: crimson; border: none; outline: none; border-radius: 0.2rem; color: white; padding: 0.70rem 0.75rem; margin: 0.5rem 1rem; cursor: pointer; box-shadow: 2px 2px 2px gray; transition: 0.2s; text-transform: uppercase; } #toggle:active { box-shadow: none; } .line { margin: 1rem; } .offset { transform: translateX(50px); } .px { width: 1px; height: 1px; background-color: #000; } .px:nth-child(1) { transition: ease-in-out 0.4s; } .px:nth-child(2) { transition: ease-in-out 0.6s; } .px:nth-child(3) { transition: ease-in-out 0.5s; } .px:nth-child(4) { transition: ease-in-out 0.6s; } .px:nth-child(5) { transition: ease-in-out 0.58s; } .px:nth-child(6) { transition: ease-in-out 0.56s; } .px:nth-child(7) { transition: ease-in-out 0.58s; } .px:nth-child(8) { transition: ease-in-out 0.6s; } .px:nth-child(9) { transition: ease-in-out 0.5s; } .px:nth-child(10) { transition: ease-in-out 0.45s; } .px:nth-child(11) { transition: ease-in-out 0.6s; } .px:nth-child(12) { transition: ease-in-out 0.6s; } .px:nth-child(13) { transition: ease-in-out 0.43s; } .px:nth-child(14) { transition: ease-in-out 0.44s; } .px:nth-child(15) { transition: ease-in-out 0.59s; } .px:nth-child(16) { transition: ease-in-out 0.54s; } .px:nth-child(17) { transition: ease-in-out 0.56s; } .px:nth-child(18) { transition: ease-in-out 0.52s; } .px:nth-child(19) { transition: ease-in-out 0.5s; } .px:nth-child(20) { transition: ease-in-out 0.56s; } .px:nth-child(21) { transition: ease-in-out 0.6s; } .px:nth-child(22) { transition: ease-in-out 0.4s; } .px:nth-child(23) { transition: ease-in-out 0.52s; } .px:nth-child(24) { transition: ease-in-out 0.48s; } .px:nth-child(25) { transition: ease-in-out 0.46s; } .px:nth-child(26) { transition: ease-in-out 0.45s; } .px:nth-child(27) { transition: ease-in-out 0.52s; } .px:nth-child(28) { transition: ease-in-out 0.54s; } .px:nth-child(29) { transition: ease-in-out 0.55s; } .px:nth-child(30) { transition: ease-in-out 0.55s; } .px:nth-child(31) { transition: ease-in-out 0.5s; } .px:nth-child(32) { transition: ease-in-out 0.51s; } .px:nth-child(33) { transition: ease-in-out 0.6s; } .px:nth-child(34) { transition: ease-in-out 0.5s; } .px:nth-child(35) { transition: ease-in-out 0.6s; } .px:nth-child(36) { transition: ease-in-out 0.51s; } .px:nth-child(37) { transition: ease-in-out 0.52s; } .px:nth-child(38) { transition: ease-in-out 0.46s; } .px:nth-child(39) { transition: ease-in-out 0.45s; } .px:nth-child(40) { transition: ease-in-out 0.6s; }


Android, как сохранять данные без базы данных?

Только начала учить Android, пишу в Android Studio. Есть на уме идея для одной программы, но для этого мне надо научиться сохранять данные. Слышала, что использовать SqlLite нужно только при больших объемах памяти. Мне же, грубо говоря, нужно сохранять только имя пользователя и ещё какую-то общую информацию и выводить это в List. Как мне это сделать? Как правильно сохранять эти данные? В какой-то массив или отдельный файл?


Ответ

Для сохранения данных вы можете использовать SharedPreferences
SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(MainActivity.this);
Чтобы начать запись в файл настроек, вы должны вызвать метод edit() объекта SharedPreferences, который возвращает объект SharedPreferences.Editor.
SharedPreferences.Editor editor = sharedPreferences.edit();
Объект SharedPreferences.Editor имеет несколько интуитивных методов, которые можно использовать для хранения новых пар ключ-значение в файле настроек. Например, вы можете использовать метод putString(), чтобы поместить пару ключ-значение со значением типа String
editor.putString("name", "Danil"); editor.putInt("age", 20);
Чтобы сохранить записи вы должны вызвать метод commit()
editor.commit();
Чтение из объекта SharedPreferences гораздо проще. Всё, что вам нужно сделать, так это вызвать соответствующий метод get*()
String name = sharedPreferences.getString("name", "unknown"); int age = sharedPreferences.getInt("age", 0);

Запретить создавать новый Toast, если он уже отображается на экране

Вопрос совсем простой. Как контролировать кол-во выводов Toast.makeText?
Вчера тестировал свое приложение на группе студентов. Один из них воспроизвел странный для меня баг. Он нажал на кнопку много-много раз с его слов, после чего Toast.maketText в прямом смысле зациклился в стал выводить сообщение, даже после закрытия приложения. Как думаете, он просто забил очередь? И как можно обработать подобный случай?
Спасибо=)


Ответ

Можно сделать заплатку:
toastLenght = 2000 (для Toast.LENGTH_SHORT) или 3500 (для Toast.LENGTH_LONG);
if(!isToast) { Toast.makeText(...); isToast = true; new Handler().postDelayed(new Runnable() { @Override public void run() { isToast = false; } }, toastLenght); }

Почему ++$x работает быстрее, чем $x++?

Итак, давайте выполним 2 скрипта, и убедимся, что ++$x работает быстрее...
Скрипт-1:
#!/usr/bin/perl
my $x = 0;
foreach (1..5_000_000) { $x++; }

perl -d:NYTProf test.pl

nytprofhtml --open

Результат:

Скрипт-2:
#!/usr/bin/perl
my $x = 0;
foreach (1..5_000_000) { ++$x; }

perl -d:NYTProf test.pl

nytprofhtml --open

Результат:

Вопрос: Почему ++$x работает быстрее, чем $x++?


Ответ

++$x работает грубо говоря в два шага:
делаем $x + 1 передаем значение.
$x++ (присваиваемый) работает сложнее, его обычно нельзя реализовать без промежуточной копии:
сохраняем значение $x в $temp делаем $x + 1 передаем значение $temp
P.S.: Не присваиваемый $x++, в умных компиляторах/интерпретаторах, может не отличается от ++$x
P.P.S.: При сильных оптимизациях еще все зависит от прилегающих операций, и при использовании простых типов разница скорее всего вообще пропадет.