Файл: М инобрнауки россии федеральное государственное бюджетное образовательное учреждение высшего образования Национальный исследовательский университет мэи.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 09.11.2023

Просмотров: 642

Скачиваний: 4

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.

Выводы


В главе была рассчитана себестоимость реализации данной работы, в ходе которой выяснилось, что основными затратами при заработке является заработная плата программиста далее по весомости затрат, идут отчисления в социальные фонды и накладные расходы. После подсчёта общей себестоимости была рассчитана предполагаемая прибыльность данной работы, в ходе которой было определено, что разработка мобильного приложения окупится в течении полутора лет.

ЗАКЛЮЧЕНИЕ


БД ФИАС — это полностью открытая адресная система и большинство людей должны иметь лёгкий способ взаимодействия с ней. И самым удобный для современного человека способом взаимодействия с любой системой является мобильное приложение, которое позволит использовать адресную систему в любой момент времени, а автономный режим работы позволит не быть привязанным к интернет-сети. Для этих целей была реализована данная работа.

Для достижения подобной цели были определены и выполнены следующие задачи:

  1. анализ источников, литературы, имеющих отношение к выполнению данной работы;

  2. анализ форматов распространения БД ФИАС и выбор наиболее удобного для мобильного устройства;

  3. анализ технологий разработки мобильного программного обеспечения и подбор инструментальных средств;

  4. проектирование таблиц и построение базы данных для хранения информации из БД ФИАС;

  5. проектирование интерфейса мобильного приложения;

  6. реализация интерфейса;

  7. реализация основного функционала мобильного приложения;

  8. проведение тестирования разработанного ПО.

В результате было разработано мобильное приложение, загружающее актуальную версию БД ФИАС в формате КЛАДР поскольку это наиболее легковесный вариант, далее адресная система преобразуется в БД формата административно-территориального деления, которая работает на базе СУБД SQLite, после пользователь может осуществлять поиск нужной информации в адресной системе
, добавлять интересующие данные в избранное и распространять информацию из адресной системы путём копирования данных. В случае устаревания версии БД ФИАС пользователь будет уведомлён и сможет обновить адресную систему в любой момент.

Данная работа не заканчивается реализацией мобильного приложение, поскольку есть ещё большой потенциал для развития. Использующийся для разработки приложения кроссплатформенный фреймворк Xamarin позволит в будущем с лёгкостью портировать ПО на другие платформы, такие как IOS, Windows, Linux. Параллельно можно будет разрабатываться более удобные способы взаимодействия с БД ФИАС путём создания иных инструментов для поиска информации и её распространения. Коммерчески развивать данную работу можно путём добавления рекламных баннеров, а так же создав отдельную версию приложения, которая будет распространяться по подписке для получения регулярной прибыли.

СПИСОК ЛИТЕРАТУРЫ


  1. Statcouter Mobile Operating System Market Share Worldwide [Электронный ресурс] – режим доступа: https://gs.statcounter.com/os-market-share/mobile/worldwide;

  2. AV-Comparatives IT Security Survey 2022. 2022, C. 7;

  3. Яндекс Радар анализ трафика мобильных устройств РФ [Электронный ресурс] – режим доступа: https://radar.yandex.ru/mobile;

  4. Яндекс Радар анализ трафика по типам устройств в РФ [Электронный ресурс] – режим доступа: https://radar.yandex.ru/device_categories;

  5. Черников В. Н. Разработка мобильных приложений на C# для IOS и Android. – М.: ДМК Пресс, 2020;

  6. Developer Survey 2022 [Электронный ресурс] – режим доступа: https://survey.stackoverflow.co/2022;

  7. Popularity of Programming Language [Электронный ресурс] – режим доступа: https://pypl.github.io/PYPL.html;

  8. Унгер Р., Чендлер К. UX-дизайн. Практическое руководство по проектированию опыта взаимодействия. – Пер. с англ. – СПб.: Символ-Плюс, 2011;

  9. Монетизация приложений для мобильных устройств [Электронный ресурс] – режим доступа: https://woxapp.com/ru/our-blog/monetize-mobile-applications;

  10. Попова-Коварцева Д.А., Сопченко Е.В.. Основы проектирования баз данных: учеб. Пособие. – Самара: Изд-во Самарского университета, 2019;



