Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Data Layer Implementation - Room #11

Merged
merged 2 commits into from
Dec 30, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions app/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,10 @@ dependencies {
implementation(libs.androidx.ui.graphics)
implementation(libs.androidx.ui.tooling.preview)
implementation(libs.androidx.material3)
implementation(libs.androidx.room.common)
implementation(libs.androidx.room.ktx)
implementation(libs.androidx.navigation.compose)

testImplementation(libs.junit)
androidTestImplementation(libs.androidx.junit)
androidTestImplementation(libs.androidx.espresso.core)
Expand Down
26 changes: 26 additions & 0 deletions app/src/main/java/com/example/estiaseek/data/EstiaSeekDatabase.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.example.estiaseek.data

import android.content.Context
import androidx.room.Database
import androidx.room.Room
import androidx.room.RoomDatabase

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

companion object {
@Volatile
private var Instance: EstiaSeekDatabase? = null

fun getDatabase(context: Context): EstiaSeekDatabase {
// if the Instance is not null, return it, otherwise create a new database instance.
return Instance ?: synchronized(this) {
Room.databaseBuilder(context, EstiaSeekDatabase::class.java, "estiaseek_database")
.fallbackToDestructiveMigration()
.build()
.also { Instance = it }
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package com.example.estiaseek.data

import kotlinx.coroutines.flow.Flow

class OfflineUsersRepository(private val userDao: UserDao) : UsersRepository {
override fun getAllUsersStream(): Flow<List<User>> = userDao.getAllUsers()

override fun getUserByIdStream(id: Int): Flow<User?> = userDao.getUserById(id)

override suspend fun insertUser(user: User) = userDao.insert(user)

override suspend fun deleteUser(user: User) = userDao.delete(user)

override suspend fun updateUser(user: User) = userDao.update(user)

override fun getUsersByExperience(experience: String): Flow<List<User>> = userDao.getUsersByExperience(experience)

override fun getUsersByLocation(location: String): Flow<List<User>> = userDao.getUsersByLocation(location)

override fun getUsersByJobTitle(jobTitle: String): Flow<List<User>> = userDao.getUsersByJobTitle(jobTitle)

override suspend fun updateExperience(id: Int, experience: String) = userDao.updateExperience(id, experience)

override suspend fun updateBio(id: Int, bio: String) = userDao.updateBio(id, bio)

override suspend fun updateLocation(id: Int, location: String) = userDao.updateLocation(id, location)

override suspend fun updateJobTitle(id: Int, jobTitle: String) = userDao.updateJobTitle(id, jobTitle)
}
25 changes: 25 additions & 0 deletions app/src/main/java/com/example/estiaseek/data/User.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.example.estiaseek.data

import androidx.room.ColumnInfo
import androidx.room.Entity
import androidx.room.PrimaryKey

@Entity(tableName = "users")
data class User(
@PrimaryKey(autoGenerate = true)
val id: Int = 0,
@ColumnInfo(name = "Name")
val name: String,
@ColumnInfo(name = "Email")
val email: String,
@ColumnInfo(name = "Password")
val password: String,
@ColumnInfo(name = "Bio")
val bio: String,
@ColumnInfo(name = "Experience")
val experience: String,
@ColumnInfo(name = "Location")
val location: String,
@ColumnInfo(name = "JobTitle")
val jobTitle: String
)
48 changes: 48 additions & 0 deletions app/src/main/java/com/example/estiaseek/data/UserDao.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.example.estiaseek.data

import androidx.room.Dao
import androidx.room.Delete
import androidx.room.Insert
import androidx.room.OnConflictStrategy
import androidx.room.Query
import androidx.room.Update
import kotlinx.coroutines.flow.Flow

@Dao
interface UserDao {
@Insert(onConflict = OnConflictStrategy.IGNORE)
suspend fun insert(user: User)

@Update
suspend fun update(user: User)

@Delete
suspend fun delete(user: User)

@Query("SELECT * FROM users ORDER BY name")
fun getAllUsers(): Flow<List<User>>

@Query("SELECT * FROM users WHERE id = :id")
fun getUserById(id: Int): Flow<User>

@Query("SELECT * FROM users WHERE experience = :experience")
fun getUsersByExperience(experience: String): Flow<List<User>>

@Query("SELECT * FROM users WHERE location = :location")
fun getUsersByLocation(location: String): Flow<List<User>>

@Query("SELECT * FROM users WHERE jobTitle = :jobTitle")
fun getUsersByJobTitle(jobTitle: String): Flow<List<User>>

@Query("UPDATE users SET bio = :bio WHERE id = :id")
suspend fun updateBio(id: Int, bio: String)

@Query("UPDATE users SET experience = :experience WHERE id = :id")
suspend fun updateExperience(id: Int, experience: String)

@Query("UPDATE users SET location = :location WHERE id = :id")
suspend fun updateLocation(id: Int, location: String)

@Query("UPDATE users SET jobTitle = :jobTitle WHERE id = :id")
suspend fun updateJobTitle(id: Int, jobTitle: String)
}
30 changes: 30 additions & 0 deletions app/src/main/java/com/example/estiaseek/data/UsersRepository.kt
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.example.estiaseek.data

import kotlinx.coroutines.flow.Flow

interface UsersRepository {

fun getAllUsersStream(): Flow<List<User>>

fun getUserByIdStream(id: Int): Flow<User?>

suspend fun insertUser(user: User)

suspend fun deleteUser(user: User)

suspend fun updateUser(user: User)

fun getUsersByExperience(experience: String): Flow<List<User>>

fun getUsersByLocation(location: String): Flow<List<User>>

fun getUsersByJobTitle(jobTitle: String): Flow<List<User>>

suspend fun updateExperience(id: Int, experience: String)

suspend fun updateBio(id: Int, bio: String)

suspend fun updateLocation(id: Int, location: String)

suspend fun updateJobTitle(id: Int, jobTitle: String)
}
9 changes: 7 additions & 2 deletions gradle/libs.versions.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,11 @@ espressoCore = "3.6.1"
lifecycleRuntimeKtx = "2.8.7"
activityCompose = "1.9.3"
composeBom = "2023.08.00"
roomCommon = "2.6.1"
roomKtx = "2.6.1"
navigationCompose = "2.8.5"


[libraries]
androidx-core-ktx = { group = "androidx.core", name = "core-ktx", version.ref = "coreKtx" }
junit = { group = "junit", name = "junit", version.ref = "junit" }
Expand All @@ -25,9 +28,11 @@ androidx-ui-tooling-preview = { group = "androidx.compose.ui", name = "ui-toolin
androidx-ui-test-manifest = { group = "androidx.compose.ui", name = "ui-test-manifest" }
androidx-ui-test-junit4 = { group = "androidx.compose.ui", name = "ui-test-junit4" }
androidx-material3 = { group = "androidx.compose.material3", name = "material3" }
androidx-room-common = { group = "androidx.room", name = "room-common", version.ref = "roomCommon" }
androidx-room-ktx = { group = "androidx.room", name = "room-ktx", version.ref = "roomKtx" }
androidx-navigation-compose = { group = "androidx.navigation", name = "navigation-compose", version.ref = "navigationCompose" }


[plugins]
androidApplication = { id = "com.android.application", version.ref = "agp" }
jetbrainsKotlinAndroid = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }

jetbrainsKotlinAndroid = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
Loading