Мобильные отчеты SQL Server: руководство по использованию
Издатель мобильных отчетов для SQL Server не рекомендуется использовать во всех выпусках SQL Server Reporting Services после SQL Server Reporting Services 2019. Она прекращена с SQL Server Reporting Services 2022 года и Сервер отчетов Power BI.
Используйте пошаговые инструкции по созданию мобильных отчетов для экрана любого размера с помощью издателя мобильных отчетов SQL Server на портале Reporting Services и по просмотру отчетов в мобильных приложениях Power BI.
Мобильные отчеты можно создавать в области конструктора с настраиваемыми строками и столбцами сетки, а также гибкими элементами мобильных отчетов. Подключайтесь к различным локальным источникам данных или передавайте книги Excel для создания мобильных отчетов. Затем сохраните отчеты на веб-портале Reporting Services и просматривайте их в обозревателе или мобильных приложениях Power BI.
В этой статье описаны следующие операции.
- Создание общего источника данных и набора данных на веб-портале Reporting Services с использованием базы данных AdventureWorks в качестве образца источника данных.
- Создание мобильного отчета Reporting Services в издателе мобильных отчетов
- Публикация мобильного отчета на веб-портале Reporting Services.
- просмотр мобильных отчетов в мобильном приложении Power BI.
Действия перед началом работы
Для начала вам потребуются такие продукты:
- Для создания источников данных и ключевых показателей эффективности, а также для публикации наборов данных и мобильных отчетов нужен доступ к серверу отчетов Reporting Services в собственном режиме.
- Для создания общих наборов данных нужно установить построитель отчетов.
- Для создания мобильных отчетов установите издатель мобильных отчетов для Microsoft SQL Server.
- Образцы баз данных AdventureWorks.
- ИЛИ образец базы данных World Wide Importers, доступный на странице Образцы Microsoft SQL Server.
- Для просмотра результата:
- зарегистрируйтесь в службе Power BI и
- скачайте мобильное приложение Power BI на свое мобильное устройство с iOS, телефон с Android или устройство с Windows.
Создание общего источника данных
Вы можете создать общий источник данных для мобильных отчетов из любого источника данных, поддерживаемого службами Reporting Services. См. список поддерживаемых источников данных.
- На веб-портале Reporting Services нажмите Создать>Источник данных.

- Введите сведения об источнике данных и нажмите >OK. По умолчанию источники данных не отображаются на портале.
- Чтобы просмотреть источники данных, щелкните Отображение>Источник данных.

- Теперь источник данных отображается на портале Reporting Services.

Создание общего набора данных
Используйте существующее клиентское средство Reporting Services, например, конструктор отчетов в SQL Server Data Tools (SSDT), для создания общего набора данных. В этом пошаговом руководстве используется построитель отчетов. Установите построитель отчетов или запустите его на своем веб-портале. Вы создадите три набора данных: один для значения ключевого показателя эффективности, второй для тренда ключевого показателя эффективности и один с дополнительными полями для мобильного отчета служб Reporting Services.
- На веб-портале Reporting Services нажмите Создать>Отчет с разбиением на страницы, чтобы запустить построитель отчетов.

- Щелкните Создать набор данных.

- Щелкните Просмотр других источников данных.
- В поле «Имя» введите имя сервера, на котором сохранен источник данных в таком формате: Имя: https://localhost/ReportServer
Элементы типа: источники данных (*.rsds) - Нажмите кнопку Открытьи перейдите к источнику данных, созданному на этом сервере.
- Выберите источник данных и нажмите кнопку Открыть еще раз.
- Создайте набор данных в построителе отчетов.

- По завершении сохраните набор данных на сервере отчетов SSRS.
Теперь можно использовать набор данных как основу для ключевых показателей эффективности и мобильных отчетов. Вы можете создать несколько наборов данных в одном источнике данных. Кроме того, вы можете создать несколько ключевых показателей эффективности и мобильных отчетов на основе этих общих наборов данных.
Создание ключевых показателей эффективности
Ключевые показатели эффективности создаются прямо на веб-портале Reporting Services.
- В правом верхнем углу экрана веб-портала щелкните Создать>Создать ключевой показатель эффективности.
В окне создания ключевых показателей эффективности можно ввести значения вручную или использовать общий набор данных. - Для параметра Значение вместо значения Задать вручную установите значение Поле набора данных.

- Нажмите кнопку с многоточием ( . ) в поле Выберите поле набора данных и выберите набор данных, как указано в описании предыдущего шага.

- Выберите поле в наборе данных.

- Выберите необходимое агрегирование. Ключевые показатели эффективности могут отображать только одно число, так что поля будут агрегированы для отображения этого числа.

