Разработка приложений баз данных. Поддержка баз данных (Технологии доступа к данным

21.04.2019

ПОДДЕРЖКА БАЗ ДАННЫХ

11.1. Технологии доступа к данным

В Visual C++ имеются технологии доступа к данным, обеспечивающие создание приложений для работы с базами данных. «Количество доступных Windows-приложениям интерфейсов доступа к данным может показаться чрезмерным. Какую же из технологий с загадочными именами – DAO, ODBC, RDO, UDA, OLE DB или ADO – выбрать для построения конкретного приложения» [л.10,стр. 242]. Большинство технологий доступа базируются на двух ключевых технологиях: ODBC (Open Database Connectivity – открытая связь с базами данных) и DAO (Data Access Object – объекты доступа к данным).

Сравнительные параметры технологий ODBC и DAO могут быть представлены следующим образом:

Параметр

Архитектура

Набор DLL-модулей,драйверы

Набор объектов OLE

Источники данных

Файлы БД любых форматов

А также SQL Server и Oracle

Файлы БД формата.mdb,

Access, FoxPro, Paradox

Соединение с базой данных

Объект класса CDatabase

Объект класса CDaoDatabase

Выборка данных

Объект класса Crecordset

Объект класса CDaoRecordset

Просмотр данных

Объект класса CrecordView

Объект класса CDaoRecordView

Набор функций

Меньший набор функций, чем

Большой набор функций,

нет аналогов в ODBC

Между технологиями ODBC и DAO есть много общего, например, использование классов MFC с похожими функциями для выполнения одинаковых операций соединения с БД, выборки набора записей БД и просмотра их. Но классы DAO содержат больший набор функций, а также функции, не имеющие аналогов в ODBC.

Есть и существенные различия. Это касается архитектуры технологий в реализации системных библиотек. Классы ODBC реализованы как набор DLL-модулей, называемых драйверами (DLL, Dinamic-Link Library – динамически подключаемые библиотеки). А классы DAO реализованы как набор объектов OLE, что более современно.

Еще существенное различие технологий заключается в их использовании для источников данных. В настоящее время разработано достаточно большое количество ODBC-драйверов для различных СУБД. Поэтому, ODBC может использоваться для файлов БД различных форматов, а DAO – только, в основном, для файлов БД формата.mdb. При этом приложение на основе ODBC может одновременно работать с различными СУБД без перекомпиляции за счет динамической загрузки драйверов.

11.2. Создание приложения с базой данных

Создание приложения для работы с базой данных на основе технологий ODBC или DAO требует выполнения следующих этапов:

Установление доступа к базе данных. Этап заключается в регистрации заданной базы данных, как источника данных.

Создание заготовки приложения. Этап выполняется автоматически с помощью мастера AppWizard при выполнении 6 этапов настройки приложения с выбором технологии доступа к источнику данных ODBC или DAO.

Реализация операций с базой данных. Этап выполняется с использованием классов MFC соответствующей технологии доступа к данным.

Цель работы - создание приложения, выполняющего операции с базой данных: просмотр, добавление, удаление.

Воспользуемся файлом db.mdb, который представляет собой базу данных, созданную в СУБД Access. Файл содержит сведения о студентах: Name (Имя), Grade (Курс). Файл можно скачать по адресу ftp://ftp.sybex.com/2120/vcpp.exe [л.13,стр. 415]. Можно создать собственный файл в любой программе для работы с базами данных.

Пусть экранная форма отображения содержимого базы данных данных будет выглядеть следующим образом:

Untitled – Lab11

File Edit Record View Help

[|<] [<] [>] [>|]

Установление доступа к базе данных

Для установления доступа к базе данных, как к источнику данных, выполнить следующие действия:

Создать папку Dbase и скопировать в нее файл db.mdb. Если создан собственный файл данных, то скопировать его.

Щелкнуть последовательно Пуск, Настройка, Панель управления. В окне Панели управления дважды щелкнуть на 32-Bit ODBC. Появится окно Источники данных - Data Source Administrator.

Щелкнуть на кнопке Add. Раскроется окно Create New Data Source со списком драйверов. Выбрать Microsoft Access Driver (.mdb) и щелкнуть на кнопке Finish. Появится окно ODBC Microsoft Access 7.0 Setup.

Ввести в поле Data Source Name (Имя источника данных) значение Students, а в поле Description (Описание) – значение Name_Grade. Если создан собственный файл данных, то ввести соответствующие значения.

Щелкнуть на кнопке Select. Раскроется окно Select Database (Выбор базы данных). Выбрать файл db.mdb или собственный файл.

Щелкнуть на кнопке OK. Появится окно ODBC Microsoft Access 7.0 Setup. Щелкнуть на кнопке OK, и затем – на кнопке OK в окне ODBC Data Source Administrator.

Итак, установлен доступ к файлу базы данных db.mdb (или к собстенному файлу) с помощью ODBC-драйвера Microsoft Access Driver (.mdb).

Создание заготовки приложения

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

Выбрать команду File->New и вкладку Projects. Появится окно New Project со списком типов приложений.

Выбрать из списка MFC Appwizard (exe). В поле Project name ввести имя проекта Lab11. В поле Location указана папка для хранения проекта (по умолчанию – то же, что и имя проекта). Щелкнуть на ОК.

Выполнить 6 этапов настройки создаваемого приложения. На 1-ом этапе выбрать SDI (Single Document Interface) – одно открытое окно и щелкнуть на Next.

2-ой этап – работа с базами данных. Переключатель Header files only (только файлы заголовков) предполагает только доступ к базам данных, Database view without file support – просмотр базы данных без поддержки операций с файлами (можно обновлять записи), Database view with file support - просмотр базы данных и поддержка операций с файлами (работа с множеством документов) . В нашем примере установить переключатель Database view with file support. Для соединения приложения и источника данных щелкнуть на кнопке Data Source (Источник данных).

Одним из наиболее распространенных сценариев в разработке приложений является отображение данных из БД на формеWindows Forms . Поэтому с учетом процессов, которые используются при работе с наборами данных, предлагаемыхMicrosoft (рис. 5.6.1-2), и с учетом того, что представленные задачи учебные, в примерах будем рассматривать следующие процессы:

    Разработка БД.

    Разработка приложения Windows:

      создание проекта;

      создание интерфейса пользователей;

      создание подключения к данным базы данных и отображение их на форме

      редактирование, проверка и сохранение данных в приложении;

      разработка программного кода приложения.

    Выполнение приложения.

    Анализ результатов работы приложения.

5.6.3.1. Пример создания проекта «Пропуски» для работы с бд «DataBase1»

Задание:

В базу данных c именем « DataBase 1» в определенные дни поступают сведения о количестве пропущенных часов, которые имеют студенты по каждому из трех предметов, при этом доступна следующая информация:

    дата проверки;

    учебная группа;

    фамилия студента;

    год рождения;

    число пропущенных часов по информатике;

    число пропущенных часов по математике

    число пропущенных часов по физике.

Необходимо создать проект с именем «Пропуски», который используя сведения из этой базы данных, вычисляет в какой день и по какому предмету имелось наибольшее число пропусков (указать также фамилию студента, имеющего такое число пропусков). Если таких дней несколько, то перечислить их все.

    Создание базы данных «DataBase1»

Для создания таблицы с именем ПропЧасыСтудента необходимо создать ее структуру, которая будет иметь вид, приведенный на рис. 5.6.3-1.

Заполнение таблицы данными можно выполнить в режиме таблицы. После заполнения таблица ПропЧасыСтудента принимает вид, приведенный на рис.5.6.3-2.

    Разработка приложения Windows для работы с БД Access «DataBase1»

      Создание нового проекта.

Создать проект с именем Пропуски1 .

      Создание интерфейса пользователей.

Создать интерфейс пользователей из одной формы, которая изображена на рис. 5.6.3-3.

Обратите внимание, что шаблон таблицы ПропЧасыСтудента отображается на форме только послеподключения набора данных приложения к базе данных DataBase1.

      Подключение набора данных приложения к базе данных DataBase1 СУБД Access и отображение их на форме.

Процедура подключения приложения VS к данным в базе данныхСУБД Access может быть упрощена за счет использованияМастера Конфигурации источников данных . После завершения работыМастера данные в окнеИсточники данных становятся доступными для перетаскивания на формы.

Для создания набора данных при помощи Мастера настройки источника данных

необходимо:

    В элементе Данные главного меню выбрать командуДобавить новый источник данных или Показать источники данных.

В результате в среде разработки появится окно Мастер настройки источника данных ис. 5.6.3-4).

