K

How to Generate UUID in Kotlin

Android & Kotlin Multiplatform

Generate UUIDs in Kotlin using java.util.UUID for Android and JVM projects. Learn Room database integration, extension functions, and idiomatic Kotlin UUID patterns.

Generate UUID in Kotlin

UUID.randomUUID()
550e8400-e29b-41d4-a716-446655440000

Kotlin UUID Generation: Quick Start Guide

Android

Full support with java.util.UUID

KMP

Kotlin Multiplatform ready

Room DB

Native Room integration

Kotlin
import java.util.UUID

// Generate random UUID v4
val uuid = UUID.randomUUID()
println(uuid)  
// Output: 550e8400-e29b-41d4-a716-446655440000

// Get as string
val uuidString = uuid.toString()

// Generate list of UUIDs (Kotlin idiom)
val uuids = List(5) { UUID.randomUUID() }
uuids.forEach { println(it) }

Kotlin Extension Functions for UUID Operations

Create idiomatic Kotlin extensions for common UUID operations:

UUID Extensions

// Extension functions for UUID
fun String.toUUIDOrNull(): UUID? = runCatching {
    UUID.fromString(this)
}.getOrNull()

fun String.isValidUUID(): Boolean = 
    toUUIDOrNull() != null

// Usage examples
val valid = "550e8400-e29b-41d4-a716-446655440000"
val invalid = "not-a-uuid"

println(valid.isValidUUID())    // true
println(invalid.isValidUUID())  // false

val uuid = valid.toUUIDOrNull()  // UUID object or null

Android Room Database UUID Integration

Entity with UUID Primary Key

import androidx.room.Entity
import androidx.room.PrimaryKey
import java.util.UUID

@Entity(tableName = "users")
data class User(
    @PrimaryKey
    val id: String = UUID.randomUUID().toString(),
    val name: String,
    val email: String,
    val createdAt: Long = System.currentTimeMillis()
)

TypeConverter for UUID Objects

import androidx.room.TypeConverter
import java.util.UUID

class UUIDConverter {
    @TypeConverter
    fun fromUUID(uuid: UUID?): String? = uuid?.toString()
    
    @TypeConverter
    fun toUUID(value: String?): UUID? = value?.let { 
        runCatching { UUID.fromString(it) }.getOrNull()
    }
}

// Usage in Entity
@Entity
data class Product(
    @PrimaryKey
    val id: UUID = UUID.randomUUID(),
    val name: String
)

DAO with UUID Queries

import androidx.room.*
import kotlinx.coroutines.flow.Flow

@Dao
interface UserDao {
    @Insert
    suspend fun insert(user: User)
    
    @Query("SELECT * FROM users WHERE id = :userId")
    suspend fun getUserById(userId: String): User?
    
    @Query("SELECT * FROM users")
    fun getAllUsers(): Flow>
    
    @Delete
    suspend fun delete(user: User)
}

Kotlin Data Class with UUID Factory

Kotlin Data Class
import java.util.UUID

data class Task(
    val id: UUID = UUID.randomUUID(),
    val title: String,
    val description: String = "",
    val completed: Boolean = false,
    val createdAt: Long = System.currentTimeMillis()
) {
    companion object {
        fun create(title: String, description: String = ""): Task {
            return Task(
                title = title,
                description = description
            )
        }
    }
}

// Usage
val task1 = Task.create("Buy groceries", "Milk, eggs, bread")
val task2 = Task(title = "Call dentist")

println(task1.id)  // Auto-generated UUID
println(task2.id)  // Different UUID

Comparison: UUID vs Other ID Strategies

Strategy Pros Cons Best For
UUID Globally unique, no conflicts 36 chars, not sortable Distributed systems
Auto-increment Short, sortable Sequential, conflicts Single database
ULID Sortable, unique Needs library Time-ordered data
Timestamp Sortable, readable Not unique Logging only

ViewModel UUID State Management

TaskViewModel.kt
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import kotlinx.coroutines.flow.*
import kotlinx.coroutines.launch
import java.util.UUID

class TaskViewModel(
    private val repository: TaskRepository
) : ViewModel() {
    
    private val _tasks = MutableStateFlow>(emptyList())
    val tasks: StateFlow> = _tasks.asStateFlow()
    
    fun addTask(title: String, description: String) {
        val task = Task(
            id = UUID.randomUUID(),
            title = title,
            description = description
        )
        
        viewModelScope.launch {
            repository.insert(task)
            loadTasks()
        }
    }
    
    fun getTaskById(id: UUID): Task? {
        return _tasks.value.find { it.id == id }
    }
    
    fun deleteTask(taskId: UUID) {
        viewModelScope.launch {
            _tasks.value.find { it.id == taskId }?.let {
                repository.delete(it)
                loadTasks()
            }
        }
    }
    
    private fun loadTasks() {
        viewModelScope.launch {
            repository.getAllTasks().collect {
                _tasks.value = it
            }
        }
    }
}

Compose UI with UUID Keys

TaskListScreen.kt
@Composable
fun TaskListScreen(
    viewModel: TaskViewModel = viewModel()
) {
    val tasks by viewModel.tasks.collectAsState()
    
    LazyColumn {
        items(
            items = tasks,
            key = { task -> task.id.toString() }  // UUID as key
        ) { task ->
            TaskItem(
                task = task,
                onDelete = { viewModel.deleteTask(task.id) }
            )
        }
    }
}

@Composable
fun TaskItem(
    task: Task,
    onDelete: () -> Unit
) {
    Card(
        modifier = Modifier
            .fillMaxWidth()
            .padding(8.dp)
    ) {
        Row(
            modifier = Modifier.padding(16.dp),
            horizontalArrangement = Arrangement.SpaceBetween
        ) {
            Column {
                Text(text = task.title, style = MaterialTheme.typography.titleMedium)
                Text(text = task.id.toString().take(8), style = MaterialTheme.typography.bodySmall)
            }
            IconButton(onClick = onDelete) {
                Icon(Icons.Default.Delete, contentDescription = "Delete")
            }
        }
    }
}

Related Programming Language UUID Guides

Comments & Feedback

Share your experience or ask questions about this tool

Copied!