- Нажмите кнопку ОК.
- В поле Набор трендов щелкните Тренд набора данных.
- В поле Выберите тренд набора данных нажмите кнопку с многоточием ( . ).
- Выберите поле и нажмите кнопку ОК.

- Присвойте имя вашему ключевому показателю эффективности и выберите тип визуализации, а затем нажмите кнопку Создать. Ключевые показатели эффективности отображаются на веб-портале Reporting Services.

Создание мобильных отчетов служб Reporting Services
Для создания мобильных отчетов служб Reporting Services установите Издатель мобильных отчетов для Microsoft SQL Serverили запустите его на веб-портале Reporting Services.
При первом открытии издателя мобильных отчетов отобразится пустой холст, на котором можно создать мобильный отчет. Начните с создания визуальных элементов или выполните запуск с помощью ваших данных. Если сначала создать визуальные элементы, издатель мобильных отчетов автоматически создает привязанные к отчету смоделированные данные, которые динамически изменяется при изменении выбранных визуальных элементов. Попробуйте сделать это сами.
Запуск при помощи визуальных элементов
- На веб-портале Reporting Services нажмите Создать>Мобильный отчет, чтобы запустить издатель мобильных отчетов.
Издатель мобильных отчетов откроется в сетке мастер-макета. - На вкладке Макет прокрутите экран вниз до раздела «Диаграммы».

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

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

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

- Откройте вкладку Расположение.
- Нажмите на шестеренку «Параметры»
в правом верхнем углу карты дерева, чтобы открыть его меню. 
- Щелкните стрелку посередине колесика, чтобы закрыть его.
Добавьте ваши собственные данные
- Перейдите на вкладку Данные .
- Чтобы добавить свои данные, нажмите кнопку Добавить данные в правом верхнем углу, а затем перейдите к вашим данным.
- Можно использовать данные из локальной рабочей книги Excel, но в этом случае используются данные из общего набора данных на вашем веб-портале Reporting Services. Отображается сообщение «Добавлен на сервере».
- Выберите сервер, а затем выберите созданный вами набор данных.
- Вернитесь на вкладку Данные , а затем на панели Свойства данных измените свойства Представления размера, Представления цветови другие свойства полей ваших данных.
- ПоляПредставления размера, Представления цветови Пользовательское значение центра должны содержать цифровые значения.
- В полеГруппировать по отображается категория, поэтому это текстовое поле.

Добавление датчика в мобильный отчет
Давайте добавим датчик для сравнения продаж нынешнего и прошлого годов при помощи одного и того же набора данных.
- На вкладке «Макет» перетащите половину кольца на полотно. Поместите его под картой дерева и перетащите правый нижний угол так, чтобы на экране отображалось три клетки в ширину и две в высоту.
- И снова процесс начинается с моделирования данных. Обратите внимание, что в разделе Свойства визуальных элементовпо умолчанию указано свойство Предпочтение более высоким значениям, а для свойства Разностная метка задано значение Процент целевого. Остановки диапазона заданы по умолчанию: вы можете их изменить, но пока можно использовать и их.

- На вкладке Данные выберите таблицу с вашими данными, щелкните поле Основное значение и поле, с которым нужно его сравнить, в секции Значение сравнения.
- Вы можете выбрать разные агрегирования, чтобы получить одно число для поля Основное значение и еще одно для поля Значение сравнения. По умолчанию эти числа — суммы.

- Выберите Предварительный просмотр , чтобы посмотреть, как это выглядит.

Добавление списка выбора в качестве фильтра
Списки выбора действуют как срезы в Power BI и Excel. Такой список можно добавить, чтобы фильтровать другие визуальные элементы в мобильном отчете.
- На вкладке Макет перетащите список выбора в правую часть карты дерева, а затем перетащите правый нижний угол, чтобы на экране отображались две клетки в ширину и пять клеток в высоту (по высоте полотна).

- На вкладке Данные в разделе Свойства данныхзадайте для элементов Ключи и Метки то поле в ваших данных, которое необходимо отфильтровать.

Создание мобильных отчетов для телефонов
Создав визуальные элементы в разметке образца, вы можете теперь создать мобильный отчет с использованием макета, оптимизированного непосредственно для ваших пользователей телефона.
- В правом верхнем углу нажмите на значок на холсте >Телефон.
- На вкладке «Макет» в разделе Control Instances(Управление экземплярами) отображаются две созданные вами диаграммы.
- Перетащите карту дерева на полотно телефона и разверните его на четыре столбца в ширину и три строки в высоту.
Сохранение мобильного отчета
Можно сохранить отчет локально или на веб-портале Reporting Services. В случае локального сохранения издатель мобильных отчетов сохраняет отчет вместе с кэшированными данными, чтобы можно было открыть его и продолжить работу. Однако вы не сможете просматривать его на мобильных устройствах.
- Нажмите значок сохранения в верхнем левом углу.
- Чтобы использовать его совместно с другими пользователями и просматривать на мобильных устройствах, щелкните Сохранить на сервере.
- На сервере перейдите к папке, в которой нужно сохранить мобильный отчет.
- Последовательно нажмите Выбрать папку>Сохранить. Вы получите сообщение с подтверждением сохранения отчета. После сохранения изменений можно вернуться на портал и просмотреть эскиз мобильного отчета.
- Коснитесь эскиза, чтобы просмотреть отчет на веб-портале.
Просмотр отчета на веб-портале
Просмотр отчета на мобильном устройстве
Чтобы просмотреть отчет Reporting Services, сначала необходимо:
- зарегистрироваться в службе Power BI, если у вас еще нет учетной записи;
- скачать мобильное приложение Power BI на мобильное устройство.
Просмотр мобильного отчета
- Откройте приложение Power BI на мобильном устройстве и войдите в него.
- Чтобы просмотреть мобильные отчеты служб Reporting Services и ключевые показатели эффективности, щелкните Службы Reporting Services.

- Коснитесь значка Параметры
в верхнем левом углу, а затем коснитесь Подключиться к серверу. 
- Присвойте серверу имя, а затем введите адрес сервера, ваш адрес электронной почты и пароль в следующем формате:

- Сервер отобразится на левой навигационной панели.


Коснитесь значка Параметры в любой момент для переключения между мобильными отчетами служб Reporting Services на веб-портале служб Reporting Services и панелями мониторинга службы Power BI.
Просмотр ключевых показателей эффективности (КПЭ) и мобильных отчетов в приложении Power BI
Нажмите вкладку Ключевые показатели эффективности или Мобильные отчеты .


- Нажмите ключевой показатель эффективности, чтобы увидеть его в режиме фокусировки.
- Нажмите мобильный отчет, чтобы открыть его и поработать с ним в приложении Power BI.
Ключевые показатели эффективности и мобильные отчеты отображаются в тех же папках,в которых они хранятся на веб-портале служб Reporting Services.
См. также раздел
- Просмотр локальных отчетов мобильных отчетов и ключевых показателей эффективности в мобильном приложении Power BI для устройств с iOS и Android
- См. статью Просмотр локальных отчетов и КПЭ для локального сервера отчетов в мобильном приложении Power BI для устройств с Windows.
Шаг 3. Подтверждение концепции: подключение к SQL с помощью Java
Этот пример следует рассматривать только как подтверждение концепции. Пример кода упрощен для ясности и для него не гарантируется соблюдение рекомендаций корпорации Майкрософт.
Шаг 1. Подключение
Используйте класс подключения для подключения к базе данных SQL.
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class SQLDatabaseConnection < // Connect to your database. // Replace server name, username, and password with your credentials public static void main(String[] args) < String connectionUrl = "jdbc:sqlserver://yourserver.database.windows.net:1433;" + "database=AdventureWorks;" + "user=yourusername@yourserver;" + "password=yourpassword;" + "encrypt=true;" + "trustServerCertificate=false;" + "loginTimeout=30;"; try (Connection connection = DriverManager.getConnection(connectionUrl);) < // Code here. >// Handle any errors that may have occurred. catch (SQLException e) < e.printStackTrace(); >> >Шаг 2. Выполнение запроса
В этом примере следует подключиться к базе данных SQL Azure, выполнить инструкцию SELECT и вернуть выбранные строки.
import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class SQLDatabaseConnection < // Connect to your database. // Replace server name, username, and password with your credentials public static void main(String[] args) < String connectionUrl = "jdbc:sqlserver://yourserver.database.windows.net:1433;" + "database=AdventureWorks;" + "user=yourusername@yourserver;" + "password=yourpassword;" + "encrypt=true;" + "trustServerCertificate=false;" + "loginTimeout=30;"; ResultSet resultSet = null; try (Connection connection = DriverManager.getConnection(connectionUrl); Statement statement = connection.createStatement();) < // Create and execute a SELECT SQL statement. String selectSql = "SELECT TOP 10 Title, FirstName, LastName from SalesLT.Customer"; resultSet = statement.executeQuery(selectSql); // Print results from select statement while (resultSet.next()) < System.out.println(resultSet.getString(2) + " " + resultSet.getString(3)); >> catch (SQLException e) < e.printStackTrace(); >> >Шаг 3. Вставка строки
В этом примере выполните инструкцию INSERT, передайте параметры и получите автоматическое значение первичного ключа.
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.Statement; public class SQLDatabaseConnection < // Connect to your database. // Replace server name, username, and password with your credentials public static void main(String[] args) < String connectionUrl = "jdbc:sqlserver://yourserver.database.windows.net:1433;" + "database=AdventureWorks;" + "user=yourusername@yourserver;" + "password=yourpassword;" + "encrypt=true;" + "trustServerCertificate=false;" + "loginTimeout=30;"; String insertSql = "INSERT INTO SalesLT.Product (Name, ProductNumber, Color, StandardCost, ListPrice, SellStartDate) VALUES " + "('NewBike', 'BikeNew', 'Blue', 50, 120, '2016-01-01');"; ResultSet resultSet = null; try (Connection connection = DriverManager.getConnection(connectionUrl); PreparedStatement prepsInsertProduct = connection.prepareStatement(insertSql, Statement.RETURN_GENERATED_KEYS);) < prepsInsertProduct.execute(); // Retrieve the generated key from the insert. resultSet = prepsInsertProduct.getGeneratedKeys(); // Print the ID of the inserted row. while (resultSet.next()) < System.out.println("Generated: " + resultSet.getString(1)); >> // Handle any errors that may have occurred. catch (Exception e) < e.printStackTrace(); >> >См. также:
Необходимо обращаться к Ms sql через веб сервер IIS используя Android Studio
Я начинающий разработчик приложений под андроид. Вопрос знатокам : Можно ли через веб сервер ISS получить доступ к MS SQL 2014, приложение пишется на JAVA среда Android Studio?Если да то каким образом? Вот код напрямую связанную с БД :
package com.example.user.hello; import android.annotation.SuppressLint; import android.app.Application; import android.os.StrictMode; import android.util.Log; import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; public class db_class extends Application < @SuppressLint("NewApi") static Connection ConnectionDB() < String url="jdbc:jtds:sqlserver://WIN-H2IOJKV9R76:1433:/Test;"; String username="khiki"; String password="12345"; StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build(); StrictMode.setThreadPolicy(policy); java.sql.Connection connection = null; try < Class.forName("net.sourceforge.jtds.jdbc.Driver"); connection = DriverManager.getConnection(url,username,password); >catch (SQLException se) < Log.e("error from SQL",se.getMessage()); >catch(ClassNotFoundException e) < Log.e("Error from Class",e.getMessage()); >catch (Exception ex) < Log.e("Error from Exception",ex.getMessage()); >return connection; > >Отслеживать
81.2k 7 7 золотых знаков 73 73 серебряных знака 153 153 бронзовых знака
задан 8 ноя 2017 в 6:18
Anonymouse Anonymouse
119 1 1 серебряный знак 6 6 бронзовых знаков
Как в вашем понимании связаны IIS и MS SQL Server? Это ж разные продукты.
8 ноя 2017 в 6:42
IIS видимо имеет коннект в SQL серверу и играет по сути роль сервера приложений
8 ноя 2017 в 6:48
Да Barmaley, именно. Как можно это все реализовать )?
8 ноя 2017 в 6:52
Берете ASP в руки и пишете веб сервис, который на запросы отвечает JSON’ами 🙂
8 ноя 2017 в 6:56Задайте в форуме шарпистам (правильный) вопрос, как написать веб сервис — шарпистов здесь много — уверен, ответят.
8 ноя 2017 в 7:06
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
Для мобильных устройств соединение с удаленной БД через JDBC является антипаттерном. Ну то есть при наличии правильного JDBC драйвера (то есть, написанного либо на чистом Java или же с поддержкой архитектуры девайса — типа ARM) коннект установить можно и даже можно получить ResultSet на свои запросы, но цена такого коннекта будет чрезвычайно высокой: ненадежность соединения, требования к портам девайса, требования к ширине полосы коннекта и проч. — все это обнулит ваши усилия.
Нормальным паттерном является поднятие на стороне сервера Restful веб сервиса, который отвечает на запросы JSON/XML данными.
Гуглевская лекция как с этим работать валяется здесь
В вашем случае, вам нужно написать на стороне IIS небольшой веб сервис, который организует JSON ответы на запросы от Android клиента.
Отслеживать
ответ дан 8 ноя 2017 в 6:39
81.2k 7 7 золотых знаков 73 73 серебряных знака 153 153 бронзовых знака- java
- android
- sql-server
- iis
-
Важное на Мете
Похожие
Подписаться на ленту
Лента вопроса
Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.
Дизайн сайта / логотип © 2024 Stack Exchange Inc; пользовательские материалы лицензированы в соответствии с CC BY-SA . rev 2024.1.30.4069
Использование простой базы данных SQLite в Android-приложении
В этом руководстве я подробно расскажу о том, как использовать базу данных Android SQLite .
Обновлено: 2022-04-18 17:25:13 Вадим Дворников автор материала
Что такое SQLite
SQLite — это система управления реляционными базами данных, похожая на Oracle , MySQL , PostgreSQL и SQL Server . Она реализует большую часть стандарта SQL , но в отличие от четырех упомянутых выше СУБД она не поддерживает модель « клиент-сервер ». Скорее, она встроена в конечную программу. Это означает, что можно связать базу данных SQLite с приложением и получить доступ ко всем возможностям БД в своем приложении.