– это новая функцияVisual Studio IDE , которая автоматически подготавливает программу наVisual Basic к получению информации из базы данных.Мастер запрашивает тип базы данных, с которой будет производиться соединение (ло­кальная илиудаленная база данных ,Web-служба илиобъект данных, созданный вами), устанавливает соединение с данными, а затем созда­ет в программе набор данных, который хранит выбранные таблицы и поля базы данных. Конечным результатом является то, что мастер открывает окноИсточник данных и заполняет его визуальным представлением каждого объекта базы данных, используемого в программе.

    После выбора Источника данных для приложения База данных и нажатия на клавишуДалее Мастер запрашиваетВыбор подключения БД (рис. 5.6.3-5).

    В окне Выбор источника данных (Рис. 5.6.3-6) выбратьБД , являющуюся источником данных –Файл базы данных Access, а затем нажать на кнопкуДалее .

Мастер отобразит форму – Добавление подключения , который помогает установить соединение с базой данных, создав строку, которая называетсясвязывающей строкой (connection string) (рис. 5.6.3-7).

    Связывающая строка содержит инфор­мацию, которая требуется VS для открытия и извлечения информации из файла базы данных. Она включает путь и имя файла, а также дополнительные данные, такие, как имя пользователя и па­роль. По этой причине работа со связывающей строкой в окне Мастер настройки источника данных выполняется очень аккуратно, и вам следует позаботиться о ее защите от несанкционированного доступа при копировании исходных файлов с одного места в другое.

