En aquest tema, aprendrem com gestionar la comunicació de xarxa i l'emmagatzematge de dades en aplicacions Android utilitzant Kotlin. Aquestes habilitats són essencials per crear aplicacions que interactuen amb serveis web i emmagatzemen dades localment.

Continguts

  1. Introducció a la Xarxa en Android
  2. Realització de Peticions HTTP
  3. Gestió de Respostes HTTP
  4. Emmagatzematge de Dades amb SharedPreferences
  5. Emmagatzematge de Dades amb Bases de Dades SQLite
  6. Utilització de Room per a Bases de Dades

  1. Introducció a la Xarxa en Android

La comunicació de xarxa és una part fonamental de moltes aplicacions mòbils. En Android, podem utilitzar diverses biblioteques per realitzar peticions de xarxa, com ara HttpURLConnection, OkHttp, i Retrofit.

Conceptes Clau

  • Peticions HTTP: GET, POST, PUT, DELETE
  • JSON: Format comú per a l'intercanvi de dades
  • Biblioteques de Xarxa: HttpURLConnection, OkHttp, Retrofit

  1. Realització de Peticions HTTP

Exemple amb HttpURLConnection

import java.net.HttpURLConnection
import java.net.URL

fun makeGetRequest(url: String): String {
    val url = URL(url)
    val connection = url.openConnection() as HttpURLConnection
    connection.requestMethod = "GET"
    connection.connect()

    val responseCode = connection.responseCode
    if (responseCode == HttpURLConnection.HTTP_OK) {
        val inputStream = connection.inputStream
        return inputStream.bufferedReader().use { it.readText() }
    } else {
        throw Exception("HTTP error code: $responseCode")
    }
}

Exemple amb OkHttp

import okhttp3.OkHttpClient
import okhttp3.Request

fun makeGetRequestWithOkHttp(url: String): String {
    val client = OkHttpClient()
    val request = Request.Builder()
        .url(url)
        .build()

    client.newCall(request).execute().use { response ->
        if (!response.isSuccessful) throw IOException("Unexpected code $response")
        return response.body?.string() ?: ""
    }
}

  1. Gestió de Respostes HTTP

Parseig de JSON amb Gson

import com.google.gson.Gson

data class User(val id: Int, val name: String, val email: String)

fun parseJsonResponse(json: String): User {
    val gson = Gson()
    return gson.fromJson(json, User::class.java)
}

  1. Emmagatzematge de Dades amb SharedPreferences

Guardar i Recuperar Dades

import android.content.Context
import android.content.SharedPreferences

fun saveData(context: Context, key: String, value: String) {
    val sharedPreferences: SharedPreferences = context.getSharedPreferences("MyPrefs", Context.MODE_PRIVATE)
    val editor = sharedPreferences.edit()
    editor.putString(key, value)
    editor.apply()
}

fun getData(context: Context, key: String): String? {
    val sharedPreferences: SharedPreferences = context.getSharedPreferences("MyPrefs", Context.MODE_PRIVATE)
    return sharedPreferences.getString(key, null)
}

  1. Emmagatzematge de Dades amb Bases de Dades SQLite

Creació i Gestió d'una Base de Dades

import android.content.Context
import android.database.sqlite.SQLiteDatabase
import android.database.sqlite.SQLiteOpenHelper

class DatabaseHelper(context: Context) : SQLiteOpenHelper(context, DATABASE_NAME, null, DATABASE_VERSION) {

    override fun onCreate(db: SQLiteDatabase) {
        val createTable = "CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, email TEXT)"
        db.execSQL(createTable)
    }

    override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
        db.execSQL("DROP TABLE IF EXISTS users")
        onCreate(db)
    }

    companion object {
        private const val DATABASE_NAME = "app.db"
        private const val DATABASE_VERSION = 1
    }
}

  1. Utilització de Room per a Bases de Dades

Configuració de Room

import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase

@Database(entities = [User::class], version = 1)
abstract class AppDatabase : RoomDatabase() {
    abstract fun userDao(): UserDao
}

@Entity
data class User(
    @PrimaryKey val id: Int,
    val name: String,
    val email: String
)

@Dao
interface UserDao {
    @Query("SELECT * FROM user")
    fun getAll(): List<User>

    @Insert
    fun insertAll(vararg users: User)
}

Inicialització de la Base de Dades

val db = Room.databaseBuilder(
    applicationContext,
    AppDatabase::class.java, "database-name"
).build()

Exercicis Pràctics

  1. Realitzar una Petició GET: Utilitza HttpURLConnection o OkHttp per fer una petició GET a una API pública i mostrar la resposta en un TextView.
  2. Guardar i Recuperar Dades: Crea una aplicació que permeti als usuaris guardar i recuperar dades utilitzant SharedPreferences.
  3. Base de Dades amb Room: Crea una aplicació que utilitzi Room per emmagatzemar i recuperar informació d'usuaris.

Solucions

Exercici 1: Realitzar una Petició GET

// Implementació de la petició GET amb OkHttp
val response = makeGetRequestWithOkHttp("https://jsonplaceholder.typicode.com/users/1")
textView.text = response

Exercici 2: Guardar i Recuperar Dades

// Guardar dades
saveData(context, "username", "JohnDoe")

// Recuperar dades
val username = getData(context, "username")
textView.text = username

Exercici 3: Base de Dades amb Room

// Inserir dades
val userDao = db.userDao()
userDao.insertAll(User(1, "John Doe", "[email protected]"))

// Recuperar dades
val users = userDao.getAll()
textView.text = users.joinToString { it.name }

Conclusió

En aquesta secció, hem après com gestionar la comunicació de xarxa i l'emmagatzematge de dades en aplicacions Android utilitzant Kotlin. Hem explorat com realitzar peticions HTTP, parsejar respostes JSON, i emmagatzemar dades utilitzant SharedPreferences i bases de dades SQLite amb Room. Aquestes habilitats són fonamentals per desenvolupar aplicacions mòbils robustes i eficients.

© Copyright 2024. Tots els drets reservats