# 2021-03-01 | Android | Base de données | Room
###### tags: `kotlin` `android` `gobelins`
# Programmation multi thread
* Les instructions exécutées dans un programme sont dans 1 thread
* Généralement, les instructions s'éxecutent de manière séquentielle
* On peut éxecuter plusieurs instructions parallèlement dans un multi thread
## Exécution synchrone
Instructions éxecutées séquentiellement
## Exécution asynchrone
Instructions éxecutées en parallèle
## En android
### Thread principal
* Interface gérée par 1 thread (uiThread)
* Seule thread qui modifie les élements de la vue et les interactions à l'utilisateur
* Si 1 instruction bloque le thread, l'interface ne réagit plus
### Gestioin des threads
* La gestion des threads est de la responsabilité du développeur
* Android bloque certaines actions si elles s'éxecutent sur le thread principal
* Les opérations I/O ne sont pas autorisés sur le thread principal (BDD, Internet)
* Si les actions prennent plus de 1secondes, il ne faut pas le faire sur le thread principal
### Synchronisation des threads
* Android permet de mettre automatiquement à jour l'interface à la fin d'une opération d'un thread secondaire
* Requete http
* BDD
* Image from url
### Créer un thread
```kotlin=
Executors.newSingleThreadExecutor().execute {
// code
}
```
Le code ci-dessous permet de repasser la min au thread principal (le seule à avoir la main sur l'interface) :
```kotlin=
Executors.newSingleThreadExecutor().execute {
// code
runOnUiThread {
Toast.makeText(baseContext, "On main thread", Toast.LENGTH_SHORT).show()
}
}
```
# Architecture component (librairies d'architecture)
Ensemble de librairies permettant de structurer une application Android :
* Robuste
* Testable
* Maintenable
Permet de comprendre facilement l'application et son code :
* Bonnes pratiques
* Code propre
* Réutilisation
* Peu de dépendances
* Faciliter la maintenance
## Base de données
### Classes et entités
Ci dessous une classe :
```kotlin=
class Person {
val firstName: String
val lastName: String
}
```
Ci dessous une classe transformée en entité pour la bdd :
```kotlin=
@Entity
class Person {
@PrimaryKey (autogenerate = true)
val id: UUID
@ColumnInfo(name = "first_name")
val firstName: String?
@ColumnInfo(name = "last_name")
val lastName: String
}
```
Tout les champs doivent être public ou avoir un getter pour permettre à Room d'y accéder.
### Relations
// plus tard
link in andorid.com => reference/android/arch/persistence/room/package-summary