Данная СУБД совместима как с Android , так и с iOS , и каждое приложение может создавать и использовать базу данных SQLite . В Android контакты и медиа хранятся и ссылаются на БД SQLite . Она является наиболее используемой СУБД в мире и самым распространенным программным обеспечением. Чтобы узнать о базах данных SQLite как можно больше, посетите официальный сайт SQLite.
Подготовка
Чтобы включить привязку данных в приложении, нужно добавить в файл build.gradle следующий код:
dataBinding.enabled = true
Чтобы использовать как RecyclerView , так и CardView для отображения списков, нужно включить соответствующие библиотеки в разделе зависимостей в файле build.gradle :
dependencies
Чтобы задействовать все возможности базы данных SQLite , лучше изучить синтаксис SQL .
Описание примера приложения
В нашем Android SQLite примере мы создадим две таблицы: Employer и Employee . Таблица Employee будет содержать ссылку на внешний ключ таблицы Employer . Мы рассмотрим, как вставлять, выбирать, обновлять и удалять строки из таблиц. Я также продемонстрирую, как вывести элементы, выбранные из базы данных SQLite в RecyclerView ( список ) и в Spinner .
У нас есть MainActivity , из которого можно перейти к EmployerActivity ( для работы с таблицей Employer ) или к EmployeeActivity ( для работы с таблицей Employee ):

Классы хранения базы данных SQLite
Классы определяют то, как данные хранятся в базе. SQLite сохраняют значения с помощью пяти доступных классов хранения:
- NULL — нулевое значение;
- INTEGER — для целых чисел, содержащих от 1 до 8 байтов;
- REAL — числа с плавающей запятой;
- TEXT — текстовые строки, хранящиеся с использованием кодировки базы данных ( UTF-8 или UTF-16 );
- BLOB — двоичные данные, хранящиеся точно так, как они были введены.
Определение таблиц
Поскольку база данных SQLite является локальной, нужно обеспечить, чтобы приложение создавало таблицы и по мере необходимости сбрасывало их.
Начнем с Android SQLite query создания таблицы Employer , а затем перейдем к EmployerActivity .
Рекомендуется размещать логику создания базы х SQLite в классе. Это облегчает устранение возможных неполадок. Назовем наш класс SampleDBContract :
public final class SampleDBContract < private SampleDBContract() < >public static class Employer implements BaseColumns < public static final String TABLE_NAME = "employer"; public static final String COLUMN_NAME = "name"; public static final String COLUMN_DESCRIPTION = "description"; public static final String COLUMN_FOUNDED_DATE = "date"; public static final String CREATE_TABLE = "CREATE TABLE IF NOT EXISTS " + TABLE_NAME + " (" + _ID + " INTEGER PRIMARY KEY AUTOINCREMENT, " + COLUMN_NAME + " TEXT, " + COLUMN_DESCRIPTION + " TEXT, " + COLUMN_FOUNDED_DATE + " INTEGER" + ")"; >>Мы определяем частный конструктор для SampleDBContract , а затем создаем класс для представления таблицы Employer . Обратите внимание: класс Employer реализует интерфейс BaseColumns . Он предоставляет два столбца в нашей таблице. Это столбец _ID , который будет автоматически увеличиваться при добавлении каждой новой строки. И столбец _COUNT , который может использоваться ContentProviders для возврата количества записей, извлекаемых через запрос. Столбец _COUNT не является обязательным. Строка CREATE_TABLE компилируется в следующий оператор SQL :
CREATE TABLE IF NOT EXISTS employer (_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, description TEXT, date INTEGER)
На данный момент в нашем Android SQLite примере мы определили схему таблицы Employer .
Создание базы данных с помощью SQLiteOpenHelper
Самый простой способ управления созданием базы данных и версиями — создать подкласс SQLiteOpenHelper . Он упрощает управление базой данных SQLite , создавая БД, если они не существуют. Необходимо только переопределить методы onCreate() и onUpgrade() , чтобы указать нужное действие для создания или обновления базы данных:
public class SampleDBSQLiteHelper extends SQLiteOpenHelper < private static final int DATABASE_VERSION = 1; public static final String DATABASE_NAME = "sample_database"; public SampleDBSQLiteHelper(Context context) < super(context, DATABASE_NAME, null, DATABASE_VERSION); >@Override public void onCreate(SQLiteDatabase sqLiteDatabase) < sqLiteDatabase.execSQL(SampleDBContract.Employer.CREATE_TABLE); >@Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int i, int i1) < sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + SampleDBContract.Employer.TABLE_NAME); onCreate(sqLiteDatabase); >>Теперь в нашем примере Android database SQLite задаем для нашей базы данных SQLite имя ( sample_database ). Конструктор вызывает конструктор суперкласса с именем и версией базы данных. В onCreate мы указываем объекту SQLiteDatabase выполнить оператор Employer CREATE_TABLE SQL . Через onUpgrade мы сбрасываем таблицу Employer и создаем ее снова:

