3

GitHub - xxfast/KStore: A tiny Kotlin multiplatform library that assists in savi...

 1 year ago
source link: https://github.com/xxfast/KStore
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Store

A tiny Kotlin multiplatform library that assists in saving and restoring objects to and from disk using kotlinx.coroutines, kotlinx.serialisation and okio. Inspired by RxStore

Features

  • lock Read-write locks; with a mutex FIFO lock
  • floppy_disk In-memory caching; read once from disk and reuse
  • man_dancing Multiplatform!

Adding to your project

KStore is not yet published to Maven Central, but is available on sonatype snapshot repositories.

repositories {
  maven("https://s01.oss.sonatype.org/content/repositories/snapshots/")
}

Include the dependency in commonMain

sourceSets {
  val commonMain by getting {
    implementation("io.github.xxfast:kstore:0.1-SNAPSHOT")
  }
}

Usage

Given that you have a @Serializable model

@Serializable data class Pet(val name: String, val age: Int) // Any serializable
val mylo = Pet(name = "Mylo", age = 1)

Crate a store

val store: KStore<Pet> = storeOf("path/to/file")

For full configuration and platform instructions, see here

Get value

Get a value once

val mylo: Pet? = store.get()

Or observe for changes

val pets: Flow<Pet?> = store.updates

Set value

store.set(mylo)

Update a value

store.update { pet: Pet? ->
  pet?.copy(age = pet.age + 1)
}

Note: this maintains a single mutex lock transaction, unlike get() and a subsequent set()

Delete/Reset value

store.delete()

You can also reset a value back to its default (if set, see here)

store.reset()

Configurations

Everything you want is in the factory method

private val store: KStore<Pet> = storeOf(
  path = filePathTo("file.json"), // required
  default = null, // optional
  enableCache = true, // optional
  serializer = Json, // optional
)

Platform configurations

Getting a path to a file is different for each platform and you will need to define how this works for each platform

expect fun filePathTo(fileName: String): String

On Android

actual fun filePathTo(fileName: String): String = "${context.filesDir.path}/$fileName"

On iOS & other Apple platforms

actual fun filePathTo(fileName: String): String = "${NSHomeDirectory()}/$fileName"

On Desktop

This depends on where you want to save your files, but generally you should save your files in a user data directory. Here i'm using harawata's appdirs to get the platform specific app dir

actual fun filePathTo(fileName: String): String {
  // implementation("net.harawata:appdirs:1.2.1")
  val appDir: String = AppDirsFactory.getInstance().getUserDataDir(PACKAGE_NAME, VERSION, ORGANISATION)
  return "$appDir/$fileName"
}

On JS Browser

On NodeJS


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK