Я знаю, что это старая тема. Но я вижу комментарий к вопросу о том, можно ли это сделать в SQL
вместо использования PL/SQL
. Итак, мы решили опубликовать решение.
Ниже показана поиск VALUE во всех COLUMNS всех ТАБЛИЦЕЙ во всей SCHEMA :
Давайте посмотрим на значение KING
в схеме SCOTT
.
SQL> variable val varchar2(10)
SQL> exec :val := 'KING'
PL/SQL procedure successfully completed.
SQL> SELECT DISTINCT SUBSTR (:val, 1, 11) "Searchword",
2 SUBSTR (table_name, 1, 14) "Table",
3 SUBSTR (column_name, 1, 14) "Column"
4 FROM cols,
5 TABLE (xmlsequence (dbms_xmlgen.getxmltype ('select '
6 || column_name
7 || ' from '
8 || table_name
9 || ' where upper('
10 || column_name
11 || ') like upper(''%'
12 || :val
13 || '%'')' ).extract ('ROWSET/ROW/*') ) ) t
14 ORDER BY "Table"
15 /
Searchword Table Column
----------- -------------- --------------
KING EMP ENAME
SQL>
Давайте посмотрим на значение 20
в схеме SCOTT
.
SQL> variable val NUMBER
SQL> exec :val := 20
PL/SQL procedure successfully completed.
SQL> SELECT DISTINCT SUBSTR (:val, 1, 11) "Searchword",
2 SUBSTR (table_name, 1, 14) "Table",
3 SUBSTR (column_name, 1, 14) "Column"
4 FROM cols,
5 TABLE (xmlsequence (dbms_xmlgen.getxmltype ('select '
6 || column_name
7 || ' from '
8 || table_name
9 || ' where upper('
10 || column_name
11 || ') like upper(''%'
12 || :val
13 || '%'')' ).extract ('ROWSET/ROW/*') ) ) t
14 ORDER BY "Table"
15 /
Searchword Table Column
----------- -------------- --------------
20 DEPT DEPTNO
20 EMP DEPTNO
20 EMP HIREDATE
20 SALGRADE HISAL
20 SALGRADE LOSAL
SQL>
Я столкнулся с той же проблемой и моим решением [1 120], этот конкретный случай (таймер обратного отсчета) должен был использовать ту же логику, как используется в некотором собственном андроиде/приложениях для iOS там, который является:
Duration remainingTime = _endingTime.difference(dateTimeNow);
ПРИМЕЧАНИЕ: Конечное значение даты и времени было сохранено в одиночном элементе , я не использовал SharedPreferences в качестве никакой потребности в своем случае, но это - приемлемая опция в случае, если Вам был нужен он.
в деталях:
я создал этот обработчик, чтобы установить и получить остающееся время:
class TimerHandler {
DateTime _endingTime;
TimerHandler._privateConstructor();
TimerHandler();
static final TimerHandler _instance = new TimerHandler();
static TimerHandler get instance => _instance;
int get remainingSeconds {
final DateTime dateTimeNow = new DateTime.now();
Duration remainingTime = _endingTime.difference(dateTimeNow);
// Return in seconds
return remainingTime.inSeconds;
}
void setEndingTime(int durationToEnd) {
final DateTime dateTimeNow = new DateTime.now();
// Ending time is the current time plus the remaining duration.
this._endingTime = dateTimeNow.add(
Duration(
seconds: durationToEnd,
),
);
}
}
final timerHandler = TimerHandler.instance;
затем в экране таймера, я наблюдал жизненный цикл приложения;
ПРИМЕЧАНИЯ:
1-я не проверяю состояние таймера перед набором новое остающееся время, потому что логика, в которой я нуждаюсь в своем Приложении, должна продвинуть endingTime в случае, если пользователь приостановил таймер, вместо уменьшают timerDuration, полностью до варианта использования.
2-Моих таймеров живут в блоке (TimerBloc).
class _TimerScreenState extends State<TimerScreen> {
int remainingDuration;
//...
@override
void initState() {
super.initState();
SystemChannels.lifecycle.setMessageHandler((msg) {
if (msg == AppLifecycleState.paused.toString() ) {
// On AppLifecycleState: paused
remainingDuration = BlocProvider.of<TimerBloc>(context).currentState.duration ?? 0;
timerHandler.setEndingTime(remainingDuration);
setState((){});
}
if (msg == AppLifecycleState.resumed.toString() ) {
// On AppLifecycleState: resumed
BlocProvider.of<TimerBloc>(context).dispatch(
Start(
duration: timerHandler.remainingSeconds,
),
);
setState((){});
}
return;
});
}
//....
}
в случае, если что-то не ясно просто, оставляют комментарий.