Таким образом, в окне Добавление подключения базы данныхвыбратьAccess Database File .

    Ввести путь к файлу базы данных DataBase 1.mdb или щелкнуть кнопкуОбзор , чтобы найти этот файл, а затем нажать кнопкуОК .

    Снова появится диалоговое окно Добавление подключения (Add Connection) , содержащее путь к базе данных.

    Щелкнуть на кнопке Проверить подключение. Visual Studio попробует открыть указанный файл базы данных, используя связывающую строку, созданную мастером.

    Щелкнуть на кнопке ОК , чтобы закрыть окно сообщения, а затем щелкнуть на кнопкеОК , чтобы закрыть диалоговое окноДобавление подключение (Add Connection) .Visual Studio снова отобразит окно Мастер настройки источника данных (рис. 5.6.3-8)

    Чтобы отобразить готовую связывающую строку, щелкните в диалоговом окне на знаке «плюс» (+) рядом с элементом Строка подключений. Страница Мастера должна выглядеть примерно, так как на рис. 5.6.3-9.

Связывающая строка определяет провайдера.

Мастер отобразит предупреждение, указывающее, что была выбра­на новая локальная база данных (Рис. 5.6.3-10)

Рис. 5.6.3-10

Чтобы избежать создания дополнительной копии базы данных, щел­кните на кнопке Нет, а затем на кнопкеДалее .

При этом Мастер настройки источника данных задаст такой вопрос о сохранении и строки подключения.

