package kz.istt.locust;

import android.content.ContentValues;
import android.content.Context;
import android.content.res.Resources;
import android.database.Cursor;
import android.database.SQLException;
import android.database.sqlite.SQLiteConstraintException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.os.Build;
import android.util.Log;
import android.widget.Toast;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import tctable.Point;
import tctable.Tools;
import tctable.TCTable;

//import dbfields.SpinnerDB;

public class DbOpenHelper extends SQLiteOpenHelper
{
	private static final int DB_VERSION = 154; //Версия ожидаемой базы
	private static final String DB_NAME = "Locust"; //Наименование базы

	//ArrayList<String> lrFrmLocust = new ArrayList<String>(); //Список обязательных полей для формы саранцчи
	//ArrayList<String> lrFrmLocustDel = new ArrayList<String>(); //Список обязательных полей для формы саранцчи

	private Context _context; //Зачем коментил?

	/*public static final String TABLE_NAME = "users";
	public static final String LOGIN = "login";
	public static final String PASSW = "passw";*/

	/** Открытие базы
	 */
	public DbOpenHelper(Context context)
	{
		super(context, DB_NAME, null, DB_VERSION);
		_context = context;


		//dropAllTables(this.getWritableDatabase());
		//onCreate(db);
	}

	/** Содание новой базы если её нет
 	*/
	@Override
	public void onCreate(SQLiteDatabase db)
	{
		String sql;

		//Из-за проблем с многопотчностью создаю таблицу а то андроит сам её создаст в основном потоке
		/*sql = "create table if not exists android_metadata(locale TEXT DEFAULT 'en_US')";
		db.execSQL(sql);
		sql = "INSERT INTO android_metadata VALUES ('en_US');";
		db.execSQL(sql);*/

		//Таблица пользователей
		sql = "create table if not exists _user(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text," + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," +
				"name text," +
				"surname text," +
				"patronymic text," +
				"login text," +
				"password text);";
		db.execSQL(sql);

		//Список языков (для переводя)
		sql = "create table if not exists _languages(" +
				"id integer," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"short_name text NOT NULL," +
				"name text NOT NULL" +
			");";
		db.execSQL(sql);

		// Таблица переводов для базы данных (пока все языки загружаются)
		sql = "create table if not exists _translations(" +
				"id integer," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"language_id integer NOT NULL," +
				"identifier text NOT NULL," +
				"translation text NOT NULL" +
			");";
		db.execSQL(sql);

		// Для идентификации терминала как зарегистрированного (должна быть 1 запись)
		sql = "create table if not exists terminals(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"country_id integer," +
				"company_id integer," +
				"company_name text," + //Временноеполе до обновления таблицы компаний
				"name text," +
				"serial text," +
				"phone text" +
				");";
		db.execSQL(sql);

		//Список компаний
		sql = "create table if not exists companies(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"name text NOT NULL" +
				");";
		db.execSQL(sql);

		//Список стран
		sql = "create table if not exists countries(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"name text NOT NULL" +
			");";
		db.execSQL(sql);

		//Список регионов для стран
		sql = "create table if not exists countriesregions(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"country_id int NOT NULL," +
				"name text NOT NULL," +
				"lon_max double, " + //Для поиска региона и страны по GPS координатам
				"lon_min double, " +
				"lat_max double, " +
				"lat_min double, " +
				"area double " +
			");";
		db.execSQL(sql);

		//Коордионаты границы для региона
		/*sql = "create table if not exists countriesregionspoints(" +
				"id integer NOT NULL PRIMARY KEY AUTOINCREMENT," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"country_region_id int NOT NULL," +
				"pos integer NOT NULL," +
				"lon double NOT NULL, " +
				"lat double NOT NULL " +
				");";
		db.execSQL(sql);*/

		//Виды саранчи
		sql = "create table if not exists locuststypes(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"name text NOT NULL," +
				"sort integer" + //Порядок сортировки (специально для справичников)
			");";
		db.execSQL(sql);

		//Справочник отрождения "Начало", "Массовое".
		sql = "create table if not exists borns(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"name text NOT NULL," +
				"sort integer" + //Порядок сортировки (специально для справичников)
			");";
		db.execSQL(sql);

		//Справочник окрыление.
		sql = "create table if not exists fledgling(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"name text NOT NULL," +
				"sort integer" + //Порядок сортировки (специально для справичников)
			");";
		db.execSQL(sql);

		//Справочник плотности «низкая», «средняя» и «высокая».
		sql = "create table if not exists list_density(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"name text NOT NULL," +
				"percent integer" +
			");";
		db.execSQL(sql);

		//Фаза саранчи «одиночная», «переходная» и «стадная».
		sql = "create table if not exists list_phase(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"name text NOT NULL," +
				"sort integer" + //Порядок сортировки (специально для справичников)
			");";
		db.execSQL(sql);

		//Опрыскиватели: "Трактор", "Самолёт" итд.
		sql = "create table if not exists sprayers(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"sprayer_type_id integer," +
				"name text NOT NULL," +
				"sort integer" + //Порядок сортировки (специально для справичников)
			");";
		db.execSQL(sql);

		//Виды опрыскивания: "Авиа", "Наземное", "Ручное".
		sql = "create table if not exists sprayers_types(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"name text NOT NULL," +
				"sort integer" + //Порядок сортировки (специально для справичников)
			");";
		db.execSQL(sql);

		//Метод подсчёта смертности: «визуальный» или «учетная рамка».
		sql = "create table if not exists list_mortality(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"name text NOT NULL," +
				"sort integer" + //Порядок сортировки (специально для справичников)
			");";
		db.execSQL(sql);

		//Направления
		sql = "create table if not exists list_directions(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"name text NOT NULL," +
				"degree integer" +
			");";
		db.execSQL(sql);

		//Справочник повреждения растительного покрова
		sql = "create table if not exists list_damage(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"name text NOT NULL," +
				"damage integer NOT NULL," +
				"sort integer" + //Порядок сортировки (специально для справичников)
			");";
		db.execSQL(sql);

		//Справочник зелени «Сухая,Зеленая,Всходы,Засыхающая».
		sql = "create table if not exists list_greenery(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"name text NOT NULL," +
				"sort integer" + //Порядок сортировки (специально для справичников)
			");";
		db.execSQL(sql);

		sql = "create table if not exists list_biotope(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"name text NOT NULL," +
				"sort integer" + //Порядок сортировки (специально для справичников)
			");";
		db.execSQL(sql);
		
		sql = "create table if not exists list_cover(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"name text NOT NULL," +
				"sort integer" + //Порядок сортировки (специально для справичников)
			");";
		db.execSQL(sql);

		sql = "create table if not exists list_age(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"name text NOT NULL," +
				"sort integer" + //Порядок сортировки (специально для справичников)
			");";
		db.execSQL(sql);

		sql = "create table if not exists list_actions(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"name text NOT NULL," +
				"sort integer" + //Порядок сортировки (специально для справичников)
			");";
		db.execSQL(sql);

		sql = "create table if not exists list_paintings(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"name text NOT NULL," +
				"sort integer" + //Порядок сортировки (специально для справичников)
			");";
		db.execSQL(sql);

		sql = "create table if not exists list_behaviors(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"name text NOT NULL," +
				"sort integer" + //Порядок сортировки (специально для справичников)
			");";
		db.execSQL(sql);
		
		//Похожая таблица на "list_behaviors" и содержимое
		sql = "create table if not exists list_breeding(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"name text NOT NULL," +
				"sort integer" + //Порядок сортировки (специально для справичников)
			");";
		db.execSQL(sql);

		sql = "create table if not exists list_capacities(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"name text NOT NULL," +
				"sort integer" + //Порядок сортировки (специально для справичников)
			");";
		db.execSQL(sql);

		sql = "create table if not exists list_markings(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"name text NOT NULL," +
				"sort integer" + //Порядок сортировки (специально для справичников)
			");";
		db.execSQL(sql);

		sql = "create table if not exists list_containers(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"name text NOT NULL," +
				"sort integer" + //Порядок сортировки (специально для справичников)
			");";
		db.execSQL(sql);

		sql = "create table if not exists list_containers_states(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"name text NOT NULL," +
				"sort integer" + //Порядок сортировки (специально для справичников)
				");";
		db.execSQL(sql);

		sql = "create table if not exists list_vegetation(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"name text NOT NULL," +
				"sort integer" + //Порядок сортировки (специально для справичников)
			");";
		db.execSQL(sql);
		
		sql = "create table if not exists list_formulation(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"name text NOT NULL," +
				"sort integer" + //Порядок сортировки (специально для справичников)
			");";
		db.execSQL(sql);
		
		sql = "create table if not exists list_height(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"name text NOT NULL," +
				"sort integer" + //Порядок сортировки (специально для справичников)
			");";
		db.execSQL(sql);

		sql = "create table if not exists list_enemies(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"name text NOT NULL," +
				"sort integer" + //Порядок сортировки (специально для справичников)
			");";
		db.execSQL(sql);

		sql = "create table if not exists list_purpose(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"name text NOT NULL," +
				"sort integer" + //Порядок сортировки (специально для справичников)
				");";
		db.execSQL(sql);

		sql = "create table if not exists list_impact(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"name text NOT NULL," +
				"sort integer" + //Порядок сортировки (специально для справичников)
				");";
		db.execSQL(sql);

		sql = "create table if not exists list_diluted(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"name text NOT NULL," +
				"sort integer" + //Порядок сортировки (специально для справичников)
				");";
		db.execSQL(sql);

		//Форма саранчи id может быть пустым (только если создали на КПК)
		sql = "create table if not exists frmlocust(" +
				"id integer," +
				"uid text NOT NULL, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"send boolean NOT NULL DEFAULT 0," + //Отправлена ли запись на сервер (При изменении отмечается как не отправленное false)
				"filled boolean NOT NULL DEFAULT 0," + //Заполнена ли анкета (спец поле а не проверка на NULL потому что обязательность полей можно выставлять галочкой в интерфейсе)
				"device_id text, " + //Идентификатор устройства

				"user_id integer," +
				"image_name1 text, " + //Наименование рисунка 1
				"image_send1 boolean NOT NULL DEFAULT 0," + //Отправили ли рисунок 1 на сервер (При изменении отмечается как не отправленное false)
				"image_name2 text, " + //Наименование рисунка 2
				"image_send2 boolean NOT NULL DEFAULT 0," + //Отправили ли рисунок 1 на сервер (При изменении отмечается как не отправленное false)
				"image_name3 text, " + //Наименование рисунка 3
				"image_send3 boolean NOT NULL DEFAULT 0," + //Отправили ли рисунок 1 на сервер (При изменении отмечается как не отправленное false)
				"country_id integer, " + //Страна
				"region_id integer, " + //Регион
				"area text, " + //Район
				"district text, " + //Сельский округ и/или хозяйство

				"village text, " + //Посёлок
				"terrain text, " + //Название местности либо урочища
				
				"observer text, " + //ФИО наблюдателя
				"date text, " +//"date integer, " + //Дата создания (по гринвичу?)
				"timezone text, " + //Временная зона
				"lat_center double, " +
				"lon_center double, " +				
				"lat1 double, " +
				"lon1 double, " +
				"lat2 double, " +
				"lon2 double, " +
				"lat3 double, " +
				"lon3 double, " +
				"lat4 double, " +
				"lon4 double, " +
				"lat5 double, " +
				"lon5 double, " +
				"lat6 double, " +
				"lon6 double, " +
				"bio_hectare double, " + //"bio_hectare integer, "
				"bio_biotope_id integer," + //тип биотопаCIT (степь, залежь, посевы) тип биотопаDMA (равнины, холмы, посевы) тип биотопаLMI (низкие сухие тростники, высокие влажные тростники, другое)
				"bio_greenery_id integer,"+ //растительность: сухая, всходы, зеленая, засыхающая
				"bio_greenery_cover_id integer,"+ //растительный покров(Редкий, Ср., Густой)
				"bio_temperature float,"+ //погода: температура воздуха(ºC)
				"bio_wind float,"+ //погода: ветер(м/с)

				"locust_have integer," + //Присутствует саранча или нет
				"locust_type_id integer," + //Тип саранчи
				"locust_populated double," + //Заселённая площадь(га)

				"eggs boolean NOT NULL DEFAULT 0," + //For CheckBox
				"eggs_capsules_area float," + //залежь кубышек(площадь в м2)
				"eggs_capsules_density float," + //кубышки(плотность на м2)
				"eggs_capsules_density_to float," + //кубышки(плотность на м2)
				"eggs_capsules float," + //яйца(в среднем в кубышке)
				"eggs_live float," + //яйца(% жизнеспособных)
				"eggs_enemies_id integer," + //наличие естественных врагов(каких?)

				"hoppers boolean NOT NULL DEFAULT 0," + //For CheckBox
				"larva_born_id integer," + //отрождение, таблица "borns" начало массовое
				"larva_age_id integer," + //возраста: Младшие Средние Старшие
				"larva_painting_id integer," + //окраска(одиночнаяS, перехoдная Т, стаднаяG)
				"larva_behavior_id integer," + //поведение(Изолир., Разреженные, Группы)
				"larva_density float," + //плотность на м2 от
				"larva_density_to float," + //плотность на м2 до

				"bands boolean NOT NULL DEFAULT 0," + //For CheckBox
				"kuliguli_density float," + //плотн. в кулиге(на м2)
				"kuliguli_density_to float," + //плотн. в кулиге(на м2) до
				"kuliguli_size double," + //размер кулиг(м2)
				"kuliguli_count float," + //число кулиг
				"kuliguli_action_id integer," + //поведение: миграция, кормёжка, отдых
				"kuliguli_age_id integer," + //возраста: Младшие Средние Старшие

				"adults boolean NOT NULL DEFAULT 0," + //For CheckBox
				"imago_wing_id integer," + //окрыление(%, начало, массовое)
				"imago_maturity integer," + //половозрелость(- или+)
				"imago_phase_id integer," + //фаза(одиночнаяS, перехoдная Т, стаднаяG)
				"imago_action_id integer," + //поведение(�?золир., Разреженные, Группы)
				"imago_density float," + //плотность(на трансекту или га)
				//"imago_density_type boolean," + //плотность имаго 1 - на метр в квадрате, 2 - на гектар
				"imago_density_ga float," + //плотность(на трансекту или га)
				"imago_feeding integer," + //Питание и размещение на растениях (да, нет)
				"imago_copulation integer," + //спаривание (да, нет)
				"imago_laying integer," + //яйцекладка (да, нет)
				"imago_flying integer," + //полёты(- или+)

				"swarms boolean NOT NULL DEFAULT 0," + //For CheckBox
				"swarm_maturity integer," + //половозрелость(- или+)
				"swarm_density_id integer," + //плотность(на м2)
				"swarm_size float," + //размер стаи(на км2)
				"swarm_count float," + //число стай
				"swarm_copulation integer," + //Спаривание (да, нет)
				"swarm_laying integer," + //Яйцекладка (да, нет)
				"swarm_flying_direction_id integer," + //направление полёта (TODO время пролёта добавить)
				"swarm_height_id integer," + //высота(Низкая- Средняя- Высокая)
				"description text," + //КОММЕНТАРИИ
				"test boolean" +
				");";
		db.execSQL(sql);

		//Для формы уничтожения саранчи id может быть пустым (только если создали на КПК)
		sql = "create table if not exists frmlocustdel(" +
				"id integer," +
				"uid text NOT NULL, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," +
				"send boolean NOT NULL DEFAULT 0," +
				"filled boolean," + //Заполнена ли анкета (спец поле а не проверка на NULL потому что обязательность полей можно выставлять галочкой в интерфейсе)
				"device_id text, " + //Идентификатор устройства
 
				"user_id integer," + //Идентификатор пользователя
				"image_name1 text," + //Наименование рисунка 1
				"image_send1 boolean NOT NULL DEFAULT 0," + //Отправили ли рисунок 1 на сервер (При изменении отмечается как не отправленное false)
				"image_name2 text," + //Наименование рисунка 2
				"image_send2 boolean NOT NULL DEFAULT 0," + //Отправили ли рисунок 1 на сервер (При изменении отмечается как не отправленное false)
				"image_name3 text," + //Наименование рисунка 3
				"image_send3 boolean NOT NULL DEFAULT 0," + //Отправили ли рисунок 1 на сервер (При изменении отмечается как не отправленное false)
				"country_id integer," + //Страна
				"region_id integer," + //Область
				"area text," + //Район
				"district text, " + //Сельский округ и/или хозяйство

				"village text, " + //Посёлок
				"terrain text, " + //Название местности либо урочища
				
				"observer text, " + //ФИО наблюдателя
				"date text," + //"date integer," + //Дата создания (по гринвичу?)
				"timezone text, " + //Временная зона
				"lat_center double, " +
				"lon_center double, " +
				"lat1 double, " +
				"lon1 double, " +
				"lat2 double, " +
				"lon2 double, " +
				"lat3 double, " +
				"lon3 double, " +
				"lat4 double, " +
				"lon4 double, " +
				"lat5 double, " +
				"lon5 double, " +
				"lat6 double, " +
				"lon6 double, " +
				"infested_area double," + //заселенная площадь(га)
				"treated_area double," + //обработанная площадь(га)
				"vegetation_type_id integer," + //Тип(1 - дикая,  2 - культурная)
				"vegetation_height float," + //Высота (м)
				"vegetation_crop text," + //Текстовое поле для перечисления произрастающих культур
				"vegetation_cover_id integer," + //Густота Растительный покров (%)
				"vegetation_damage integer," + //Повреждения растительного покрова выпадающий список (слабая,средняя,сильная,сплошная)
				"vegetation_damage_area double," + //Площадь повреждений (га)
				"insecticide_name text," + //коммерческое название
				"insecticide_active_substance text," + //Наименование активного вещества
				//"insecticide_concentration double," + //концентрация(г д.в./л или%)
				"insecticide_concentration text," + //концентрация(г д.в./л или%) раньше был тип double сказали сделать строкой
				"insecticide_formulation_id integer," + //формуляция(1 - УМО, 2 - КЭ, 3 - др.)
				"insecticide_dose float," + //норма расхода(л/га)
				"insecticide_diluted_id integer," +
				"insecticide_proportion float," +
				"insecticide_rate float," + //расход рабочей жидкости(л/га)
				"insecticide_used_volume float," + //Общий объем использованной рабочей жидкости (л)
				"insecticide_number_spores float," + //Концентрация спор (/мл) (--------- В 2024 ссказали удалить поэтому не используется ---------)
				"insecticide_expiry_date integer," + //окончание срока действия (в нов. версии не используется)
				"insecticide_mixed text," + //смешивается ли инсектицид с водой или растворителем? (в нов. версии не используется)

				"insecticide_mixed_name text," + //если да, то с чем (в нов. версии не используется)
				"insecticide_mixed_ratio float," + //если да, то в каком соотношении (%) (в нов. версии не используется)

				"weather_time_start float," + //время начала
				"weather_time_end float," + //время окончания
				"weather_temperature_start float," + //Температура нач.(°C)
				"weather_temperature_end float," + //Температура кон.(°C)
				"weather_humidity_start float," + //отн. влажность воздуха нач.(%) (Удалили согласно заданию на 2024год)
				"weather_humidity_end float," + //отн. влажность воздуха кон.(%) (Удалили согласно заданию на 2024год)
				"weather_wind_speed_start float," + //скорость ветра нач. (м/с)
				"weather_wind_speed_end float," + //скорость ветра кон. (м/с)
				"weather_direction_start integer," + //направление ветра нач.
				"weather_direction_end integer," + //направление ветра кон.
				"weather_spray_direction_start integer," + //направление опрыскивания нач.
				"weather_spray_direction_end integer," + //направление опрыскивания кон.
				//"locust_speciese text," + //вид: CIT, DMA, LMI, др. (Не используется теперь поле ниже используется)
				"locust_type_id integer," + //вид: CIT, DMA, LMI, др.
				//"locust_hoppers text," + //Стадии личинок, возраста: Младшие Средние Старшие
				"locust_hoppers_id integer," + //возраста: Младшие Средние Старшие
				"locust_imago boolean," + //Имаго (да, нет) (TODO поле удалено, теперь в этом поле: locust_purpose_id)
				"locust_density float," + //плотность на м2
				//"locust_type text," + //Кулиги, Стаи или Разреженные
				"locust_kuliguli boolean," + //Кулиги (да, нет) (TODO поле удалено, теперь в этом поле: locust_purpose_id)
				"locust_swarm boolean," + //Стаи (да, нет) (TODO поле удалено, теперь в этом поле: locust_purpose_id)
				"locust_sparse boolean," + //Разреженные (да, нет) (TODO поле удалено, теперь в этом поле: locust_purpose_id)
				"locust_purpose_id integer," + //Цель: (Имаго, Кулиги, Стаи, Разреженные)

				"locust_phase_id integer," + //Фаза саранчи (одиночная, переходная, стадная)
				"spray_platform integer," + //Вид опрыскивания
				"spray_platform_a integer," + //1) «Авиа» - выпадающий список:«Самолет», «Вертолет», «Дельтаплан».
				"spray_platform_g integer," + //2) «Наземное» - выпадающий список:«Трактор», «Машина», «Аэроз.генераторG».
				"spray_platform_h integer," + //3) «Ручное» - выпадающий список:«Ранцевый», «Моторный», «Батарейный».

				"spray_capacity_id integer," + //Поле “Вид опрыскивания” (Объём) «Полнообъемное», «Малообъемное», «Ультрамалообъемное». (Сказали поле удалить удалил)

				//"spray_operator text," + //Оператор (пилот, водитель, др...)
				"spray_operatortype_id integer," + //Оператор (пилот, водитель, др...)
				//"spray_operator_name text," + //�?мя оператора
				"spray_manufacturer_name text," + //Марка опрыскивателя/модель
				"spray_model_name text," + //Модель опрыскивателя (теперь не используется всё пишется в поле выше)
				//"spray_date_calibration integer," + //Дата последней калибровки
				"spray_height float," + //Высота над поверхностью почвы (м)
				"spray_width float," + //Ширина захвата (м)
				//"spray_spacing float," + //Расстояние между проходами опрыскивателя (м)
				"spray_barrier boolean," + //Барьеры (да, нет)
				"spray_barrier_width float," + //Ширина (м) В 2024 сказали убрать, теперь не используется
				"spray_barrier_space float," + //промежуток (м)
				"spray_speed float," + //Скорость движения (км/ч)
				"spray_gps boolean," + //Антена: DGPS использовалась
				"spray_marking_id boolean," + //Наземная маркировка(Сиг-нальщики, GPS, Машина, Нет)

				"efficiency boolean NOT NULL DEFAULT 0," + //For CheckBox
				"efficacy_impact_id integer," + //Тип оцениваемого биологического воздействия (TODO потом удалить)
				"efficacy_impact text," + //Тип оцениваемого биологического воздействия (множественный выбор)
				"efficacy_mortality float," + //смертность саранчи(%)
				"efficacy_passed_time float," + //Прошло времени после обработки
				"efficacy_mortality_method integer," + //метод подсчета смертности
				"safety_clothing text," + //Какой защитной одеждой пользовался оператор
				"safety_clothing_clean boolean," + //В 2024 сказали оставить только в форме по ЗЧ и ОС (теперь это поле там)
				"safety_operator_health boolean," +
				"description text," + //Описание
				"safety_inform text," + //Кто был оповещен об обработках?
				//"safety_container_id integer," + //Что сделали с контейнером (больше не используется)
				"safety_container text," + //Что сделали с контейнером
				"safety_non_target boolean," + //воздействие на нецелевые организмы
				"safety_non_target_effect text," + //если да, то какое
				"safety_incident boolean," + //Другие инциденты по здоровью или окружающей среде, возникшие возможно при обработке
				"safety_incident_effect text," + //Если Да, тип инцидента и кем сообщен (описание)
				"comments text," + //КОММЕНТАР�?�?
				"test boolean" +
				");";
		db.execSQL(sql);

		//Для формы уничтожения саранчи id может быть пустым (только если создали на КПК)
		sql = "create table if not exists frmlocusthealth(" +
				"id integer," + //Локальный идентификатор на сервере для убыстрения доступа
				"uid text NOT NULL, " + //Уникальный идентификатор
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," +
				"send boolean NOT NULL DEFAULT 0," +

				"frmlocustdel_uid text NOT NULL," + //На основе какой формы заполняется анкета

				"filled boolean," + //Заполнена ли анкета (спец поле а не проверка на NULL потому что обязательность полей можно выставлять галочкой в интерфейсе)
				"device_id text, " + //Идентификатор устройства

				"user_id integer," + //Идентификатор пользователя который заполняет анкету


				//Идентификация места мониторинга
				"observer text, " + //Имя руководителя бригады по мониторингу ЗЧ и ОС
				"date text," + //Дата создания (по гринвичу?)
				"timezone text, " + //Временная зона
				"lat_center double, " +
				"lon_center double, " +
				"frmlocustdel_filled boolean," + //Заполнялась ли Форма по Мониторингу противосаранчовых обработок бригадой по обработке? (Похоже что это бесполезное поле так как есть поле frmlocustdel_uid)

				//Бригада по обработке
				"brigade_count integer," + //Количество работников в бригаде по обработке
				"brigade_count_trained integer," + //Количество работников, ранее обученных обращению с инсектицидами и их применению

				//Информация об инсектицидах
				"insecticide_part_number text," + //Номер партии препарата (если указан на контейнере)
				"insecticide_manufactured_date text," + //Дата производства или срок годности (срок хранения)
				"insecticide_expiration_date integer," + //********** На всякий случай, может и не пригодиться **********
				"insecticide_container_state_id integer," + //Состояние пакетов или контейнеров с инсектицидами

				//Сведения по опрыскиванию
				"spr_leak boolean," + //Механическая безопасность: наблюдалась ли утечка инсектицида? (Да, Нет)
				"spr_leak_place text," + //Если Да, в какой части опрыскивателя имеется утечка? (Текст)
				"spr_damage boolean," + //Система опрыскивания: повреждены распылители или сопла? (Да, Нет)
				"spr_damage_place text," + //Если Да, какие повреждения? (Текст)

				"spr_treated_area_check float,"+// Обработанная площадь (проверено бригадой по мониторингу) (га)
				"spr_fact_volume float," + // Фактическая норма объема опрыскивания (л/га) Расчет: (объем/площадь)
				"spr_observation boolean," + // Если проводилось наблюдение за опрыскиванием: соблюдалась ли надлежащая практика применения инсектицидов?
				"spr_description text," + // Замечания относительно наблюдаемой практики опрыскивания

				//Калибровка опрыскивателя
				"calibr_consumption_check boolean," + // Калибровка расхода жидкости: проверялся ли расход жидкости опрыскивателя во время мониторинга?
				"calibr_time integer," + // Время калибровки (мин.):
				"calibr_volume integer," + // Собранный объем (л):
				"calibr_rate integer," + // Расход жидкости (л/мин):
				"calibr_precipitation boolean," + // Качество применения: проверялось ли осаждение капель во время мониторинга?
				"calibr_width_card float," + // Длина трансекты, определенная с использованием масляно-/водочувствительной бумаги (м)
				"calibr_wind_speed float," + // Средняя скорость ветра при осаждении капель (м/с)
				"calibr_droplet_coating float," + // Ширина дорожки с хорошим покрытием капель (м)
				"calibr_passes_interval float," + // Рекомендуемый интервал между проходами (м)

				// Контроль эффективности
				"efficacy_control boolean," + // Проведен ли контроль эффективности (бригада мониторинга)?
				"efficacy_impact_type_id integer," + // Тип оцениваемого биологического воздействия (TODO удалить)
				"efficacy_impact_type text," + // Тип оцениваемого биологического воздействия (множественный выбор)
				"efficacy_mortality float," + // Наблюдаемая эффективность обработки (%)
				"efficacy_passed_time float," + // Прошло времени после обработки
				"efficacy_mortality_method_id integer," + // Метод оценки эффективности обработки (выбор: подсчет квадратов; подсчет по разрезам; подсчет кулиг личинок; другое)

				// Здоровье человека
				"hlth_safety_clothing_clean boolean," + //Защитная одежда чистая и в хорошем состоянии (В 2024 сказали оставить только в форме по ЗЧ и ОС)
				"hlth_clothing_state text," + // Замечания относительно типа и состояния средств индивидуальной защиты
				"hlth_clothing_reserve boolean," + // В бригаде или на ближайшей противосаранчовой базе имеется запасная защитная одежда (в частности, комбинезоны и перчатки)
				"hlth_operator_passport integer," + // Количество операторов с паспортами  использования пестицидов
				"hlth_filled_passport integer," + // Количество правильно заполненных паспортов использования пестицидов
				//"hlth_passport_count integer," + лишнее удалил
				"hlth_inhibition boolean," + // Во время мониторинга измерялось ли ингибирование холинэстеразы?
				"hlth_description text," + // Дополнительные сведения о случайном воздействии или отравлении

				//********** Состояние окружающей среды **********
				"safety_observed_pollution boolean," + // Наблюдалось или сообщалось о случайном загрязнении? (например, разлив инсектицидов, неправильная очистка оборудования и т. д.)
				"safety_type_pollution text," + // Если Да, то где и какой тип загрязнения?

				"safety_non_target boolean," + // Наблюдалось или сообщалось о воздействии на нецелевые организмы? (например, болезни домашнего скота, смертность рыб, гибель пчел и т.д.)
				"safety_non_target_effect text," + // Если Да, то где и какое воздействие?
				"safety_non_target_effect_person text," + // Если информация поступила от прочих лиц, от кого именно? (укажите имя, номер телефона, адрес)

				"safety_control boolean," + // Осуществлялся ли бригадой по мониторингу ЗЧ и ОС контроль в отношении наблюдаемого или зарегистрированного воздействия на окружающую среду
				"safety_control_actions text," + // Если Да, опишите последующее действие(я)

				//**********Предоставление информации**********
				//**********Карта и фотографии**********
				"map_treatment boolean," + // Была ли составлена ситуационная карта обработки?

				"image_name1 text," + //Наименование рисунка 1
				"image_send1 boolean NOT NULL DEFAULT 0," + //Отправили ли рисунок 1 на сервер (При изменении отмечается как не отправленное false)
				"image_name2 text," + //Наименование рисунка 2
				"image_send2 boolean NOT NULL DEFAULT 0," + //Отправили ли рисунок 1 на сервер (При изменении отмечается как не отправленное false)
				"image_name3 text," + //Наименование рисунка 3
				"image_send3 boolean NOT NULL DEFAULT 0," + //Отправили ли рисунок 1 на сервер (При изменении отмечается как не отправленное false)
				"image_name4 text," + //Наименование рисунка 4
				"image_send4 boolean NOT NULL DEFAULT 0," + //Отправили ли рисунок 1 на сервер (При изменении отмечается как не отправленное false)
				"image_name5 text," + //Наименование рисунка 5
				"image_send5 boolean NOT NULL DEFAULT 0," + //Отправили ли рисунок 1 на сервер (При изменении отмечается как не отправленное false)

				"risk_house boolean," + // Имеются ли в непосредственной близости от обработок жилые дома или жилье (в радиусе 2 км вокруг обрабатываемого участка)
				"risk_house_distance float," + // Расстояние от ближайшего края обрабатываемого участка (м) до ближайшего жилья:
				"risk_house_buffer_zones boolean," + // Соблюдались ли буферные зоны?
				"risk_house_impact boolean," + // Существует ли вероятность воздействия на жилые дома/жилье?
				"risk_house_informed boolean," + // Были ли проинформированы жители о применении инсектицидов? (проверка бригадой по мониторингу)

				"risk_water boolean," + // Имеются ли в непосредственной близости от обработок поверхностные воды (в радиусе 2 км вокруг обрабатываемого участка)
				"risk_water_distance float," + // Расстояние от ближайшего края обрабатываемого участка (м) до ближайшего источника поверхностной воды:
				"risk_water_buffer_zones boolean," + // Соблюдались ли буферные зоны?
				"risk_water_impact boolean," + // Существует ли вероятность воздействия на поверхностные воды?

				"risk_apiary boolean," + // Имеются ли в непосредственной близости от обработок пчеловодства (в радиусе 5 км вокруг обрабатываемого участка)
				"risk_apiary_distance float," + // Расстояние от ближайшего края обрабатываемого участка (м) до пасеки
				"risk_apiary_informed boolean," + // Были ли пчеловоды проинформированы о применении инсектицидов
				"risk_apiary_measure text," + // Какие меры были предприняты для снижения отрицательного воздействия на пчел
				"risk_apiary_impact boolean," + // Существует ли вероятность воздействия на пчел

				"risk_agricultural boolean," + // Были ли обработаны или подверглись воздействию какие-либо сельхозкультуры?
				"risk_agricultural_name text," + // Наименование сельхозкультуры
				"risk_agricultural_phase text," + // Фаза развития сельхозкультуры
				"risk_agricultural_toxic boolean," + // Наблюдалась ли фитотоксичность
				"risk_agricultural_inform boolean," + // Были ли фермеры проинформированы о предуборочном периоде

				"risk_silk boolean," + // Имеются ли в непосредственной близости от обработок шелководства (в радиусе 2 км вокруг обрабатываемого участка)
				"risk_silk_distance float," + // Расстояние от ближайшего края обрабатываемого участка (м) до тутовой плантации
				"risk_silk_inform boolean," + // Были ли шелководы проинформированы о применении инсектицидов?
				"risk_silk_trees_measure text," + // Какие меры были предприняты для снижения отрицательного воздействия на тутовые деревья
				"risk_silk_trees_impact boolean," + // Существует ли вероятность воздействия на тутовые деревья

				"risk_pastures boolean," + // Были ли обработаны луга или пастбища?
				"risk_pastures_inform boolean," + // Были ли пастухи проинформированы о периодах удержания домашнего скота?

				"risk_park boolean," + // Имеются ли в непосредственной близости от обработок другие экологически чувствительные зоны
				"risk_park_type text," + // Какой тип экологически чувствительной зоны
				"risk_park_distance float," + // Расстояние от ближайшего края обрабатываемого участка (м) до экологически чувствительной зоны
				"risk_park_buffer_zones boolean," + // Соблюдались ли буферные зоны?
				"risk_park_impact boolean," + // Существует ли вероятность воздействия на экологически чувствительные зоны?

				"risk_probe_analysis boolean," + // Пробы, взятые для анализа остатков
				"risk_probe_analysis_name text," + // Проба какого субстрата или организма была взята
				"risk_probe_analysis_number text," + // Регистрационный номер формы отбора проб


				"test boolean" + //Тестовая ли анкета
				");";
		db.execSQL(sql);

		sql = "create table if not exists frmlocust_locations(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"frmlocust_uid text," +
				"pos integer NOT NULL," + //Позиция
				"lon double NOT NULL," +
				"lat double NOT NULL" +
				");";
		db.execSQL(sql);

		sql = "create table if not exists frmlocustdel_locations(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"frmlocustdel_uid text," +
				"pos integer NOT NULL," + //Позиция
				"lon double NOT NULL," +
				"lat double NOT NULL" +
				");";
		db.execSQL(sql);

		sql = "create table if not exists frmlocusthealth_locations(" +
				"id integer NOT NULL PRIMARY KEY," +
				"uid text, " + //Уникальный идентификатор пока не используется но для распределенной базы будет использоваться
				"del boolean NOT NULL DEFAULT 0," +
				"seq integer NOT NULL DEFAULT 1," + //Время изменения
				"frmlocusthealth_uid text," +
				"pos integer NOT NULL," + //Позиция
				"lon double NOT NULL," +
				"lat double NOT NULL" +
				");";
		db.execSQL(sql);

		Log.i("CCALM", "Создали базы");
	}

