Proje defteri / 2026
Personel Notes
Kotlin 2.0 ve Room veritabanı ile geliştirilmiş; ağ bağlantısı olmasa bile sıfır gecikmeyle çalışan ve reaktif veri akışına sahip offline-first Android uygulaması.
Proje Tanımı ve Mimari Yaklaşım
PersonelNoteKotlin, çevrimdışı öncelikli (Offline-First) prensiplere göre geliştirilmiş bir Android not ve görev takip uygulamasıdır.
Uygulamanın temel amacı, cihazın internete erişimi olmadığı durumlarda dahi kullanıcının not eklemesini, güncellemesini ve arama yapmasını gecikmesiz olarak sağlamaktır.
Arka Plan Senkronizasyonu (WorkManager)
Uygulama, ağ bağlantısı kurulduğunda yerel Room veritabanındaki bekleyen değişiklikleri uzak sunucuya aktarmak için Android WorkManager altyapısını kullanır.
Aşağıdaki kod parçası, projenin GenelSenkron.kt dosyasında yer alan periyodik arka plan senkronizasyon mantığını göstermektedir:
package com.example.personelnotekotlin.data
import android.content.Context
import androidx.work.ExistingPeriodicWorkPolicy
import androidx.work.PeriodicWorkRequestBuilder
import androidx.work.WorkManager
import java.util.concurrent.TimeUnit
object GenelSenkron {
suspend fun senkronizeEt(context: Context) {
OturumYoneticisi.oturumYukle(context)
if (OturumYoneticisi.tokenGetir().isEmpty()) return
val database = databaseyiGetir(context)
val kategoriRepository = KategoriRepository(database.kategoriDao())
kategoriRepository.tamSenkronizasyonYap()
val notRepository = NotRepository(database.notDao())
notRepository.tamSenkronizasyonYap()
}
fun arkaPlanSenkronBaslat(context: Context) {
val periodicRequest = PeriodicWorkRequestBuilder<SyncWorker>(
15, TimeUnit.MINUTES
).build()
WorkManager.getInstance(context).enqueueUniquePeriodicWork(
"ArkaPlanSenkronIsi",
ExistingPeriodicWorkPolicy.KEEP,
periodicRequest
)
}
}Reaktif Veri Katmanı (Room ve Flow)
Veritabanı işlemleri Room SQLite katmanı üzerinden yürütülür. Notların listelenmesi sırasında Kotlin Coroutines Flow kullanılarak UI katmanına reaktif veri sağlanır:
@Dao
interface NoteDao {
@Query("SELECT * FROM notes ORDER BY updatedAt DESC")
fun getAllNotesFlow(): Flow<List<NoteEntity>>
@Insert(onConflict = OnConflictStrategy.REPLACE)
suspend fun insertOrUpdate(note: NoteEntity): Long
@Delete
suspend fun deleteNote(note: NoteEntity)
}Alternatif Sürüm: Node-RED ve MongoDB
Bu uygulamanın mobil sürümünün yanı sıra, kişisel veri akışlarının IoT ve düşük kodlu (low-code) platformlarda yönetilmesi amacıyla PersonelNotes adıyla Node-RED ve MongoDB tabanlı bir versiyonu da kurgulanmıştır.