По умолчанию выбрана опция сохранения свя­зывающей строки, а, в качестве имени строки в данном примере пред­лагается «DataBase1ConnectionString ». Обычно следует сохранять эту строку в настроечном файле приложения по умолчанию, который до­ступен в окнеОбозреватель решений (Solution Explorer), так как в этом случае при изменении мес­та расположения базы данных эту строку можно будет легко отре­дактировать без поиска ее в коде программы и последующей перекомпиляции приложения (Рис. 5.6.3-11).

Затем будет выдан запрос на выбор подмножества объектов базы дан­ных, которые будут использоваться в данном проекте, как показано в окне Мастер настройки источника данных , изображенном на рис. 5.6.3-12.

Рис. 5.6.3-12

Visual Studio позволяет использовать не только всю базу данных, но и часть ее или объединение несколь­ких различных баз данных - это полезно при создании прило­жений, основанных на данных.

Для нашей задачи следует выбрать все таблицы (поставить соответствующие флажки в квадратике).

    Чтобы добавить функциональность в приложение, то есть отобразить таблицы базы данных на форме необходимо их перетащить из окна Источник данных на форму.

Перетаскивание элементов из окна Источники данных в форму автоматически добавляет нужный код для заполнения набора данных в обработчик событийForm1_Load()(рис. 5.6.3-13).

Рис. 5.6.3-13

      Редактирование, проверка и сохранение данных в приложении

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

В Windows Forms архитектура привязки к данным занимается отправкой изменений из элементов управления с привязкой к данным в набор данных, поэтому не требуется в явном виде обновлять набор данных при помощи собственного кода. Наборы данных поддерживают множество версий строк данных для нахождения изначальных записей в источнике данных. Перед выполнением обновления источника данных, возможно, потребуется проверить отдельные строки.

Изменение данных в DataSetпредставляет собой процесс управления фактическими данными в отдельных объектах, которые составляют набор данных. Изменение данных в таблицах данных подобно изменению данных в таблице любой базы данных – процесс может включать вставку, обновление и удаление записей таблицы.

Кроме изменения фактических данных, также можно запрашивать DataTableдля возвращения определенных строк данных, например, отдельных строк, определенных версий строк (исходные и предложенные), только измененных строк и строк, которые содержат ошибки.

      Разработка программного кода приложения

C первой формой будет связан код, приведенный на рис. 5.6.3-14.

Как было упомянуто выше, правильное использование специализированных компонент ставит их по производительности практически на одну ступень с вызовами API выбранной СУБД. На мой взгляд, использование API оправданно в том редком случае, когда возможностей даже специфических компонент для разработки недостаточно, хотя это и крайне маловероятно, или если для платформы, под которую ведется разработка, такие компоненты отсутствуют (Sun Solaris). Создание запросов к базе данных. Выбрав стратегию доступа к данным и определившись с архитектурой приложения, можно обратить внимание на то, каким образом мы собираемся их использовать. Главное правило состоит в том, что чем меньше вы запрашиваете данных у сервера, тем быстрее будет работать ваше приложение. Конечно, запрашивать у сервера меньше данных, чем пользователь хочет увидеть за один раз, нерационально, поэтому первым вопросом должен быть "какие данные необходимы для каждого модуля системы?" Разработчикам, переходящим с настольных баз данных, требуется перебороть в себе таблично ориентированное представление о базах данных. База InterBase, несомненно, содержит таблицы. Но при проектировании программы вы их не видите, вы видите только результат выполнения запроса SQL. Можно, конечно, написать запрос, который возвращает все записи из таблицы (по крайней мере, видимые для данной транзакции):

SELECT * FROM SOME_TABLE

Но в большинстве случаев такой запрос вернет значительно больше данных, чем это требуется для оптимальной работы пользовательского интерфейса и обработки бизнес-процессов. Подобный запрос, кстати, не использует такие полезные особенности InterBase/ Firebird, как возможность объединения (JOIN) и сортировки (ORDER BY) результирующего набора данных.