Таблица Employer имеет три столбца: name , description и founded_date . Нажатие кнопки сохранения вызывает метод saveToDB() :

В saveToDB() мы получаем ссылку на объект SQLiteDatabase , используя метод getWritableDatabase() из SQLiteOpenHelper . Этот метод создает базу данных, если она еще не существует, или открывает ее, если она уже создана. GetWritableDatabase возвращает объект SQLiteDatabase , который открывает доступ на чтение / запись:
private void saveToDB() < SQLiteDatabase database = new SampleDBSQLiteHelper(this).getWritableDatabase(); ContentValues values = new ContentValues(); values.put(SampleDBContract.Employer.COLUMN_NAME, binding.nameEditText.getText().toString()); values.put(SampleDBContract.Employer.COLUMN_DESCRIPTION, binding.descEditText.getText().toString()); try < Calendar calendar = Calendar.getInstance(); calendar.setTime((new SimpleDateFormat("dd/MM/yyyy")).parse( binding.foundedEditText.getText().toString())); long date = calendar.getTimeInMillis(); values.put(SampleDBContract.Employer.COLUMN_FOUNDED_DATE, date); >catch (Exception e) < Log.e(TAG, "Error", e); Toast.makeText(this, "Date is in the wrong format", Toast.LENGTH_LONG).show(); return; >long newRowId = database.insert(SampleDBContract.Employer.TABLE_NAME, null, values); Toast.makeText(this, "The new Row Id is " + newRowId, Toast.LENGTH_LONG).show(); >В приведенном выше фрагменте кода есть четыре момента:
- Мы получаем объект SQLiteDatabase , который открывает доступ на запись в базу данных;
- Значения, которые будут храниться в базе данных, помещаются в объект ContentValue с именем столбца в качестве ключа;
- Мы помещаем Date в объект ContentValue , который переводится в класс хранения данных Android SQLite INTEGER ;
- При вставке строки в базу данных с помощью метода database.insert() возвращается идентификатор строки.
Выбор данных из базы данных SQLite
Подобно тому, как мы применили метод getWritableDatabase() , можно вызвать getReadableDatabase() объекта SQLiteOpenHelper для получения объекта SQLiteDatabase , который можно использовать для чтения информации из базы данных. Стоит отметить, что объект SQLiteDatabase , возвращаемый getReadableDatabase() , предоставляет собой тот же самый доступ на чтение / запись в базу данных, который был возвращен функцией getWritableDatabase() , за исключением тех случаев, когда существуют определенные ограничения. Например, файловая система, содержащая заполненную базу данных, и база данных может быть открыта только для чтения.
Метод readFromDB будет запрашивать БД, и возвращать все строки из таблицы Employer , в которых имя или описание из таблицы Employer совпадает со значением, введенным в EditText . А также строки, в которых дата основания компании совпадает со значением, введенным в EditText :
private void readFromDB() < String name = binding.nameEditText.getText().toString(); String desc = binding.descEditText.getText().toString(); long date = 0; try < Calendar calendar = Calendar.getInstance(); calendar.setTime((new SimpleDateFormat("dd/MM/yyyy")).parse( binding.foundedEditText.getText().toString())); date = calendar.getTimeInMillis(); >catch (Exception e) <> SQLiteDatabase database = new SampleDBSQLiteHelper(this).getReadableDatabase(); String[] projection = < SampleDBContract.Employer._ID, SampleDBContract.Employer.COLUMN_NAME, SampleDBContract.Employer.COLUMN_DESCRIPTION, SampleDBContract.Employer.COLUMN_FOUNDED_DATE >; String selection = SampleDBContract.Employer.COLUMN_NAME + " like ? and " + SampleDBContract.Employer.COLUMN_FOUNDED_DATE + " > ? and " + SampleDBContract.Employer.COLUMN_DESCRIPTION + " like ?"; String[] selectionArgs = ; Cursor cursor = database.query( SampleDBContract.Employer.TABLE_NAME, // Запрашиваемая таблица projection, // Возвращаемый столбец selection, // Столбец для условия WHERE selectionArgs, // Значение для условия WHERE null, // не группировать строки null, // не фильтровать по группам строк null // не сортировать ); Log.d(TAG, "The total cursor count is " + cursor.getCount()); binding.recycleView.setAdapter(new SampleRecyclerViewCursorAdapter(this, cursor)); >В коде Android SQLite query , приведенного выше, projection является массивом String , представляющим столбцы, которые мы хотим получить. selection является строковым представлением условия SQL WHERE , отформатированным таким образом, что символ ‘?’ будет заменен аргументами в массиве selectionArgs String . Вы также можете группировать, фильтровать и сортировать результаты запроса. Вставка данных в базу SQLite с использованием описанного выше метода защищает от SQL-инъекций .
Обратите внимание на объект, возвращаемый запросом — Cursor . В следующем разделе мы покажем, как вывести содержимое Cursor с помощью RecyclerView .
Отображение содержимого объекта Cursor в RecyclerView
Cursor предоставляет произвольный доступ к набору результатов, возвращаемому запросом к базе данных. Это означает, что через Cursor можно получить доступ к значениям в любом месте, подобно Java-спискам или массивам. Благодаря этому приему можно реализовать RecyclerView с использованием Cursor так же, как мы реализуем RecyclerView с помощью ArrayLists . Вместо вызова List.get(i) , вы перемещаете Cursor в нужную позицию, используя moveToPosition() . После этого вызываете соответствующий метод getXXX(int columnIndex) , где XXX — это Blob , Double , Float , Int , Long , Short или String .
Чтобы не беспокоиться о корректных индексах столбцов из метода readFromDB() , примененного выше, мы используем метод getColumnIndexOrThrow() , который извлекает индекс указанного столбца или генерирует исключение, если имя столбца не существует внутри объекта Cursor :
public class SampleRecyclerViewCursorAdapter extends RecyclerView.Adapter < Context mContext; Cursor mCursor; public SampleRecyclerViewCursorAdapter(Context context, Cursor cursor) < mContext = context; mCursor = cursor; >public static class ViewHolder extends RecyclerView.ViewHolder < EmployerListItemBinding itemBinding; public ViewHolder(View itemView) < super(itemView); itemBinding = DataBindingUtil.bind(itemView); >public void bindCursor(Cursor cursor) < itemBinding.nameLabel.setText(cursor.getString( cursor.getColumnIndexOrThrow(SampleDBContract.Employer.COLUMN_NAME) )); itemBinding.descLabel.setText(cursor.getString( cursor.getColumnIndexOrThrow(SampleDBContract.Employer.COLUMN_DESCRIPTION) )); Calendar calendar = Calendar.getInstance(); calendar.setTimeInMillis(cursor.getLong( cursor.getColumnIndexOrThrow(SampleDBContract.Employer.COLUMN_FOUNDED_DATE))); itemBinding.foundedLabel.setText(new SimpleDateFormat("dd/MM/yyyy").format(calendar.getTime())); >> @Override public int getItemCount() < return mCursor.getCount(); >@Override public void onBindViewHolder(ViewHolder holder, int position) < mCursor.moveToPosition(position); holder.bindCursor(myCursor); >@Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) < View view = LayoutInflater.from(parent.getContext()).inflate( R.layout.employer_list_item, parent, false); ViewHolder viewHolder = new ViewHolder(view); return viewHolder; >>
Определение внешних ключей
На данный момент в нашем Android SQLite примере мы создали таблицу Employer , которую заполнили строками. Теперь создадим таблицу Employee , которая связана с таблицей Employer через столбец _ID Employer . Мы определяем класс Employee , который расширяет BaseColumns в классе SampleDBContract . Обратите внимание, что при создании таблицы Employee использовали » FOREIGN KEY(employer_id) REFERENCES employer(_id) «:
public static class Employee implements BaseColumns
Обновление SQLiteOpenHelper
На данный момент в Android Studio SQLite у вас должна быть создана таблица Employer и в нее добавлены значения. Если вы не изменяете версию базы данных, новая таблица Employee не будет создана. К сожалению, если вы измените версию через повторный вызов метода onUpgrade() , то таблица Employer будет сброшена. Чтобы предотвратить это, можно закомментировать или удалить оператор drop в методе onUpgrade() и добавить оператор execSQL() для создания таблицы Employee . Поскольку таблица Employee ссылается на таблицу Employer , сначала необходимо создать таблицу Employer :
public class SampleDBSQLiteHelper extends SQLiteOpenHelper < private static final int DATABASE_VERSION = 2; public static final String DATABASE_NAME = "sample_database"; public SampleDBSQLiteHelper(Context context) < super(context, DATABASE_NAME, null, DATABASE_VERSION); >@Override public void onCreate(SQLiteDatabase sqLiteDatabase) < sqLiteDatabase.execSQL(SampleDBContract.Employer.CREATE_TABLE); sqLiteDatabase.execSQL(SampleDBContract.Employee.CREATE_TABLE); >// Мы не хотим удалять данные пользователей. @Override public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) < if(oldVersion == 0 && newVersion == 2) < sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + SampleDBContract.Employee.TABLE_NAME); >else < sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + SampleDBContract.Employer.TABLE_NAME); sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + SampleDBContract.Employee.TABLE_NAME); >onCreate(sqLiteDatabase); > >Отображение данных из запроса SQLite в Spinner
Чтобы создать работника в таблице Employee , пользователю необходимо выбрать соответствующего работодателя в таблице Employer . Для этого можно предоставить пользователю Spinner . Отобразить содержимое Cursor в Spinner довольно просто.
Сначала мы выполняем Android SQLite query , как было описано выше, выбираем только name из Employer и id (queryCols) . Затем создаем экземпляр SimpleCursorAdapter , передавая ему Cursor , массив столбцов для отображения ( adapterCols ) и массив представлений, с помощью которых должны отображаться столбцы ( adapterRowViews ). Затем устанавливаем Spinner Adapter для SimpleCursorAdapter :
String[] queryCols = new String[]; SQLiteDatabase database = new SampleDBSQLiteHelper(this).getReadableDatabase(); Cursor cursor = database.query( SampleDBContract.Employer.TABLE_NAME, // Запрашиваемая таблица queryCols, // Возвращаемый столбец null, // Столбец для условия WHERE null, // Значение для условия WHERE null, // не группировать строки null, // не фильтровать по группам строк null // не сортировать ); String[] adapterCols = new String[]; int[] adapterRowViews = new int[]; SimpleCursorAdapter cursorAdapter = new SimpleCursorAdapter( this, android.R.layout.simple_spinner_item, cursor, adapterCols, adapterRowViews, 0); cursorAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); binding.employerSpinner.setAdapter(cursorAdapter);

Вставка внешнего ключа в базу данных
Вставка строки, содержащей внешний ключ, полностью идентична вставке строк в таблицу без ограничений по внешнему ключу. Разница заключается в том, что в Android SQLite примере мы получаем ссылку на выбранный объект Cursor из Spinner , а затем — значение столбца _ID Employer :
values.put(SampleDBContract.Employee.COLUMN_EMPLOYER_ID, ((Cursor)binding.employerSpinner.getSelectedItem()).getInt(0));

Выборка данных из базы SQLite с помощью JOIN
Нельзя использовать метод SQLiteDatabase query() для выполнения запроса к нескольким таблицам. Для этого нужно составить собственный SQL-запрос . В приведенном ниже примере запрос определяется в классе SampleDBContract :
public static final String SELECT_EMPLOYEE_WITH_EMPLOYER = "SELECT * " + "FROM " + Employee.TABLE_NAME + " ee INNER JOIN " + Employer.TABLE_NAME + " er " + "ON ee." + Employee.COLUMN_EMPLOYER_ID + " = er." + Employer._ID + " WHERE " + "ee." + Employee.COLUMN_FIRSTNAME + " like ? AND ee." + Employee.COLUMN_LASTNAME + " like ?";
Обратите внимание, что в условии WHERE мы используем символ « ? ». Чтобы не нарушить синтаксис SQL нужно определить selectArgs String [] со значениями, которые будут заменять в предоставленном SQL-запросе символ « ? »:
private void readFromDB() < String firstname = binding.firstnameEditText.getText().toString(); String lastname = binding.lastnameEditText.getText().toString(); SQLiteDatabase database = new SampleDBSQLiteHelper(this).getReadableDatabase(); String[] selectionArgs = ; Log.d(TAG, SampleDBContract.Employee.QUERY_WITH_EMPLOYER); Cursor cursor = database.rawQuery(SampleDBContract.Employee.QUERY_WITH_EMPLOYER, selectionArgs); Log.d(TAG, "The total cursor count is " + cursor.getCount()); binding.recycleView.setAdapter(new SampleJoinRecyclerViewCursorAdapter(this, cursor)); >

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