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
Python UUID Generation
JavaScript UUID Generation
Java UUID Generation
C# GUID Generation
PHP UUID Generation
Go UUID Generation
Node.js UUID Generation
TypeScript UUID
Rust UUID Generation
Ruby UUID Generation
Swift UUID Generation
Dart/Flutter UUID
Bash UUID Scripts
PowerShell UUID
C++ UUID Generation
Scala UUID Generation
R UUID Generation