	/** Обновление базы если версия не соответствует
	*/
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion)
	{
        //В SQLIte можно только добавить столбец либо переименовать таблицу https://sqlite.org/lang_altertable.html поэтому обновление усложняется....
		String sql;

		//if(oldVersion==152 && Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { //Для "RENAME COLUMN" Версия андроида должнв быть выше Android 11
		if(oldVersion==153) {

			db.execSQL("ALTER TABLE frmlocustdel ADD COLUMN efficacy_impact TEXT;");
			db.execSQL("UPDATE frmlocustdel SET efficacy_impact = efficacy_impact_id;");

			db.execSQL("ALTER TABLE frmlocusthealth ADD COLUMN efficacy_impact_type TEXT;");
			db.execSQL("UPDATE frmlocusthealth SET efficacy_impact_type = efficacy_impact_type_id;");

			oldVersion=154;
		}

		if(oldVersion < newVersion) //Это условие выполняется: если совсем старые версии и не знаю что поменялось...
		{
			dropAllTables(db);
			onCreate(db);
		}
	}

	public boolean dropAllTables(SQLiteDatabase db){

		//db.execSQL("DROP TABLE IF EXISTS android_metadata");
		db.execSQL("DROP TABLE IF EXISTS frmlocust");
		db.execSQL("DROP TABLE IF EXISTS frmlocust_locations");
		db.execSQL("DROP TABLE IF EXISTS frmlocustdel");
		db.execSQL("DROP TABLE IF EXISTS frmlocustdel_locations");
		db.execSQL("DROP TABLE IF EXISTS frmlocusthealth");
		db.execSQL("DROP TABLE IF EXISTS frmlocusthealth_locations");

		db.execSQL("DROP TABLE IF EXISTS countriesregions");
		db.execSQL("DROP TABLE IF EXISTS countriesregionspoints");
		db.execSQL("DROP TABLE IF EXISTS countries");
		db.execSQL("DROP TABLE IF EXISTS locuststypes"); //Табличка видов саранчи
		db.execSQL("DROP TABLE IF EXISTS _languages");
		db.execSQL("DROP TABLE IF EXISTS _translations");
		db.execSQL("DROP TABLE IF EXISTS _user");
		db.execSQL("DROP TABLE IF EXISTS borns"); //Справочник отрождение "Начало", "Массовое".
		db.execSQL("DROP TABLE IF EXISTS list_density"); //Справочник плотност: «низкая», «средняя» и «высокая».
		db.execSQL("DROP TABLE IF EXISTS list_phase");
		db.execSQL("DROP TABLE IF EXISTS list_mortality"); //Метод подсчёта смертности
		db.execSQL("DROP TABLE IF EXISTS list_directions"); //Стороны света направления
		db.execSQL("DROP TABLE IF EXISTS list_damage"); //Справочник повреждений растительного покрова
		db.execSQL("DROP TABLE IF EXISTS list_greenery");
		db.execSQL("DROP TABLE IF EXISTS list_biotope");
		db.execSQL("DROP TABLE IF EXISTS list_cover");
		db.execSQL("DROP TABLE IF EXISTS list_age");
		db.execSQL("DROP TABLE IF EXISTS list_actions");
		db.execSQL("DROP TABLE IF EXISTS list_paintings");
		db.execSQL("DROP TABLE IF EXISTS list_behaviors"); //
		db.execSQL("DROP TABLE IF EXISTS list_breeding"); //«Одиночные, разреженные, группы»
		db.execSQL("DROP TABLE IF EXISTS list_capacities"); //«Полнообъемное», «Малообъемное», «Ультрамалообъемное».
		db.execSQL("DROP TABLE IF EXISTS list_markings");
		db.execSQL("DROP TABLE IF EXISTS list_containers");
		db.execSQL("DROP TABLE IF EXISTS list_containers_states"); //"Неповрежденные и этикетки читаемые", "Неповрежденные, но этикетка отсутствует или не возможно читать информацию", "Повреждены", "Не проверялось"
		db.execSQL("DROP TABLE IF EXISTS list_purpose");
		db.execSQL("DROP TABLE IF EXISTS list_impact");
		db.execSQL("DROP TABLE IF EXISTS list_diluted");
		db.execSQL("DROP TABLE IF EXISTS sprayers"); //Опрыскиватели: "Трактор", "Самолёт" итд.
		db.execSQL("DROP TABLE IF EXISTS sprayers_types"); //Виды опрыскивания: "Авиа", "Наземное", "Ручное".
		db.execSQL("DROP TABLE IF EXISTS Fledgling");

		return true;
	}

	//Функция по изменению типа столбца
	public boolean changeTableFieldType()
	{
		//
		return true;
	}
	
	
	
	/** Получить список столбцов*/
	public List<String> GetColumns(String tableName)
	{
		List<String> ar = null;
		SQLiteDatabase rdb=null;
		Cursor cursor = null;
		try {
			rdb = getReadableDatabase();
			cursor = rdb.rawQuery("select * from " + tableName + " limit 1", null);
			ar = new ArrayList<String>(Arrays.asList(cursor.getColumnNames()));
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(cursor != null) { cursor.close(); }
			if(rdb != null) { rdb.close(); }
		}
		return ar;
	}

	/**Функция для обновления или вставки табличных данных*/
	public Boolean updateTable(TCTable tbl)
	{
		if(tbl==null) return false;

		if(tbl.name.equals("frmlocustdel_locations")){
			Log.i("CCALM", "tbl.name = "+tbl.name);
		}

		//Проверка на существование полей
		Boolean[] fb=new Boolean[tbl.fields.size()]; //Для проверки существования полей в локальной таблице
		for(int i=0;i<fb.length;i++) fb[i]=false; //Помечаем что ниодного поля не существует
		List<String> col = GetColumns(tbl.name);
		for(int i=0;i<tbl.fields.size();i++)
		{
			for(int j=0;j<col.size();j++)
			{
				if(tbl.fields.get(i).name.toUpperCase().equals(col.get(j).toUpperCase()))
				{	fb[i]=true;
					break;
				}
			}
		}

		//Переписываем значения существующих полей и выполняем запросы
		while(tbl.ReadNextRecord())
		{
			if(tbl.name.equals("frmlocustdel_locations")){
				Log.i("CCALM","tbl.name="+tbl.name); //Дата не загрузилась и центр участка не загрузился
			}
			String sql=null;
			String[] par=null;
			if(tbl.getRowByName("id")!=null){
				sql="select 1 from "+tbl.name+" where id = ?";
				par = new String[] { tbl.getRowByName("id").getStrVal() };
			}else if(tbl.getRowByName("uid")!=null){
				sql="select 1 from "+tbl.name+" where uid = ?";
				par = new String[] { tbl.getRowByName("uid").getStrVal() };
			}
			if(sql==null)
				return false;

			boolean exists=false;
			SQLiteDatabase rdb=null;
			Cursor cursor = null;
			try {
				rdb = getReadableDatabase();
				cursor = rdb.rawQuery(sql, par);
				exists=cursor.moveToFirst();
			}catch(Exception e){
				e.printStackTrace();
			}finally{
				if(cursor != null) { cursor.close(); }
				if(rdb != null) { rdb.close(); }
			}

			ContentValues cv = new ContentValues();
			for(int i=0;i<tbl.fields.size();i++)
			{
				if(tbl.name.equals("frmlocustdel_locations")){
					Log.i("CCALM","fld="+tbl.fields.get(i).name+" val="+tbl.fields.get(i).getStrVal()+" type="+tbl.fields.get(i).type); //Для дебага
				}

				if(fb[i]) //Присваиваем только поля существующие в локальной базе
				{
					if(tbl.fields.get(i).value==null)
						cv.putNull(tbl.fields.get(i).name);
					else
						cv.put(tbl.fields.get(i).name, tbl.fields.get(i).getStrVal());
				}
			}

			if(!exists) //Если существует запись то вставляем, иначе обновляем.
			{
				SQLiteDatabase wdb = null;
				try {
					wdb = this.getWritableDatabase();
					wdb.beginTransaction(); //Вроде как защита от многопоточности (для сервиса)
					try {
						wdb.insert(tbl.name, null, cv);
						wdb.setTransactionSuccessful();
					}catch(Exception ex){
						ex.printStackTrace();
					}finally {
						wdb.endTransaction();
					}
				}catch(Exception e){
					e.printStackTrace();
				}finally{
					if(wdb!=null){ wdb.close(); }
				}
			}else
			{
				SQLiteDatabase wdb = null;
				try {
					wdb = this.getWritableDatabase();
					wdb.beginTransaction(); //Вроде как защита от многопоточности (для сервиса)
					try {
						if(tbl.getRowByName("id")!=null){
							wdb.update(tbl.name, cv, "id = ?", new String[] { tbl.getRowByName("id").getStrVal() });
						}else if(tbl.getRowByName("uid")!=null){
							wdb.update(tbl.name, cv, "uid = ?", new String[] { tbl.getRowByName("uid").getStrVal() });
						}else
							return false;

						wdb.setTransactionSuccessful();
					}catch(Exception ex){
						ex.printStackTrace();
					} finally {
						wdb.endTransaction();
					}
				}catch(Exception e){
					e.printStackTrace();
				}finally{
					if(wdb!=null){ wdb.close(); }
				}
			}
		}

		//Для дебага вывожу сколько строк в каждой таблице
//		SQLiteDatabase rdb=null;
//		try {
//			rdb = getReadableDatabase();
//			cursor = rdb.rawQuery("select sum(1) cnt from " + tbl.name, null);
//			if (cursor.moveToFirst()) {
//				do {
//					Log.i("CCALM", "tbl1=" + tbl.name + " cnt=" + cursor.getString(0));
//				} while (cursor.moveToNext());
//			}
//			cursor.close();
//		}catch(Exception e){
//			e.printStackTrace();
//		}finally{
//			if(rdb!=null) rdb.close();
//		}


		return true;
	}

	//Функция для вставки табличных данных (без проверки существования)
	public Boolean insertTable(TCTable tbl)
	{
		//Проверяю какие поля существую локально в базе
		Boolean[] fb=new Boolean[tbl.fields.size()]; //Для проверки существования полей в локальной таблице
		for(int i=0;i<fb.length;i++) fb[i]=false; //Помечаем что ниодного поля не существует
		List<String> col = GetColumns(tbl.name);
		if(col==null) return false;
		for(int i=0;i<tbl.fields.size();i++)
		{
			for(int j=0;j<col.size();j++)
			{
				if(tbl.fields.get(i).name.toUpperCase().equals(col.get(j).toUpperCase()))
				{	fb[i]=true;
					break;
				}
			}
		}

		SQLiteDatabase wdb = null;
		try {
			wdb = this.getWritableDatabase();
			//Переписываем значения существующих полей и выполняем запросы
			try {
				wdb.beginTransaction(); //Вроде как защита от многопоточности (для сервиса)
				while(tbl.ReadNextRecord())
				{
					ContentValues cv = new ContentValues();
					for(int i=0;i<tbl.fields.size();i++)
					{
						if(fb[i]) //Присваиваем только поля существующие локально
						{
							if(tbl.fields.get(i).value==null)
								cv.putNull(tbl.fields.get(i).name);
							else
								cv.put(tbl.fields.get(i).name, tbl.fields.get(i).getStrVal());
						}
					}
					wdb.insert(tbl.name, null, cv);
				}
				wdb.setTransactionSuccessful();
			} catch (Exception e) {
				Log.e("CCALM", "Error: ", e);
				//e.printStackTrace();
			} finally {
				wdb.endTransaction();
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(wdb!=null){ wdb.close(); }
		}
		return true;
	}

	/** Добавиь либо обновить нового пользователя (он может быть только 1) 
	*/
	public void setUser(int id, int del, int seq, String name, String surname, String patronymic, String login, String password)
	{
		//так как пользователь может быть только 1 то удаляем всех остальных
		boolean b=false;
		SQLiteDatabase rdb=null;
		Cursor cursor=null;
		try {
			rdb=getReadableDatabase();
			rdb.execSQL("update _user set del=1;");
			cursor = rdb.rawQuery("select 1 from _user where id = ?", new String[]{String.valueOf(id)});
			b = cursor.moveToFirst();
		}catch(Exception e){
			e.printStackTrace();
		}finally{
			if(cursor != null) { cursor.close(); }
			if(rdb!=null) rdb.close();
		}

		if(!b) //Новый
		{
			SQLiteDatabase wdb = null;
			try {
				wdb = this.getWritableDatabase();
				ContentValues cv = new ContentValues();
				cv.put("id", id);
				cv.put("del", del);
				cv.put("seq", seq);
				cv.put("name", name);
				cv.put("surname", surname);
				cv.put("patronymic", patronymic);
				cv.put("login", login);
				cv.put("password", password);
				wdb.beginTransaction(); //Вроде как защита от многопоточности (для сервиса)
				try {
					wdb.insert("_user", null, cv);
					wdb.setTransactionSuccessful();
				}catch(Exception e){
					e.printStackTrace();
				} finally {
					wdb.endTransaction();
				}
			}catch(Exception e){
				e.printStackTrace();
			}finally{
				if(wdb!=null){ wdb.close(); }
			}
		}else //Обновить
		{
			SQLiteDatabase wdb = null;
			try {
				wdb = this.getWritableDatabase();
				ContentValues cv = new ContentValues();
				//cv.put("id", id);
				cv.put("del", del);
				cv.put("seq", seq);
				cv.put("name", name);
				cv.put("surname", surname);
				cv.put("patronymic", patronymic);
				cv.put("login", login);
				cv.put("password", password);
				wdb.beginTransaction(); //Вроде как защита от многопоточности (для сервиса)
				try {
					wdb.update("_user", cv, "id = ?", new String[] { String.valueOf(id) });
					wdb.setTransactionSuccessful();
				}catch(Exception e){
					e.printStackTrace();
				} finally {
					wdb.endTransaction();
				}
			}catch(Exception e){
				e.printStackTrace();
			}finally{
				if(wdb!=null){ wdb.close(); }
			}
		}
	}

	/**
	* Добавить либо обновить запись о уничтожении саранчи 
	*/
/*	public void setLocustDel(
			Integer id,
			Integer del,
			Integer seq, //Дата изменения записи
			Long created, //Дата создания записи
			int changed,
			Integer user_id,

			String image_name1,
			String country,
			String region,
			String area,
			String district,
			String observer,
			Long date, //not null ()
			String terrain,
			Double lat,
			Double lon,

			Integer infested_area, //заселенная площадь(га)
			Integer treated_area, //обработанная площадь(га)
			String vegetation_type, //Тип(дикая, культурная)
			Integer vegetation_height, //Высота (м)
			String vegetation_cover, //Растительный покров (%)
			String  vegetation_crop, //Перечисление культур
			Integer vegetation_damage, //Повреждения растительного покрова(%)
			Integer vegetation_damage_area, //Площадь повреждений (га)
			String insecticide_name, //коммерческое название
			String insecticide_active_substance, //Наименование активного вещества
			String insecticide_concentration, //концентрация(г д.в./л или%)
			String insecticide_formulation, //формуляция(УМО, КЭ, др.)
			Integer insecticide_dose, //норма расхода(л/га)
			Integer insecticide_rate, //расход рабочей жидкости(л/га)
			Long insecticide_expiry_date, //окончание срока действия (Дата и время в секунд после 1970)
			String insecticide_mixed, //смешивается ли инсектицид с водой или растворителем?
			String insecticide_mixed_name,
			Integer insecticide_mixed_ratio, //если да, то в каком соотношении (%)
			Integer weather_time_start, //время начала (секунд с начала дня)
			Integer weather_time_end, //время окончания (секунд с начала дня)
			Integer weather_temperature_start, //Температура нач.(°C)
			Integer weather_temperature_end, //Температура кон.(°C)
			Integer weather_wind_speed_start, //скорость ветра нач. (м/с)
			Integer weather_wind_speed_end, //скорость ветра кон. (м/с)
			Integer weather_direction_start, //направление ветра нач.
			Integer weather_direction_end, //направление ветра кон.
			Integer weather_spray_direction_start, //направление опрыскивания нач.
			Integer weather_spray_direction_end, //направление опрыскивания кон.
			String locust_speciese, //вид: CIT, DMA, LMI, др.
			String locust_hoppers, //Стадии личинок
			Integer locust_density, //плотность на м2
			String locust_kuliguli, //Кулиги, Стаи или Разреженные
			String spray_platform, //Вид опрыскивания
			String spray_operator, //Оператор (пилот, водитель, др...)
			//String spray_operator_name, //�?мя оператора
			String spray_manufacturer_name, //Марка опрыскивателя
			String spray_model_name, //Модель опрыскивателя
			//Long spray_date_calibration, //Дата последней калибровки
			Integer spray_height, //Высота над поверхностью почвы (м)
			Integer spray_width, //Ширина захвата (м)
			Integer spray_spacing, //Расстояние между проходами опрыскивателя (м)
			Integer spray_barrier, //Барьеры: ширина и промежуток  (м)
			Integer spray_speed, //Скорость движения (км/ч)
			Boolean spray_gps, //Антена: DGPS использовалась
			String spray_marking, //Наземная маркировка(Сиг-нальщики, GPS, Машина, Нет)
			Integer efficacy_mortality, //смертность саранчи(%)
			Integer efficacy_passed_time, //Прошло времени после обработки
			String efficacy_mortality_method, //метод подсчета смертности
			Boolean safety_clothing, //Какой защитной одеждой пользовался оператор
			String  safety_inform, //Кто был оповещен об обработках?
			Boolean safety_non_target, //воздействие на нецелевые организмы
			String safety_non_target_effect, //если да, то какое
			String description //КОММЕНТАР�?�?
		)
	{

		if(user_id == null) //Если не задан пользователь то текщий
		{
			SQLiteDatabase db = this.getReadableDatabase();
			Cursor cursor = db.rawQuery("select id from _user where del=0;", null);
			if(cursor.moveToFirst())
			{
				user_id = Integer.valueOf(cursor.getInt(cursor.getColumnIndex("id")));
			}
			cursor.close();
		}
		if(created == null) created = (new Date()).getTime() / 1000L; //Если не задана дата то текушая

		Cursor cursor = getReadableDatabase().rawQuery("select 1 from frmlocustdel where id = ? or (id is null and date=?)", new String[] { String.valueOf(id), String.valueOf(date) });

		boolean b=cursor.moveToFirst();
		cursor.close();

		ContentValues cv = new ContentValues();
		if(!b) cv.put("id", id); //При вставке null
		cv.put("del", del);
		cv.put("seq", seq);
		cv.put("created", created); //Дата создания записи
		cv.put("changed", changed); //�?зменённое ли
		cv.put("send", 0); //Отмечаем как не отправленое		
		cv.put("user_id", user_id);
		cv.put("image_name1", image_name1);
		cv.put("country", country);
		cv.put("region", region);
		cv.put("area", area);
		cv.put("district", district);
		cv.put("observer", observer);
		cv.put("date", date);
		cv.put("terrain", terrain);	
		cv.put("lat", lat);
		cv.put("lon", lon);

		cv.put("infested_area", infested_area); //заселенная площадь(га)
		cv.put("treated_area", treated_area); //обработанная площадь(га)
		cv.put("vegetation_type", vegetation_type); //Тип(дикая, культурная)
		cv.put("vegetation_height", vegetation_height); //Высота (м)
		cv.put("vegetation_cover", vegetation_cover); //Растительный покров (%)
		cv.put("vegetation_crop", vegetation_crop); //Перечисление культур
		cv.put("vegetation_damage", vegetation_damage); //Повреждения растительного покрова(%)
		cv.put("vegetation_damage_area", vegetation_damage_area); //Площять повреждений
		cv.put("insecticide_name", insecticide_name); //коммерческое название
		cv.put("insecticide_active_substance", insecticide_active_substance); //наименование активного вещества
		cv.put("insecticide_concentration", insecticide_concentration); //концентрация(г д.в./л или%)
		cv.put("insecticide_formulation", insecticide_formulation); //формуляция(УМО, КЭ, др.)
		cv.put("insecticide_dose", insecticide_dose); //норма расхода(л/га)
		cv.put("insecticide_rate", insecticide_rate); //расход рабочей жидкости(л/га)
		cv.put("insecticide_expiry_date", insecticide_expiry_date); //окончание срока действия (Дата и время в секунд после 1970)
		cv.put("insecticide_mixed", insecticide_mixed); //смешивается ли инсектицид с водой или растворителем?
		cv.put("insecticide_mixed_name", insecticide_mixed_name);
		cv.put("insecticide_mixed_ratio", insecticide_mixed_ratio); //если да, то в каком соотношении (%)
		cv.put("weather_time_start", weather_time_start); //время начала (секунд с начала дня)
		cv.put("weather_time_end", weather_time_end); //время окончания (секунд с начала дня)
		cv.put("weather_temperature_start", weather_temperature_start); //Температура нач.(°C)
		cv.put("weather_temperature_end", weather_temperature_end); //Температура кон.(°C)
		cv.put("weather_wind_speed_start", weather_wind_speed_start); //скорость ветра нач. (м/с)
		cv.put("weather_wind_speed_end", weather_wind_speed_end); //скорость ветра кон. (м/с)
		cv.put("weather_direction_start", weather_direction_start); //направление ветра нач.
		cv.put("weather_direction_end", weather_direction_end); //направление ветра кон.
		cv.put("weather_spray_direction_start", weather_spray_direction_start); //направление опрыскивания нач.
		cv.put("weather_spray_direction_end", weather_spray_direction_end); //направление опрыскивания кон.
		cv.put("locust_speciese", locust_speciese); //вид: CIT, DMA, LMI, др.
		cv.put("locust_hoppers", locust_hoppers); //Стадии личинок
		cv.put("locust_density", locust_density); //плотность на м2
		cv.put("locust_kuliguli", locust_kuliguli); //Кулиги, Стаи или Разреженные
		cv.put("spray_platform", spray_platform); //Вид опрыскивания
		cv.put("spray_operator", spray_operator); //Оператор (пилот, водитель, др...)
		//cv.put("spray_operator_name", spray_operator_name); //�?мя оператора
		cv.put("spray_manufacturer_name", spray_manufacturer_name); //Марка опрыскивателя
		cv.put("spray_model_name", spray_model_name); //Модель опрыскивателя
		//cv.put("spray_date_calibration", spray_date_calibration); //Дата последней калибровки
		cv.put("spray_height", spray_height); //Высота над поверхностью почвы (м)
		cv.put("spray_width", spray_width); //Ширина захвата (м)
		cv.put("spray_spacing", spray_spacing); //Расстояние между проходами опрыскивателя (м)
		cv.put("spray_barrier", spray_barrier); //Барьеры: ширина и промежуток  (м)
		cv.put("spray_speed", spray_speed); //Скорость движения (км/ч)
		cv.put("spray_gps", spray_gps); //Антена: DGPS использовалась
		cv.put("spray_marking", spray_marking); //Наземная маркировка(Сиг-нальщики, GPS, Машина, Нет)
		cv.put("efficacy_mortality", efficacy_mortality); //смертность саранчи(%)
		cv.put("efficacy_passed_time", efficacy_passed_time); //Прошло времени после обработки
		cv.put("efficacy_mortality_method", efficacy_mortality_method); //метод подсчета смертности
		cv.put("safety_clothing", safety_clothing); //Какой защитной одеждой пользовался оператор
		cv.put("safety_inform", safety_inform); //Кто был оповещен об обработках?
		cv.put("safety_non_target", safety_non_target); //воздействие на нецелевые организмы
		cv.put("safety_non_target_effect", safety_non_target_effect); //если да, то какое
		cv.put("description", description); //КОММЕНТАР�?�?

		if(!b) //Новая
		{
			SQLiteDatabase db = this.getWritableDatabase();
			db.beginTransaction(); //Вроде как защита от многопоточности (для сервиса)
			try {
				db.insert("frmlocustdel", null, cv);
				db.setTransactionSuccessful();
			}catch(Exception e){
				e.printStackTrace();
			} finally {
				db.endTransaction();
			}
			db.close();
		}else //Обновить запись
		{
			SQLiteDatabase db = this.getWritableDatabase();
			db.beginTransaction(); //Вроде как защита от многопоточности (для сервиса)
			try {
				db.update("frmlocustdel", cv, "id = ? or (id is null and date=?)", new String[] { String.valueOf(id), String.valueOf(date) });
				db.setTransactionSuccessful();
			} finally {
				db.endTransaction();
			}
			db.close();
		}

	}
*/
	/**
	* Добавить либо обновить запись о числености саранчи
	* user_id - �?дентификатор пользователя
	* date - дата введёная пользователем
	* terrain - Название местности или урочища
	* lat - широта
	* lon - долгота 
	*/
/*	public void setLocust(
			Integer id,
			int del,
			int seq,
			Long created,
			int changed,
			Integer user_id,

			String image_name1,
			String country,
			String region,
			String area,
			String district, //Сельский округ и/или хозяйство
			String observer,
			long date,
			String terrain,
			Double lat,
			Double lon,

			Integer bio_hectare,
			Integer bio_biotope_id, 
			integer bio_greenery_id,
			Integer bio_greenery_cover_id,
			Integer bio_temperature,
			Integer bio_wind, 
			boolean locust_have,
			double locust_populated,
			Integer eggs_capsules_area,
			Integer eggs_capsules_density, 
			Integer eggs_capsules,
			Integer eggs_Live,
			String eggs_enemies,
			String larva_born_id,
			Integer larva_age_id,
			String larva_painting_id,
			String larva_behavior_id,
			Integer larva_density,
			String kuliguli_age_id,
			Integer kuliguli_density,
			Integer kuliguli_size,
			Integer kuliguli_count,
			Integer kuliguli_action_id,
			Integer imago_wing_id,
			Integer imago_maturity,
			String imago_phase,
			String imago_action,
			Integer imago_density,
			String imago_copulation,
			Integer imago_flying,
			Integer swarm_maturity,
			Integer swarm_density_id,
			Integer swarm_size,
			Integer swarm_count,
			String swarm_copulation,
			Integer swarm_flying,
			String swarm_height_id,
			String description
			)
	{
		if(user_id == null) //Если не задан пользователь то текщий
		{
			SQLiteDatabase db = this.getReadableDatabase();
			Cursor cursor = db.rawQuery("select id from _user where del=0;", null);
			if(cursor.moveToFirst())
			{
				user_id = Integer.valueOf(cursor.getInt(cursor.getColumnIndex("id")));
			}
			cursor.close();
		}
		if(created == null) created = (new Date()).getTime() / 1000L;

		Cursor cursor = getReadableDatabase().rawQuery("select 1 from frmlocust where id = ? or (id is null and date=?)", new String[] { String.valueOf(id), String.valueOf(date) });
		boolean b=cursor.moveToFirst();
		cursor.close();

		ContentValues cv = new ContentValues();

		if(!b) cv.put("id", id); //При вставке null
		cv.put("del", del);
		cv.put("seq", seq);
		cv.put("created", created); //Дата создания записи
		cv.put("send", 0); //Отмечаем как не отправленое
		cv.put("changed", changed); //�?зменённое ли	
		cv.put("user_id", user_id);
		cv.put("image_name1", image_name1);
		cv.put("country", country);
		cv.put("region", region);
		cv.put("area", area);
		cv.put("district", district); //Сельский округ и/или хозяйство
		cv.put("observer", observer);
		cv.put("date", date);
		cv.put("terrain", terrain);	
		cv.put("lat1", lat);
		cv.put("lon1", lon);
		cv.put("bio_hectare", bio_hectare);
		cv.put("bio_biotope_id", bio_biotope_id); 
		cv.put("bio_greenery_id", bio_greenery_id);
		cv.put("bio_greenery_cover_id", bio_greenery_cover_id);
		cv.put("bio_temperature", bio_temperature);
		cv.put("bio_wind", bio_wind); 
		cv.put("locust_have", locust_have);
		cv.put("locust_populated", locust_populated);
		cv.put("eggs_capsules_area",eggs_capsules_area);
		cv.put("eggs_capsules_density",eggs_capsules_density); 
		cv.put("eggs_capsules",eggs_capsules);
		cv.put("eggs_Live",eggs_Live);
		cv.put("eggs_enemies",eggs_enemies);
		cv.put("larva_born_id", larva_born_id);
		cv.put("larva_age_id", larva_age_id);
		cv.put("larva_painting_id", larva_painting_id);
		cv.put("larva_behavior_id", larva_behavior_id);
		cv.put("larva_density", larva_density);
		cv.put("kuliguli_age_id", kuliguli_age_id);
		cv.put("kuliguli_density", kuliguli_density);
		cv.put("kuliguli_size", kuliguli_size);
		cv.put("kuliguli_count", kuliguli_count);
		cv.put("kuliguli_action_id", kuliguli_action_id);
		cv.put("imago_wing_id", imago_wing_id);
		cv.put("imago_maturity", imago_maturity);
		cv.put("imago_phase", imago_phase);
		cv.put("imago_action", imago_action);
		cv.put("imago_density", imago_density);
		cv.put("imago_copulation", imago_copulation);
		cv.put("imago_flying", imago_flying);
		cv.put("swarm_maturity", swarm_maturity);
		cv.put("swarm_density_id", swarm_density_id);
		cv.put("swarm_size", swarm_size);
		cv.put("swarm_count", swarm_count);
		cv.put("swarm_copulation", swarm_copulation);
		cv.put("swarm_flying", swarm_flying);
		cv.put("swarm_height_id", swarm_height_id);
		cv.put("description", description);

		if(!b) //Новая
		{
			SQLiteDatabase db = this.getWritableDatabase();
			db.beginTransaction(); //Вроде как защита от многопоточности (для сервиса)
			try {
				db.insert("frmlocust", null, cv);
				db.setTransactionSuccessful();
			} finally {
				db.endTransaction();
			}
			db.close();
		}else //Обновить запись
		{
			SQLiteDatabase db = this.getWritableDatabase();
			db.beginTransaction(); //Вроде как защита от многопоточности (для сервиса)
			try {
				db.update("frmlocust", cv, "id = ? or (id is null and date=?)", new String[] { String.valueOf(id), String.valueOf(date) });
				db.setTransactionSuccessful();
			} finally {
				db.endTransaction();
			}
			db.close();
		}
	}
*/

	//проверить в какой геозоне(районе) находится человек
	public int[] inPerimeter(float lon,float lat)
	{
		int result[]={0,0};
		SQLiteDatabase rdb = null;
		Cursor cursor = null;
		try {
			rdb = this.getReadableDatabase();

			cursor = rdb.rawQuery("select id,country_id,lon_max,name from CountriesRegions where del=0 and " + lon + ">lon_min and " + lon + "<lon_max and " + lat + ">lat_min and " + lat + "<lat_max order by area", null);
			if (cursor.moveToFirst()) {
				do {
					result[0] = cursor.getInt(cursor.getColumnIndex("country_id"));
					Log.i("CCALM", "Region name = " + cursor.getString(cursor.getColumnIndex("name")) + " id = " + cursor.getString(cursor.getColumnIndex("id")));
//String points="{ \"type\": \"Polygon\", \"coordinates\": [[";
					Point PHead0 = new Point();
					PHead0.x = lon;
					PHead0.y = lat;
					Point PTail0 = new Point();
					PTail0.x = cursor.getFloat(cursor.getColumnIndex("lon_max")) + 1;
					PTail0.y = lat;

					int resId = _context.getResources().getIdentifier("raw/region_" + cursor.getString(cursor.getColumnIndex("id")), null, _context.getPackageName());
					try {
						InputStream isRaw = null;
						isRaw = _context.getResources().openRawResource(resId);
						if (isRaw != null) {
							TCTable tbl = new TCTable("", 0);
							if (tbl.OpenTableH(isRaw)) {

								//Первая и конечная точка совпадают
								int cnt = 0; //Подсчитываю пересичения в право, если они не чётны то внутри иначе с наружи
								boolean first = true;
								Point PHead1 = new Point();
								Point PTail1 = new Point();

								while (tbl.ReadNextRecord()) {
									//points+="["+tbl.fields.get(0).getFloatVal()+", "+tbl.fields.get(1).getFloatVal()+"],";

									if (first) {
										PHead1.x = tbl.fields.get(0).getFloatVal();
										PHead1.y = tbl.fields.get(1).getFloatVal();
										first = false;
									} else {
										PTail1.x = tbl.fields.get(0).getFloatVal();
										PTail1.y = tbl.fields.get(1).getFloatVal();
										Point pnt = Tools.getCrossingLine2(PHead0, PTail0, PHead1, PTail1);
										if (pnt.x != 0 && pnt.y != 0) {
											cnt++;
										}
										PHead1.x = PTail1.x;
										PHead1.y = PTail1.y;
									}
								}
								//points+="]]}";
								//Log.i("CCALM", points);
								if (cnt % 2 != 0) {
									result[1] = cursor.getInt(cursor.getColumnIndex("id"));
									break;
								}
							}
						}
					} catch (IOException e) {
						Log.e("CCALM", "Error: ", e);
						//e.printStackTrace();
					}

				} while (cursor.moveToNext());
			}

		}finally{
			if(cursor != null) { cursor.close(); }
			if(rdb != null) { rdb.close(); }
		}
		return result;
	}
}