ПРИЛОЖЕНИЯ


Приложение 1

Программный код класса SQLCreator

using System;

using System.Collections.Generic;

using System.Linq;

using System.Threading.Tasks;

using SQLite;

using Data;

using DBSpace;

namespace SQLSpace

{

public struct f_SQL_page

{

public class SQLCreator

{

string DBPath { get; set; }

public SQLiteConnection DB { get; set; }

public SQLCreator(string path)

{



this.DBPath = path;

this.DB = new SQLiteConnection(this.DBPath + "/KLADR.db");

}
public void CreateInfoTable(DateTime db_date)

{

//Таблица информации о БД

this.DB.CreateTable();

//this.DB.Execute("CREATE TABLE DBInfo(" +

// "id INTEGER PRIMARY KEY AUTOINCREMENT not null," +

// "db_version date)");

//Заполнение таблица DBInfo

this.DB.Insert(new DBInfoSQL()

{

db_version = db_date.Date,

//db_version = new DateTime(2022, 11, 11),

});

var test = this.DB.Table().ToList();

}

public async void CreateAllTable()

{

DataBaseWorker DB_worker = new DataBaseWorker();

DB_worker.DBPath = this.DBPath;

//<<<<<<<<<<<<<<<< Создание таблиц базы данных >>>>>>>>>>>>>>>

//Таблица избранного

this.DB.CreateTable();

//Таблица субъектов РФ

this.DB.CreateTable();

//Таблица наименований типов адресных объектов

this.DB.CreateTable();

//Таблица административных районов

this.DB.Execute("CREATE TABLE District(" +

"id INTEGER PRIMARY KEY AUTOINCREMENT not null," +

"id_subject INTEGER not null," +

"name varchar," +

"sorc varchar," +

"code varchar," +

"octd varchar," +

"FOREIGN KEY (id_subject) REFERENCES Subject (id) ON DELETE CASCADE)");

//Таблица городов и населённых пунктов

this.DB.Execute("CREATE TABLE CityGPT(" +

"id INTEGER PRIMARY KEY AUTOINCREMENT not null," +

"id_district INTEGER not null," +

"name varchar," +

"sorc varchar," +

"code varchar," +

"octd varchar," +

"gnimb varchar," +

"uno varchar," +

"FOREIGN KEY (id_district) REFERENCES District (id) ON DELETE CASCADE)");

//Таблица улиц

this.DB.Execute("CREATE TABLE Street(" +

"id INTEGER PRIMARY KEY AUTOINCREMENT not null," +

"id_citygpt INTEGER not null," +

"name varchar," +

"sorc varchar," +

"code varchar," +

"FOREIGN KEY (id_citygpt) REFERENCES CityGPT (id) ON DELETE CASCADE)");

//Таблица домов

this.DB.Execute("CREATE TABLE House(" +

"id INTEGER PRIMARY KEY AUTOINCREMENT not null," +

"id_street INTEGER not null," +

"name varchar," +

"sorc varchar," +

"code varchar," +

"octd varchar," +

"mail_index varchar," +

"FOREIGN KEY (id_street) REFERENCES Street (id) ON DELETE CASCADE)");

//<<<<<<<<<<<<<<<< Заполнение таблиц базы данных >>>>>>>>>>>>>>>

//Заполнение таблицы SorcName

await DB_worker.GetSOCR();

this.DB.InsertAll(DB_worker.SOCR);

var socr_names = DB.Table().ToList();

//var socr = await this.DB.Table().Where(x => x.level == 1).ToListAsync();

var socr = this.DB.Table().ToList();

try

{

//Заполнение таблицы Subject

await DB_worker.GetKLADR();

var items = from i in DB_worker.KLADR

where (i.sorc == "Респ"

|| (i.sorc == "АО"

|| i.sorc == "край"

|| i.sorc == "обл"

|| i.sorc == "Аобл"

|| i.sorc == "Чувашия")

|| ((i.name == "Москва") && (i.sorc == "г"))

|| ((i.name == "Санкт-Петербург") && (i.sorc == "г"))

|| ((i.name == "Севастополь") && (i.sorc == "г")))

&& i.code.Substring(2, 11) == "00000000000"

select new SubjectSQL()

{

name = i.name,

sorc = socr.Find(x => x.name == i.sorc).sorc_name,

octd = i.octd,

code = i.code,

gnimb = i.gninmb,

};

this.DB.InsertAll(items);

items = null;

}

catch (Exception ex)

{

Console.WriteLine("-------------Hello error ____________");

Console.WriteLine(ex.ToString());

//return false;

}

//Заполняем таблицу District

var district_list = from i in DB_worker.KLADR

join j in this.DB.Table().ToList() on i.code.Substring(0, 2) equals j.code.Substring(0, 2)

where i.sorc == "р-н" && i.code.Substring(i.code.Length - 2, 2) == "00"

select new DistrictSQL()

{

name = i.name,

code = i.code,

octd = i.octd,

sorc = socr.Find(x => x.name == i.sorc).sorc_name,

id_subject = j.Id,

};

DB.InsertAll(district_list);

district_list = null;

GC.Collect();

//Добавление городов федерального значения в административные районы

var city_federal = from i in this.DB.Table().ToList()

where i.sorc == "Город"

select new DistrictSQL()

{

name = i.name,

code = i.code,

octd = i.octd,

sorc = "Город федерального значения",

id_subject = i.Id,

};

DB.InsertAll(city_federal);

//Заполняем таблицу CityGPT

var citygpt_list = from i in DB_worker.KLADR

join j in this.DB.Table().ToList() on i.code.Substring(0, 5) equals j.code.Substring(0, 5)

where i.code.Substring(i.code.Length - 2, 2) == "00"

select new CityGPTSQL()

{

name = i.name,

code = i.code,

octd = i.octd,

sorc = socr.Find(x => x.name == i.sorc).sorc_name,

uno = i.uno,

gnimb = i.gninmb,

id_district = j.Id,

};

DB.InsertAll(citygpt_list);

citygpt_list = null;

GC.Collect();

//Очистка данных из памяти

DB_worker.KLADR.Clear();

//Заполняем таблицу Street

try

{

await DB_worker.GetSTREETSQL();

var street_list = from i in DB_worker.STREET

join j in this.DB.Table().ToList() on i.code.Substring(0, 11) equals j.code.Substring(0, 11)

where i.code.Substring(i.code.Length - 2, 2) == "00"

select new StreetSQL()

{

name = i.name,

code = i.code,

sorc = i.sorc,

id_citygpt = j.Id,

};

//Console.WriteLine("<<<<<<<<< " + street_list.ToString() + " >>>>>>>>");

DB.InsertAll(street_list);

//Очистка данных

DB_worker.STREET.Clear();

street_list = null;

GC.Collect();

}

catch (Exception ex)

{

Console.WriteLine("<<<<<<< Set Street Error >>>>>>>>");

Console.WriteLine(ex.ToString());

//return false;

}

//Заполняем таблицу House

await DB_worker.GetDOMASQL();

var house_list = from i in DB_worker.DOMA

join j in this.DB.Table().ToList() on i.code.Substring(0, 17) equals j.code.Substring(0, 17)

select new HouseSQL()

{

name = i.name,

code = i.code,

octd = i.octd,

sorc = i.sorc,

mail_index = i.mail_index,

id_street = j.Id,

};

try

{

DB.InsertAll(house_list);
DB_worker.DOMA.Clear();

house_list = null;

}

catch (Exception ex)

{

Console.WriteLine("<<<<<<< Set House Error >>>>>>>>");

Console.WriteLine(ex.ToString());

//return false;

}

Console.WriteLine("---------------- Yeeeeeeeeeeeess -------------------------------");

//return true;

}

public async Task> GetSubjectsAsync()

{

try

{

return DB.Query("select * from Subject");

}

catch (Exception ex)

{

Console.WriteLine("----------- ERROR ------------");

Console.WriteLine(ex.ToString());

return null;

}

}

public async Task> GetDistrictAsync(int id)

{

try

{

return DB.Query("select * from District where id_subject = ?", id);

}

catch (Exception ex)

{

Console.WriteLine("----------- ERROR ------------");

Console.WriteLine(ex.ToString());

return null;

}

}

public async Task> GetCityGPTAsync(int id)

{

try

{

return DB.Query("select * from CityGPT where id_district = ?", id);

}

catch (Exception ex)

{

Console.WriteLine("----------- ERROR ------------");

Console.WriteLine(ex.ToString());

return null;

}

}

public async Task> GetStreetAsync(int id)

{

try

{

return DB.Query("select * from Street where id_citygpt = ?", id);

}

catch (Exception ex)

{

Console.WriteLine("----------- ERROR ------------");

Console.WriteLine(ex.ToString());

return null;

}

}

public async Task

> GetHouseAsync(int id)

{

try

{

return DB.Query("select * from House where id_street = ?", id);

}

catch (Exception ex)

{

Console.WriteLine("----------- ERROR ------------");

Console.WriteLine(ex.ToString());

return null;

}

}

public DateTime GetDBVersion()

{

return DB.Table().ToList()[0].db_version.Date;
}
public async Task SearchAdress(string[] search_text)

{

try

{

var subject = DB.Query("select * from Subject where name = ?", search_text[0]);

if (subject != null)

{

var districts = await GetDistrictAsync(subject[0].Id);

if (districts != null)

{

var city_gpt = from i in districts

join j in this.DB.Table().ToList() on i.code.Substring(0, 5) equals j.code.Substring(0, 5)

where j.name == search_text[1] && j.code.Substring(j.code.Length - 2, 2) == "00"

select new CityGPTSQL()

{

name = j.name,

code = j.code,

octd = j.octd,

sorc = j.sorc,

uno = j.uno,

id_district = i.Id,

};

if (city_gpt != null)

{

var street = from i in city_gpt

join j in this.DB.Table().ToList() on i.code.Substring(0, 11) equals j.code.Substring(0, 11)

where j.name == search_text[2] && j.code.Substring(j.code.Length - 2, 2) == "00"

select new StreetSQL()

{

name = j.name,

code = j.code,

sorc = j.sorc,

id_citygpt = i.Id,

};

if (street != null)

{

var house = from i in street

join j in this.DB.Table().ToList() on i.code.Substring(0, 17) equals j.code.Substring(0, 17)

select new House()

{

name = j.name.Split(',').ToList(),

code = j.code,

octd = j.octd,

sorc = j.sorc,

mail_index = j.mail_index,

};

house = from i in house

where i.name.Find(x => x == search_text[3]) != null

select i;

if (house != null)

{

return "Субъект: " + subject[0].name + "\nКод субъекта: " + subject[0].code.Substring(0, 2)

+ "\nНаселённый пункт: "

+ "\nДом: " + house.ToString();

}

else

{

return "Дом не найден";

}

}

else

{

return "Улица не найдена";

}

}

else

{

return "Город, населённый пункт не найден";

}

}

else

{

return "Некорректно введены данные";

}

}

else

{

return "Некорректно введены данные";

}

}

catch (Exception ex)

{

Console.WriteLine("----------- Search Error ------------");

Console.WriteLine(ex.ToString());

return "Error";

}

}

}

}

}
Приложение 2

Реализованный графический интерфейс мобильного приложения



Страница быстрого поиска по БД ФИАС



Страница поиска по БД



Страница избранных адресный объектов



Боковое меню с областью актуальности БД



Страница «О приложении»



Уведомление пользователя при копировании данных в буфер обмена



Уведомление пользователя при добавлении адресного объекта в избранное