Запрашиваете меньше данных - получаете большую скорость. Для осуществления определенных задач в программе вам могут быть не нужны все столбцы таблицы. Фактически не стоит часто использовать знак "*" в запросах выборки, лучше использовать прямое перечисление полей. Подобный способ основывается на том, что даже если мне нужны все столбцы таблицы, мне не нужны столбцы таблицы, которые будут добавлены в будущем, когда я завершу эту часть программы. Определение конкретных столбцов в запросе гарантирует, что я получу только те столбцы, которые я заявил в запросе, даже если структура таблицы будет развиваться дальше. Аналогично даже если пользователь действительно нуждается во всех без исключения записях из таблицы, ему необязательно видеть их все в один момент времени. Пользователю может быть крайне неудобно искать поля в середине сетки данных в таблице с количеством записей выше среднего. Скажем, если у вас в таблице более 100 записей, вам уже следует основательно подумать над дизайном вашего приложения.
К чему все это сводится? Вот к чему: чем меньше вы запрашиваете и пересылаете данных, тем быстрее ваше приложение будет работать, даже на не очень скоростных сетях. Вот несколько прикладных методов, которые вы можете использовать для уменьшения количества выбираемых (SELECT) данных.

Обеспечьте пользователю хорошие инструментальные средства для поиска записей, которые его интересуют. Если список слишком велик, чтобы отображать его в единственном неразрывном виде, разбейте его на логические страницы с табуляцией по первым буквам от "А" до "Я". Если и в этом случае списки получаются слишком длинными, предоставьте пользователю мощные средства фильтрации данных для сужения полученного в результате применения фильтра множества записей. Для реализации поиска данных в приложении вы можете взять на вооружение методы, используемые для поиска web-страниц. Когда пользователю выдается набор записей, даже если он сравнительно небольшой, достаточно использовать одно-два ключевых поля для формирования фильтра запроса. Пусть в приложении будет отдельное окно или часть окна, где пользователь может увидеть все данные по записи, если он обнаружил то, что искал. Старайтесь также использовать объединения таблиц (JOIN) в запросах вместо lookup-полей на формах всюду, где это будет возможно. Хотя и возможно оптимизировать выполнение метода TDataset. Lookup, даже этот улучшенный метод не будет работать быстрее объединения таблиц (JOIN) - про работу немодифицированного метода вообще можно не упоминать.

  • Разработка под Android
    • Tutorial
    • Recovery Mode

    Всем привет! Меня зовут Олег и я программист-любитель под Android. Любитель потому что в данный момент я зарабатываю деньги программированием в совсем другом направлении. А это хобби, которому я посвящаю свое свободное время. К сожалению у меня нет знакомых программистов под Android и все свои базовые знания я черпаю либо из книг, либо из интернета. Во всех тех книжках и статьях в интернете, которые я читал, созданию базы данных для приложения отводится крайне мало места и по сути все описание сводится к созданию класса являющегося наследником SQLiteOpenHelper и последующему внедрению SQL кода в Java код. Если не считать, что мы получаем плохо читаемый код (а если в нашем приложении появляется больше 10 таблиц, то вспоминать все эти взаимосвязи между таблицами тот еще ад), то в принципе жить можно конечно, но как-то совершенно не хочется.
    Забыл сказать самое главное, можно сказать что это моя проба пера тут. И так поехали.

    О вечном вопросе: почему?

    Почему в книгах и в статьях, посвященных программированию под Android, не описываются инструменты для проектирования архитектуры базы данных и какие-нибудь паттерны для работы с базами данных на этапе их создания я честно говоря не знаю. Казалось бы добавить всего пару страниц в книгу или написать отдельную статью (как делаю это я сейчас) проще простого - но нет. В этой статье, я кратко пройдусь по инструментам, которые я использую в своей работе и более подробно по коду который отвечает за начальное создание БД, который с моей точки зрения выглядит более читаемым и удобным.


    Если в нашем приложении больше 5 таблиц, то уже было бы не плохо использовать какой-нибудь инструмент для визуального проектирования архитектуры БД. Поскольку для меня это хобби, то и использую я абсолютно бесплатный инструмент под названием Oracle SQL Developer Data Modeler (скачать его можно ).

    Данная программа позволяет визуально рисовать таблицы, и строить взаимосвязи с ними. Многие ошибки проектирования архитектуры БД можно избежать при таком подходе проектирования (это я уже вам говорю как профессиональный программист БД). Выглядит это примерно так:

    Спроектировав саму архитектуру, приступаем к более нудной части, заключающийся в созданий sql кода для создания таблиц. Для помощи в этом вопросе, я уже использую инструмент под названием SQLiteStudio (его в свою очередь можно скачать тут ).

    Данный инструмент является аналогом таких известных продуктов как SQL Naviagator, Toad etc. Но как следует из названия, заточен он под работу с SQLite. Он позволяет визуально создать БД и получить DDL код создаваемых таблиц. Кстати, он также позволяет создавать представления (View), которые вы тоже при желании можете использовать в своем приложении. Не знаю насколько правильный подход использования представлений в программах для Android, но в одном из своих приложений я использовал их.

    Собственно говоря я больше не каких сторонних инструментов не использую, и дальше начинается магия с Android Studio. Как я уже писал выше, если начать внедрять SQL код в Java код, то на выходе мы получим плохочитаемый, а значит и плохо расширяемый код. Поэтому я выношу все SQL инструкции во внешние файлы, которые у меня находятся в директории assets . В Android Studio выглядит это примерно так:


    О директориях db и data

    Внутри директории assets я создал две директории db_01 и data_01 . Цифры в названиях директорий соответствуют номеру версии моей БД с которой я работаю. В директории db у меня хранятся сами SQL скрипты создания таблиц. А в директории data хранятся данные необходимые для начального заполнения таблиц.


    Теперь давайте посмотрим на код внутри моего DBHelper который я использую в своих проектах. Сначала переменные класса и конструктор (тут без каких либо неожиданностей):

    Private static final String TAG = "RoadMap4.DBHelper"; String mDb = "db_"; String mData = "data_"; Context mContext; int mVersion; public DBHelper(Context context, String name, int version) { super(context, name, null, version); mContext = context; mVersion = version; }
    Теперь метод onCreate и тут становится уже интереснее:

    @Override public void onCreate(SQLiteDatabase db) { ArrayList tables = getSQLTables(); for (String table: tables){ db.execSQL(table); } ArrayList> dataSQL = getSQLDatas(); for (HashMap hm: dataSQL){ for (String table: hm.keySet()){ Log.d(TAG, "insert into " + table + " " + hm.get(table)); long rowId = db.insert(table, null, hm.get(table)); } } }
    Логически он разделен на два цикла, в первом цикле я получаю список SQL - инструкций для создания БД и затем выполняю их, во втором цикле я уже заполняю созданные ранее таблицы начальными данными. И так, шаг первый:

    Private ArrayList getSQLTables() { ArrayList tables = new ArrayList<>(); ArrayList files = new ArrayList<>(); AssetManager assetManager = mContext.getAssets(); String dir = mDb + mVersion; try { String listFiles = assetManager.list(dir); for (String file: listFiles){ files.add(file); } Collections.sort(files, new QueryFilesComparator()); BufferedReader bufferedReader; String query; String line; for (String file: files){ Log.d(TAG, "file db is " + file); bufferedReader = new BufferedReader(new InputStreamReader(assetManager.open(dir + "/" + file))); query = ""; while ((line = bufferedReader.readLine()) != null){ query = query + line; } bufferedReader.close(); tables.add(query); } } catch (IOException e) { e.printStackTrace(); } return tables; }
    Тут все достаточно просто, мы просто читаем содержимое файлов, и конкатенируем содержимое каждого файла в элемент массива. Обратите внимание, что я произвожу сортировку списка файлов, так как таблицы могут иметь внешние ключи, а значит таблицы должны создаваться в определенном порядке. Я использую нумерацию в название файлов, и с помощью нею и произвожу сортировку.

    Private class QueryFilesComparator implements Comparator{ @Override public int compare(String file1, String file2) { Integer f2 = Integer.parseInt(file1.substring(0, 2)); Integer f1 = Integer.parseInt(file2.substring(0, 2)); return f2.compareTo(f1); } }
    С заполнением таблиц все веселей. Таблицы у меня заполняются не только жестко заданными значениями, но также значениями из ресурсов и UUID ключами (я надеюсь когда-нибудь прийти к сетевой версии своей программы, что бы мои пользователи могли работать с общими данными). Сама структура файлов с начальными данными выглядит так:


    Несмотря на то, что файлы у меня имеют расширение sql, внутри не sql код а вот такая штука:

    Prioritys
    pri_id:UUID:UUID

    pri_name:string:normal
    pri_color:color:colorGreen
    pri_default:int:1
    prioritys
    pri_id:UUID:UUID
    pri_object:string:object_task
    pri_name:string:hold
    pri_color:color:colorBlue
    pri_default:int:0
    prioritys
    pri_id:UUID:UUID
    pri_object:string:object_task
    pri_name:string:important
    pri_color:color:colorRed
    pri_default:int:0
    prioritys
    pri_id:UUID:UUID

    pri_name:string:normal
    pri_color:color:colorGreen
    pri_default:int:1
    prioritys
    pri_id:UUID:UUID
    pri_object:string:object_project
    pri_name:string:hold
    pri_color:color:colorBlue
    pri_default:int:0
    prioritys
    pri_id:UUID:UUID
    pri_object:string:object_project
    pri_name:string:important
    pri_color:color:colorRed
    pri_default:int:0

    Структура файла такая: я выполняю вызов функции split(":") применительно к строчке и если получаю что ее размер равен 1 то значит это название таблицы, куда надо записать данные. Иначе это сами данные. Первое поле это название поля в таблице. Второе поле тип, по которому я определяю что мне надо в это самое поле записать. Если это UUID - это значит мне надо сгенерировать уникальное значение UUID. Если string значит мне надо из ресурсов вытащить строковое значение. Если color, то опять-таки, из ресурсов надо вытащить код цвета. Если int или text, то я просто преобразую данное значение в int или String без каких либо телодвижений. Сам код выглядит вот так:

    Private ArrayList> getSQLDatas() { ArrayList> data = new ArrayList<>(); ArrayList files = new ArrayList<>(); AssetManager assetManager = mContext.getAssets(); String dir = mData + mVersion; try { String listFiles = assetManager.list(dir); for (String file: listFiles){ files.add(file); } Collections.sort(files, new QueryFilesComparator()); BufferedReader bufferedReader; String line; int separator = 0; ContentValues cv = null; String fields; String nameTable = null; String packageName = mContext.getPackageName(); boolean flag = false; HashMap hm; for (String file: files){ Log.d(TAG, "file db is " + file); bufferedReader = new BufferedReader(new InputStreamReader(assetManager.open(dir + "/" + file))); while ((line = bufferedReader.readLine()) != null){ fields = line.trim().split(":"); if (fields.length == 1){ if (flag == true){ hm = new HashMap<>(); hm.put(nameTable, cv); data.add(hm); } // наименование таблицы nameTable = line.trim(); cv = new ContentValues(); continue; } else { if (fields.equals("UUID")){ cv.put(fields, UUID.randomUUID().toString()); } else if (fields.equals("color") || fields.equals("string")){ int resId = mContext.getResources().getIdentifier(fields, fields, packageName); Log.d(TAG, fields + " " + resId); switch (fields){ case "color": cv.put(fields, resId); break; case "string": cv.put(fields, mContext.getString(resId)); break; default: break; } } else if (fields.equals("text")){ cv.put(fields, fields); } else if (fields.equals("int")){ cv.put(fields, Integer.parseInt(fields)); } } flag = true; } bufferedReader.close(); } } catch (IOException e) { e.printStackTrace(); } return data; }