Прототип android-приложения с функцией обновления

Приложение UpdateApplication представляет из себя одноэкранное приложение интерфейс которого состоит из элементов  Button(кнопка) и TextView (тектовое поле).

Стартовый экран

Для корректной работы приложения необходимо добавить следующие разрешения в файл манифеста:

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
Читать далее «Прототип android-приложения с функцией обновления»

Заметка: работа с JSON в postgresql

Работая с JSON в postgresql заметил следующие момент:

select t.value::uuid
from json_array_elements_text('["e7ded0cd-12dd-47f5-a75b-192376291e83"]'::json) as t;

select (t.value #>> '{id}')::uuid 
from json_array_elements('[{"id": "e7ded0cd-12dd-47f5-a75b-192376291e83"}]'::json) as t;

Две команды возвращают одинаковый результат, но разными способами.

Postgresql вывод информации в «консоль»

IF (select count(*) from json_array_elements(_users)) > 0 THEN
-- select * from dbo.cf_arm_cd_points(1, 5, 1, null, 4);
raise notice '%', _users;
-- обходчики выбраны и находим все маршруты за текущую дату
RETURN QUERY select * from dbo.cf_arm_cd_points((select array_to_json(array_agg(row_to_json(t))) #>> '{id}'
from (select r.id
from core.cd_userinroutes as uir
INNER JOIN core.cd_routes as r ON r.id = uir.f_route
where uir.b_main = true and uir.f_user IN (
select (t.value #>> '{f_user}')::integer from json_array_elements(_users) as t
) and _d_date >= r.d_date_start and (core.cf_old_date(r.d_date_end) or core.cf_old_date(r.d_extended))) as t)::json, now()::date);
END IF;

Установка подписи SignatureField

<ru.mobnius.core.ui.component.signature.SignatureField
 android:id="@+id/control_signature"
 android:layout_width="match_parent"
 android:layout_height="wrap_content"
 app:signatureLabel="Подпись потребителя"
 android:layout_marginTop="@dimen/indent_small"
 app:layout_constraintTop_toBottomOf="@id/control_notice"/>
public class ControlMeterReadingsFragment extends BaseFormFragment implements OnSignatureListener {
   private SignatureField mSignatureField;
   ...
   @Override
   public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
   mSignatureField = view.findViewById(R.id.control_signature);
   mSignatureField.setOnSignatureListener(this);

   if(savedInstanceState != null) {
      updateSignature(savedInstanceState.getString(Names.SIGNATURE), false);
   }
   ...
   }
   
@Override
public void onClickSignature(int mode, String signature) {
Intent intent = new Intent(getContext(), SignatureActivity.class);
intent.putExtra(OnSignatureListener.MODE_NAME, mode);
intent.putExtra(OnSignatureListener.TITLE, "Подпись потребителя");

switch (mode) {
case OnSignatureListener.ADD:
startActivityForResult(intent, SignatureActivity.SIGNATURE_REQUEST_CODE);
break;

case OnSignatureListener.UPDATE:
intent.putExtra(OnSignatureListener.IMAGE, signature);
startActivityForResult(intent, SignatureActivity.SIGNATURE_REQUEST_CODE);
break;

case OnSignatureListener.REMOVE:
confirmDialog(new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// таким образом очищаем содержимое
 updateSignature(null, true);
}
});
break;
}
}

Ошибка отладчика в Android Studio

Если при работе с Android Studio в эмуляторе возникает ошибка — нет возможности запустить эмулятор без отладки, выполняем следующую команду:

adb shell am clear-debug-app

Android Osmdroid & Mobac

Введение: в этой статье будет описан процесс привязки открытых карт (Open Street Map) к мобильной платформе Android. Результатом будет «маленькое» приложение, которое будет работать на телефоне без подключенного интернета.

osmdroid

библиотека для работы с картами Open Street Map. Исходный код находится на github. Данную библиотеку требуется прикрепись к проекту.

Читать далее «Android Osmdroid & Mobac»

Foreign Data Wrapper

https://riptutorial.com/postgresql/example/29417/foreign-data-wrapper

To access complete schema of server db instead of single table. Follow below steps:

  1. Create EXTENSION :
    CREATE EXTENSION postgres_fdw;
  1. Create SERVER :
    CREATE SERVER server_name FOREIGN DATA WRAPPER postgres_fdw OPTIONS (host 'host_ip', 
    dbname 'db_name', port 'port_number');
  1. Create USER MAPPING:
    CREATE USER MAPPING FOR CURRENT_USER
    SERVER server_name
    OPTIONS (user 'user_name', password 'password');
  1. Create new schema to access schema of server DB:
   CREATE SCHEMA schema_name;
  1. Import server schema:
     IMPORT FOREIGN SCHEMA schema_name_to_import_from_remote_db
     FROM SERVER server_name
     INTO schema_name;
  1. Access any table of server schema:
    SELECT * FROM schema_name.table_name; 

This can be used to access multiple schema of remote DB.

Автоматическое создание backup

Ниже написан скрипт для автоматического создания копии БД с последующим восстановлением на тестовой среде.

#!/bin/bash
echo "Архивация БД vote-dev"
dir_folder=/var/lib/postgresql/vote-dev
mkdir -p $dir_folder
cd $dir_folder
# создание backup
pg_dump vote-dev > $dir_folder/vote-dev-day_$(date +\%Y\%m\%d).bak
# disconnect БД
psql -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE pid <> pg_backend_pid() AND datname = 'vote-test';"
# удаление и создание БД
dropdb vote-test
psql -c 'create database "vote-test";'
psql -c 'ALTER DATABASE "vote-test" OWNER TO mobnius;'
# восстановление резервной копии
psql -U postgres vote-test < $dir_folder/vote-dev-day_$(date +\%Y\%m\%d).bak
ls -1tr | head -n -7 | xargs -d '\n' rm -f --
echo "Завершено"

android-core: Привязка к проекту

Библиотека android-core является набором функция и команд для реализации проекта «Мобильный обходчик», цель которого сбор информации с помощью мобильного устройства.

Библиотека находиться по адресу git.appcode.pw и ее можно получить при помощи команды

git clone https://git.appcode.pw/android-core.git

Привязка к проекту

Для привязки библиотеки к проекту требуется:

  • в корень проекта добавить библиотеку
git submodule add https://git.appcode.pw/android-core.git core
  • в setting.gradle добавить следующую строку
include ':app'
include ':core' // вот ее и нужно добавить
rootProject.name='Kes'
  • в build.gradle добавить
dependencies {
 ...
 implementation project(path: ':core')
 ...
}

Вызов MSSQL процедур через NodeJS

Для прямого запроса к базе данных в NodeJS доступна библиотека mssql

// https://github.com/tediousjs/node-mssql
npm install mssql

Далее формируем config для подключения к БД:

const config = {
    user: 'логин',
    password: 'пароль',
    server: 'dbsrv\\sql2017',
    database: 'MobileService',
    options: {
        enableArithAbort: false
    }
}

Пример выполнения процедуры:

const sql = require('mssql');
sql.connect(config, function (err) {
    var request = new sql.Request();
    request.input('User', '5B26F42C-C6E7-4B92-AFED-972EAB0B095A')
        .input('Date', '02-07-2020')
        .execute('[dbo].[UI_Get_Statistics_By_User]', (err, result) => {
            if (!err) {
                var items = result.recordset;
                console.log(items);
            } else {
                console.error(err);
            }
            sql.close();
        });
});