- •Аннотция
- •Содержание
- •Введение
- •1 Разработка базы данных
- •1.1 Выбор базы данных и формата хранения записей
- •1.2 Экспорт данных и последующее представление
- •2 Разработка модели предсказания уровня сахара в крови
- •3 Разработка ios приложения
- •3.1 Обоснование выбора среды и инструментов реализации
- •3.2 Разработка составных частей мобильного приложения
- •Заключение
- •Приложение а
Заключение
В ходе работы была разработана база данных и добавлены следующие страницы интерфейса: изменение сахара, введение инсулина, добавление записи о кетонурии, добавление измерения массы тела и расчет индекса массы тела, персональные данные пациента. Помимо этого, реализован механизм фильтрации введенных пользователем данных на основе разработанных ранее правил, с целью повышения достоверности полученной информации. Пользователю по мере заполнения дневника предлагается указать дни, которые он, по собственному мнению, заполнил полнее всего. Также система регистрирует установленные на телефоне время и дату на момент внесения записи в дополнение к указанной пользователем. Модель машинного обучения представляет собой градиентный бустинг деревьев регрессии. На данный момент она обладает сравнительно высокой точностью предсказания постпрандиального гликемического ответа, однако требует инвазивного измерения уровня глюкозы в крови, что вызывает некоторое недовольство со стороны пациенток с ГСД, не готовых в течение всего срока беременности пользоваться глюкометром. Человеческий фактор играет решающую роль и в регулярности ведения записей. Мобильная платформа предлагает широкий выбор уведомлений, и, хотя их эффективность довольно высока, высокая частота напоминаний связана с ростом раздражительности пациента. Как видно, в ходе разработки приложения постоянно появляются новые задачи и вопросы, однозначного решения которых пока нет, и все же была проведена большая работа, результаты которой будут пересматриваться и улучшаться в дальнейшем.
Приложение а
pacientManager.swift
import Foundation
import SQLite
func addName(pName: String){
do {
let documents = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let path = documents + "/diacompanion.db"
let sourcePath = Bundle.main.path(forResource: "diacompanion", ofType: "db")!
_=copyDatabaseIfNeeded(sourcePath: sourcePath)
let db = try Connection(path)
let users = Table("usermac")
let name = Expression<String>("fio")
let _id = Expression<Int>("id")
let all = Array(try db.prepare(users.select(_id)))
if all.count != 0 {
try db.run(users.update(name <- pName))
} else {
try db.run(users.insert(name <- pName))
}
} catch {
print(error)
}
}
func addDate(pDate: String){
do {
let documents = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let path = documents + "/diacompanion.db"
let sourcePath = Bundle.main.path(forResource: "diacompanion", ofType: "db")!
_=copyDatabaseIfNeeded(sourcePath: sourcePath)
let db = try Connection(path)
let users = Table("usermac")
let bdate = Expression<String>("birthday")
let _id = Expression<Int>("id")
let all = Array(try db.prepare(users.select(_id)))
if all.count != 0 {
try db.run(users.update(bdate <- pDate))
} else {
try db.run(users.insert(bdate <- pDate))
}
} catch {
print(error)
}
}
func addVrach(pVrach: String){
do {
let documents = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let path = documents + "/diacompanion.db"
let sourcePath = Bundle.main.path(forResource: "diacompanion", ofType: "db")!
_=copyDatabaseIfNeeded(sourcePath: sourcePath)
let db = try Connection(path)
let users = Table("usermac")
let doc = Expression<String>("doc")
let _id = Expression<Int>("id")
let all = Array(try db.prepare(users.select(_id)))
if all.count != 0 {
try db.run(users.update(doc <- pVrach))
} else {
try db.run(users.insert(doc <- pVrach))
}
} catch {
print(error)
}
}
func addDateS(pDate: String){
do {
let documents = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let path = documents + "/diacompanion.db"
let sourcePath = Bundle.main.path(forResource: "diacompanion", ofType: "db")!
_=copyDatabaseIfNeeded(sourcePath: sourcePath)
let db = try Connection(path)
let users = Table("usermac")
let dateS = Expression<String>("datebegin")
let _id = Expression<Int>("id")
let all = Array(try db.prepare(users.select(_id)))
if all.count != 0 {
try db.run(users.update(dateS <- pDate))
} else {
try db.run(users.insert(dateS <- pDate))
}
} catch {
print(error)
}
}
func addWeekDay(week: Int, day: Int){
do {
let documents = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let path = documents + "/diacompanion.db"
let sourcePath = Bundle.main.path(forResource: "diacompanion", ofType: "db")!
_=copyDatabaseIfNeeded(sourcePath: sourcePath)
let db = try Connection(path)
let users = Table("usermac")
let pweek = Expression<Int>("week")
let pday = Expression<Int>("day")
let _id = Expression<Int>("id")
let all = Array(try db.prepare(users.select(_id)))
if all.count != 0 {
try db.run(users.update(pweek <- week, pday <- day))
} else {
try db.run(users.insert(pweek <- week, pday <- day))
}
} catch {
print(error)
}
}
func addID(id: Int){
do {
let documents = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let path = documents + "/diacompanion.db"
let sourcePath = Bundle.main.path(forResource: "diacompanion", ofType: "db")!
_=copyDatabaseIfNeeded(sourcePath: sourcePath)
let db = try Connection(path)
let users = Table("usermac")
let _id = Expression<Int>("id")
let all = Array(try db.prepare(users.select(_id)))
if all.count != 0 {
try db.run(users.update(_id <- id))
} else {
try db.run(users.insert(_id <- id))
}
} catch {
print(error)
}
}
func addWeight(Weight: Double){
do {
let documents = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let path = documents + "/diacompanion.db"
let sourcePath = Bundle.main.path(forResource: "diacompanion", ofType: "db")!
_=copyDatabaseIfNeeded(sourcePath: sourcePath)
let db = try Connection(path)
let users = Table("usermac")
let weight = Expression<Double>("weight")
let _id = Expression<Int>("id")
let all = Array(try db.prepare(users.select(_id)))
if all.count != 0 {
try db.run(users.update(weight <- Weight))
} else {
try db.run(users.insert(weight <- Weight))
}
} catch {
print(error)
}
}
func addHeight(Height: Double){
do {
let documents = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let path = documents + "/diacompanion.db"
let sourcePath = Bundle.main.path(forResource: "diacompanion", ofType: "db")!
_=copyDatabaseIfNeeded(sourcePath: sourcePath)
let db = try Connection(path)
let users = Table("usermac")
let height = Expression<Double>("height")
let _id = Expression<Int>("id")
let all = Array(try db.prepare(users.select(_id)))
if all.count != 0 {
try db.run(users.update(height <- Height))
} else {
try db.run(users.insert(height <- Height))
}
} catch {
print(error)
}
}
func addSugarChange(lvl: Double, period: String, physical: Int, time: String){
do {
let documents = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let path = documents + "/diacompanion.db"
let sourcePath = Bundle.main.path(forResource: "diacompanion", ofType: "db")!
_=copyDatabaseIfNeeded(sourcePath: sourcePath)
let db = try Connection(path)
let sugar = Table("sugarChange")
let _lvl = Expression<Double>("lvl")
let _period = Expression<String>("period")
let _physical = Expression<Int>("physical")
let _time = Expression<String>("time")
try db.run(sugar.insert(_lvl <- lvl, _period <- period, _physical <- physical, _time <- time))
}
catch {
print(error)
}
}
func addAct(min: Int, rod: String, time: String){
do {
let documents = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let path = documents + "/diacompanion.db"
let sourcePath = Bundle.main.path(forResource: "diacompanion", ofType: "db")!
_=copyDatabaseIfNeeded(sourcePath: sourcePath)
let db = try Connection(path)
let act = Table("act")
let _min = Expression<Int>("min")
let _rod = Expression<String>("rod")
let _time = Expression<String>("time")
try db.run(act.insert(_min <- min, _rod <- rod, _time <- time))
}
catch {
print(error)
}
}
func addInject(ed: Double, type: String, priem: String, time: String){
do {
let documents = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let path = documents + "/diacompanion.db"
let sourcePath = Bundle.main.path(forResource: "diacompanion", ofType: "db")!
_=copyDatabaseIfNeeded(sourcePath: sourcePath)
let db = try Connection(path)
let inject = Table("inject")
let _ed = Expression<Double>("ed")
let _type = Expression<String>("type")
let _priem = Expression<String>("priem")
let _time = Expression<String>("time")
try db.run(inject.insert(_ed <- ed, _type <- type, _priem <- priem, _time <- time))
}
catch {
print(error)
}
}
func addMassa(m: Double, time: String){
do {
let documents = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let path = documents + "/diacompanion.db"
let sourcePath = Bundle.main.path(forResource: "diacompanion", ofType: "db")!
_=copyDatabaseIfNeeded(sourcePath: sourcePath)
let db = try Connection(path)
let massa = Table("massa")
let _m = Expression<Double>("m")
let _time = Expression<String>("time")
try db.run(massa.insert(_m <- m, _time <- time))
}
catch {
print(error)
}
}
func addKetonur(mmol: Double, time: String){
do {
let documents = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let path = documents + "/diacompanion.db"
let sourcePath = Bundle.main.path(forResource: "diacompanion", ofType: "db")!
_=copyDatabaseIfNeeded(sourcePath: sourcePath)
let db = try Connection(path)
let ketonut = Table("ketonur")
let _mmol = Expression<Double>("mmol")
let _time = Expression<String>("time")
try db.run(ketonut.insert(_mmol <- mmol, _time <- time))
}
catch{
print(error)
}
}
func addDatesToDB(dates: [Date]) {
do {
let documents = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let path = documents + "/diacompanion.db"
let sourcePath = Bundle.main.path(forResource: "diacompanion", ofType: "db")!
_=copyDatabaseIfNeeded(sourcePath: sourcePath)
let db = try Connection(path)
let fulldays = Table("fulldays")
let day = Expression<String>("day")
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "ru_RU")
dateFormatter.setLocalizedDateFormatFromTemplate("dd.MM.yyyy")
for i in 0..<dates.count {
try db.run(fulldays.insert(day <- dateFormatter.string(from: dates[i])))
}
}
catch {
print(error)
}
}
func getDatesFromDB() -> [Date] {
var dates : [Date] = []
do {
let documents = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let path = documents + "/diacompanion.db"
let sourcePath = Bundle.main.path(forResource: "diacompanion", ofType: "db")!
_=copyDatabaseIfNeeded(sourcePath: sourcePath)
let db = try Connection(path)
let fulldays = Table("fulldays")
let day = Expression<String>("day")
let dateFormatter = DateFormatter()
dateFormatter.locale = Locale(identifier: "ru_RU")
dateFormatter.setLocalizedDateFormatFromTemplate("dd.MM.yyyy")
for i in try db.prepare(fulldays.select(day)) {
dates.append(dateFormatter.date(from: i[day])!)
}
}
catch {
print(error)
}
return dates
}
func copyDatabaseIfNeeded(sourcePath: String) -> Bool {
let documents = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first!
let destinationPath = documents + "/diacompanion.db"
let exists = FileManager.default.fileExists(atPath: destinationPath)
guard !exists else { return false }
do {
try FileManager.default.copyItem(atPath: sourcePath, toPath: destinationPath)
return true
} catch {
print("error during file copy: \(error)")
return false
}
}