Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥3🤯1👀1👾1
Для сохранения уникальной информации для каждого элемента в реляционной таблице используются уникальные ключи и различные типы ограничений. В реляционных базах данных уникальные ключи обеспечивают уникальность данных в столбцах, предотвращая дублирование.
Первичный ключ уникально идентифицирует каждую строку в таблице. Таблица может иметь только один первичный ключ, состоящий из одного или нескольких столбцов.
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
name VARCHAR(100),
department_id INT
);
Уникальные ограничения гарантируют, что значения в одном или нескольких столбцах будут уникальными.
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
email VARCHAR(100) UNIQUE,
name VARCHAR(100),
department_id INT
);
Автоинкрементирование используется для автоматической генерации уникальных значений для столбца. Обычно используется для первичных ключей.
CREATE TABLE employees (
employee_id INT AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(100),
department_id INT
);
Индексы помогают ускорить поиск и обеспечивают уникальность данных в столбцах, когда используется уникальный индекс.
CREATE TABLE employees (
employee_id INT PRIMARY KEY,
name VARCHAR(100),
department_id INT
);
CREATE UNIQUE INDEX idx_email ON employees(email);
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Виртуальные таблицы, такие как те, что используются в SQLite с помощью
CREATE VIRTUAL TABLE, предлагают мощные возможности для работы с данными. Однако они также имеют некоторые недостатки. Виртуальные таблицы могут не поддерживать все стандартные функции и возможности SQL, такие как ограничения (constraints), триггеры и определенные типы индексов. Это связано с тем, что их функциональность определяется модулем, который реализует виртуальную таблицу.
CREATE VIRTUAL TABLE my_virtual_table USING fts4(content TEXT);
Виртуальные таблицы могут иметь производительность ниже, чем обычные таблицы, особенно если они не оптимизированы должным образом. Производительность может пострадать из-за дополнительных накладных расходов, связанных с обработкой виртуальных таблиц на уровне приложения или расширений.
Использование виртуальных таблиц требует дополнительных знаний и опыта в разработке и обслуживании. Например, вам может потребоваться написать и поддерживать специализированные модули или расширения для реализации виртуальных таблиц, что увеличивает сложность кода и потенциальные затраты на поддержку.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥4
На текущем месте работы количество разработчиков моего уровня может варьироваться в зависимости от конкретной организации и структуры команды. Обычно команды разработчиков включают специалистов разных уровней, таких как Junior, Middle и Senior, чтобы обеспечить эффективное распределение задач и наставничество.
Если говорить о типичных сценариях, то в среднем команда разработки может включать от 2 до 5 разработчиков одного уровня, особенно в крупных проектах или компаниях с большим штатом сотрудников. В небольших компаниях или стартапах это число может быть меньше, а иногда и только один разработчик каждого уровня.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2😁1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2
Создание утилиты для библиотеки в Java включает несколько шагов: проектирование, реализацию, тестирование и документирование. Рассмотрим процесс создания утилиты на примере простой библиотеки для работы со строками.
Перед началом реализации необходимо определить функциональность, которую будет предоставлять утилита. Допустим, мы создаем библиотеку для работы со строками, включающую следующие функции:
Проверка, является ли строка палиндромом.
Обратный порядок символов в строке.
Подсчет количества слов в строке.
Создадим проект с простой структурой.
Создадим тесты для проверки функциональности утилиты.
Документирование кода помогает другим разработчикам понять, как использовать вашу библиотеку.
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
😁2👍1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5
Да, в Kotlin возможно получить
NullPointerException (NPE), несмотря на его сильную систему типов, которая стремится избежать null-значений. Kotlin делает много для предотвращения NullPointerException, но есть определенные случаи, когда NPE все еще может возникнуть.При вызове методов из Java, которые могут возвращать
null без соответствующей аннотации, Kotlin не может гарантировать отсутствие null.val list = java.util.ArrayList<String>()
list.add("Hello")
val size = list.size // Java-код, возвращающий потенциальный null
Оператор
!! явно указывает компилятору, что переменная не может быть null, но если она все же null, будет выброшено NullPointerException.val name: String? = null
val length = name!!.length // NPE если name == null
Переменные, помеченные как
lateinit, должны быть инициализированы перед использованием. Если переменная не была инициализирована и используется, будет выброшено UninitializedPropertyAccessException, что является подтипом RuntimeException.lateinit var name: String
fun initializeName() {
name = "Kotlin"
}
fun useName() {
println(name.length) // NPE если name не инициализирован
}
Статические инициализаторы могут быть источником
NullPointerException в случае неправильного порядка инициализации.object Example {
val name: String? = null
val length = name!!.length // NPE при инициализации объекта
}Kotlin-коррутины и потоки могут привести к NPE, если происходят необработанные исключения, особенно при работе с
ThreadLocal переменными.Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🤔1
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👍2
Для обеспечения безопасности при работе с Java-кодом в Kotlin можно применять несколько стратегий и подходов, которые помогут избежать
NullPointerException (NPE) и других потенциальных проблем. Использование аннотаций в Java-коде помогает Kotlin понять, какие значения могут быть
null, а какие — нет. Наиболее распространенные аннотации включают @Nullable и @NotNull.Java-код
import org.jetbrains.annotations.Nullable;
public class JavaExample {
@Nullable
public static String getNullableString() {
return null;
}
}
Kotlin-код
val result: String? = JavaExample.getNullableString()
result?.let {
println(it.length)
}
Безопасный вызов и оператор Элвиса помогают обрабатывать потенциально
null значения безопасно.val result: String? = JavaExample.getNullableString()
val length = result?.length ?: 0
println("Length: $length")
Перед использованием значений, полученных из Java-кода, можно проверять их на
null.val result: String? = JavaExample.getNullableString()
if (result != null) {
println(result.length)
} else {
println("Result is null")
}
Обработка исключений помогает избежать непредвиденных ситуаций, когда Java-код может бросить исключение.
try {
val result = JavaExample.getNullableString()
println(result!!.length)
} catch (e: NullPointerException) {
println("Caught a NullPointerException")
}Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤1
Anonymous Quiz
25%
httpClient.get()
9%
httpRequest.send()
46%
httpClient.request()
20%
httpRequest.execute()
Переменные по умолчанию не могут быть
null, что предотвращает NullPointerException.var a: String = "abc"
var b: String? = "abc"
b = null // Допустимо
Разделение на изменяемые и неизменяемые коллекции.
val list: List<String> = listOf("a", "b", "c") // Неизменяемый список
val mutableList: MutableList<String> = mutableListOf("a", "b", "c") // Изменяемый список Автоматическое создание методов
equals(), hashCode(), и toString().data class User(val name: String, val age: Int)
Автоматическое приведение типа после проверки с помощью
is.fun demo(x: Any) {
if (x is String) {
println(x.length)
}
} Упрощают обработку ограниченных иерархий классов.
sealed class Expr
data class Const(val number: Double) : Expr()
Kotlin автоматически определяет тип переменной.
val x = 10 // Int
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
2. Bundle: сохранение состояния через onSaveInstanceState() и восстановление в onCreate() или onViewStateRestored().
3. SharedPreferences: для сохранения небольших данных между запусками приложения.
4. Базы данных или файлы: для долгосрочного хранения больших объёмов данных.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1
Java: Все объекты могут быть
null, что приводит к NullPointerException.String s = null;
int length = s.length(); // NullPointerException
Kotlin: По умолчанию переменные не могут быть null. Для допуска null используется ?.
var s: String? = null
val length = s?.length // Вернет null, если s равно null
Java: Нет различия между изменяемыми и неизменяемыми коллекциями.
List<String> list = new ArrayList<>();
list.add("a");
Kotlin: Четкое разделение на изменяемые (
MutableList) и неизменяемые (List) коллекции.val immutableList: List<String> = listOf("a", "b", "c")
val mutableList: MutableList<String> = mutableListOf("a", "b", "c")Java: Нужно вручную переопределять equals(), hashCode(), и toString().
public class User {
private String name;
private int age;
// Конструктор, геттеры, сеттеры, equals(), hashCode(), toString()
}Kotlin: Автоматическая генерация этих методов.
data class User(val name: String, val age: Int)
Java: Необходимость явного указания типов.
int x = 10;
String s = "Hello";
Kotlin: Автоматическое выведение типов.
val x = 10 // Int
val s = "Hello" // String
Java: Необходимость явного приведения после проверки instanceof.
if (obj instanceof String) {
String s = (String) obj;
System.out.println(s.length());
}Kotlin: Автоматическое приведение типа после проверки is.
if (obj is String) {
println(obj.length) // obj приводится к String
}Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥1
Автоматически генерируют методы equals(), hashCode(), toString(), copy().
data class User(val name: String, val age: Int)
Ограничивают иерархию классов, обеспечивая безопасность при работе с альтернативами.
sealed class Expr
data class Const(val number: Double) : Expr()
data class Sum(val e1: Expr, val e2: Expr) : Expr()
Создают ограниченные множества констант.
enum class Direction {
NORTH, SOUTH, EAST, WEST
}Используют object для создания единственного экземпляра.
object Database {
fun connect() { /*...*/ }
} Позволяют определять члены, доступные без экземпляра класса.
class MyClass {
companion object {
fun create(): MyClass = MyClass()
}
}Обеспечивают легковесные типы без накладных расходов на уровень объекта.
inline class Password(val value: String)
Поддерживают передачу функций как параметров и их возврат.
fun performOperation(x: Int, y: Int, operation: (Int, Int) -> Int): Int {
return operation(x, y)
} Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2👍1
Для сохранения данных за пределами фрагмента в Android можно использовать несколько методов. Основные способы включают SharedPreferences, базы данных SQLite, Room, файлы и ViewModel с ViewModelFactory.
Используется для хранения небольших порций данных в виде пар "ключ-значение". Это удобно для хранения настроек пользователя или состояния приложения.
// Сохранение данных
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString("key", "value");
editor.apply();
// Чтение данных
SharedPreferences sharedPref = getActivity().getPreferences(Context.MODE_PRIVATE);
String value = sharedPref.getString("key", "default_value");
Это встроенная реляционная база данных, которая позволяет хранить структурированные данные. Для работы с ней используются SQL-запросы.
// Создание базы данных
SQLiteDatabase db = getActivity().openOrCreateDatabase("MyDatabase", Context.MODE_PRIVATE, null);
db.execSQL("CREATE TABLE IF NOT EXISTS myTable (id INTEGER PRIMARY KEY, name TEXT)");
// Вставка данных
ContentValues values = new ContentValues();
values.put("name", "value");
db.insert("myTable", null, values);
// Чтение данных
Cursor cursor = db.rawQuery("SELECT * FROM myTable", null);
if (cursor.moveToFirst()) {
String name = cursor.getString(cursor.getColumnIndex("name"));
}
cursor.close();
Это библиотека, которая упрощает работу с SQLite, предоставляя абстракцию в виде аннотаций и DAO (Data Access Objects).
// Entity
@Entity
public class User {
@PrimaryKey
public int uid;
@ColumnInfo(name = "first_name")
public String firstName;
@ColumnInfo(name = "last_name")
public String lastName;
}
// DAO
@Dao
public interface UserDao {
@Insert
void insert(User user);
@Query("SELECT * FROM user")
List<User> getAll();
}
// Database
@Database(entities = {User.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract UserDao userDao();
}
// Использование
AppDatabase db = Room.databaseBuilder(getApplicationContext(), AppDatabase.class, "database-name").build();
UserDao userDao = db.userDao();
User user = new User();
user.uid = 1;
user.firstName = "John";
user.lastName = "Doe";
userDao.insert(user);
List<User> users = userDao.getAll();
Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
•Это может случиться из-за циклических ссылок или неправильно управляемых ресурсов.
•Утечки памяти приводят к увеличению потребления памяти и ухудшению производительности приложения.
Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥1