Заметки

  1. Запустите приложение на телефоне (версия API - 26 или выше)
  2. В Android Studio в меню выберите View > Tool Windows > App Inspection
  3. Внизу появился App Inspector. Активируйте там вкладку Database Inspector
  4. Выберите устройство и приложение

Если вы встретили ошибку “Not sure how to handle query method's return type (java.lang.Object). DELETE query methods must either return void or int” при описании запросов Room (Android Studio - kotlin), то скорее всего у delete запроса вы не уточнили возвращаемый тип.

Не правильно: 

@Delete
suspend fun delete(car: Car)

Решение - указать тип Int: 

@Delete
suspend fun delete(car: Car): Int

Если в Android Studio при попытке подключить room в build.gradle вы столкнулись с ошибкой  "A problem occurred evaluating project ':app'. > Could not find method kapt() for arguments", это достаточно просто решить. 

В этом же файле найдите раздел кода с плагинами (plugins) и добавьте туда строку “id 'kotlin-kapt'

An example: 

plugins {
id 'com.android.application'
id 'org.jetbrains.kotlin.android'
id 'kotlin-kapt'
}

Чтобы проверить, пересекаются ли два интервала между собой, можно воспользоваться данной функцией:

 function dateIntervalsOverlay(DateTime $firstStart, DateTime $firstEnd, DateTime $secondStart, DateTime $secondEnd): bool
{
$return = false;
if (($firstStart<= $secondEnd) and ($firstEnd>= $secondStart)) {
$return = true;
}
return $return;
}

Пример использования:

$d1s =  new DateTime('2022-09-01');
$d1e = new DateTime('2022-09-24');
$d2s = new DateTime('2022-09-22');
$d2e = new DateTime('2022-09-28');

$test = dateIntervalsOverlay($d1s, $d1e,$d2s, $d2e);
var_dump($test); // true

Другой пример:

$d1s =  new DateTime('2022-09-01');
$d1e = new DateTime('2022-09-15');
$d2s = new DateTime('2022-09-22');
$d2e = new DateTime('2022-09-28');

$test = dateIntervalsOverlay($d1s, $d1e,$d2s, $d2e);
var_dump($test); // false

Кратко: 

  • А - годен к военной службе, здоров.
  • Б - годен к военной службе с незначительными ограничениями.
  • В - ограниченно годен к военной службе. Освобождается от призыва в мирное время и не участвует в военных сборах.
  • Г - временно не годен к военной службе, отсрочка от службы из-за временных проблем со здоровьем или обучения в ВУЗе. 
  • Д - не годен к военной службе.

Чтобы сравнить 2 даты в PHP с использованием DateTime, достаточно просто использовать обычные математические операторы больше / меньше / равно (>, <, ==)

Пример: 

$date1 = new DateTime('2022-09-26 16:12:20');
$date2 = new DateTime('2022-01-11 10:13:30');
var_dump($date1 == $date2); //false
var_dump($date1 > $date2); // true
var_dump($date1 < $date2); // false

Проблема появляется, когда в элемент типа EditText пытаетесь записать обычную строку вместо Editable  

Пример ошибочного использования: 

 binding.myEdit.text = "12345"

Решение - записывать текст не напрямую, а используя метод setText

 binding.myEdit.setText("12345")

Если не использовать View Binding то пример будет выглядеть примерно так: 

val txt = findViewById (R.id.my_text) as EditText
txt.text = "12345" // ошибка
txt.setText("12345") //правильно

Если вы с толкнулись с такой ошибкой - все просто. Вы скопировали напрямую из урока название “ResultProfileBinding”, а вместо этого необходимо было преобразовать название вашего layout, которую используете. 

Пример: 

При использовании стандартного layout activity_main.xml вместо ResultProfileBinding нужно писать ActivityMainBinding (берутся все слова из заголовка layout  с большой буквы и без пробелов + в конце добавляется Binding).

Пример (Kotlin): 

class MainActivity : AppCompatActivity() {

private lateinit var binding: ActivityMainBinding

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = ActivityMainBinding.inflate(layoutInflater)
val view = binding.root
setContentView(view)
}


}

Чтобы включить View Binding в Android Studio, необходимо открыть файл build.gradle (module) - в разделе Gradle Scripts.

 В сгенерированном коде необходимо в блок android добавить следующий код: 

android {
buildFeatures {
viewBinding = true
}
}

Затем можно нажать на ссылку в правом верхнем углу Sync Now (или запустить проект). 

...

$newModel = $oldModel->replicate();
$newModel ->push(); // сохраняем в базу чтобы получить ID у модели

// чистим загруженные связи, чтобы далее вручную выбрать, какие именно хотим скопировать
$oldModel->relations = [];

// загружаем только те связи, которые хотите копировать
$oldModel->load('categories', 'parameters' );

foreach ($oldModel->getRelations() as $relationName => $values){
$newModel ->{$relationName}()->saveMany($values);
// saveMany подходит только для связи типа belongsToMany
}

 

Как альтернативную функцию, которая пересохраняет все типы связей можно попробовать такой вариант (но не на всех версиях Laravel срабатывает):

foreach ($oldModel->relations as $relationName => $values){
$newModel ->{$relationName}()->sync($values);
}

Для того, чтобы скопировать объект в Laravel, достаточно всего пары строк кода: 

$newModel = $oldModel->replicate();
$newModel ->push(); // сохраняем в базу

Возможно вам еще нужно будет отдельно сохранить все связи объекта, но это уже отдельная тема для разговора. 

Если необходимо с помощью JavaScript удалить текст, который в скобках, поможет это регулярное выражение:

textVar.replace(/ *\([^)]*\) */g, "");

Пример:

var myString = "This is test text (remove text)";
myString.replace(/ *\([^)]*\) */g, "");

Результат: 

"This is test text"

Если в WordPress вы встретились с ошибкой Fatal error: Call to undefined function qtrans_getLanguage() то для исправления этой ошибки сделайте следующее:

  1. Перейдите в файл, где она встречается
  2. Все функции с префиксом:
qtrans_ 

поменяйте на префикс:

qtranxf_

К примеру qtrans_getLanguage будет qtranxf_getLanguage

Сохраните файл. 

Дело в том, что Kotlin может обращаться к элементам XML напрямую. 

Допустим, у нас есть TextView:

<TextView
android:id="@+id/example"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Тестовый текст"
tools:layout_editor_absoluteX="200dp"
tools:layout_editor_absoluteY="595dp" />

По дефолту тут будет отображаться надпись “Тестовый текст”.

Мы хотим, чтобы при загрузке приложения текст автоматически поменялся на “Новый текст”. 

Это сделать просто: 

private var _binding: FragmentFirstBinding? = null
private val binding get() = _binding!!

override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentFirstBinding.inflate(inflater, container, false)
return binding.root
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)

binding.example.text = "Тестовый текст";
}

Если столкнулись с ошибкой INSTALL_FAILED_USER_RESTRICTED  на устройстве Redmi, необходимо выполнить несколько действий чтобы ее исправить:

В настройках для разработчика (Settings -> Additional Settings -> Developer options)

  1. Проверить, что включен режим отладки по USB (USB Debugging)
  2. Включить MIUI  оптимизацию (MIUI optimization)
  3. Включить установку приложений по USB (Install via USB)