Нужно будет узнать больше подробностей о вашем полном прецеденте.
Но, в общем, у вас есть два варианта:
(1) Вы можете использовать SODA Java. Это создаст коллекцию. Под обложками коллекция поддерживается обычной таблицей, которая будет иметь столбец идентификатора (для ключа) и столбец JSON_DOCUMENT для содержимого JSON (по умолчанию имена столбцов могут быть изменены по желанию через метаданные пользовательских коллекций, переданные createCollection). Эта базовая таблица таблиц также видима / доступна из SQL. По умолчанию JSON_DOCUMENT представляет собой BLOB, но через метаданные пользовательской коллекции вы можете запросить хранилище VARCHAR2 или CLOB. Это очень легко сделать в нескольких строках кода.
См. Пример для начала работы: https://github.com/oracle/soda-for-java/blob/master /doc/Getting-started-example.md
SODA в основном дает вам абстрагирование коллекций документов NoSQL, и с ним очень легко работать с Java. Это избавляет вас от необходимости кодировать SQL поверх JDBC и обрабатывать вещи низкого уровня, такие как переменные связывания и т. Д.
(2) Если SODA не является правильной абстракцией для вашего прецедента, вы можете использовать JSON поддержка в Oracle и JDBC (это именно то, что SODA использует под обложками). Вы должны создать обычную таблицу со столбцом для идентификатора и столбцом для JSON. При определении этой таблицы вы помещаете ограничение «is json» в столбец JSON. Столбец JSON может иметь тип BLOB (рекомендуется), VARCHAR2 или CLOB. С BLOB, в отличие от VARCHAR2, размер JSON не ограничивается 32k, а конверсии кодирования исключаются.
Затем вы связываете / извлекаете данные JSON, как обычно, с JDBC (точно так же, как обычно связывать / извлекать данные, отличные от JSON, в / из BLOB / VARCHAR2 / CLOB, ничего не меняется). Вы можете использовать различные JSON-операторы (json_value, json_table и т. Д.) В ваших SQL-запросах, которые вы выдаете через JDBC, чтобы работать со своими данными JSON.
Идея: вам нужно убрать третий контроллер с анимацией, а после сброса вам нужно убрать второй без анимации. Пока третий контроллер уволен, второй не должен быть виден.
Во-первых, установите Стиль представления контроллера второго представления на Over Current Context
, когда вы его представляете (поскольку нам нужно будет скрыть его view
, когда мы уволим третий контроллер) [ 1114]
let vc2 = VC2()
vc2.modalPresentationStyle = .overCurrentContext
present(vc2, animated: true)
продолжаем создавать свойства обратных вызовов для willDismiss
и didDismiss
внутри третьего контроллера. Этот обратный вызов будет вызываться до и после того, как вы отключите третий контроллер
class VC3: UIViewController {
var willDismiss: (() -> Void)?
var didDismiss: (() -> Void)?
@IBAction func dismissButtonPressed(_ sender: UIButton) {
willDismiss?()
dismiss(animated: true) {
self.didDismiss?()
}
}
}
, а затем во втором контроллере представления в том месте, где вы представляете третий контроллер представления, установите свойства обратного вызова третьего контроллера: объявите, что происходит, когда третий контроллер отклонит : вам нужно скрыть представление секунды, а затем после удаления третьей вам нужно удалить секунду без анимации (view
может оставаться скрытым, поскольку контроллер представления будет деинициализирован)
class VC2: UIViewController {
@objc func buttonPressed(_ sender: UIButton) {
var vc3 = VC3()
vc3.willDismiss = {
self.view.isHidden = true
}
vc3.didDismiss = {
self.dismiss(animated: false)
}
present(vc3, animated: true)
}
}
В любом случае, второй вариант использует UINavigationController
, а затем просто вызывает его метод popToViewController(_:animated:)
.
Используйте это в методе действия кнопки. Текущий VC будет отклонен, когда вы отклоните родительский VC. Это позволит отклонить оба VC в одной анимации.
self.presentingViewController?.presentingViewController?.dismiss(animated: true, completion: nil)