Documentation is a work in progress — some pages may be incomplete.
Unify

Storage

Data persistence with Honey — pick a backend and start storing

Unify integrates with Honey, a Kotlin data framework that makes persisting data dead simple. Pick a backend, define your store, and start storing — no boilerplate.

Quick Start

import me.jordanfails.honey.DataHandler
import me.jordanfails.honey.DataStoreType
import me.jordanfails.honey.connection.dataFramework

// 1. Configure your backend
dataFramework {
    sqlite(path = "./data/honey.db")
}

// 2. Create a store
val playerStore = DataHandler.createStoreType<String, PlayerData>(DataStoreType.SQL) {
    it.id = "players"
}

// 3. Store data
val player = PlayerData(
    uuid = player.uniqueId.toString(),
    name = player.name,
    kills = 0,
    deaths = 0
)
playerStore.store(player.uuid, player)

// 4. Load it back
val loaded = playerStore.retrieve(player.uuid)
println("Loaded: ${loaded?.name} — ${loaded?.kills} kills")

Data Class

Any data class works. Honey uses Gson under the hood:

data class PlayerData(
    val uuid: String,
    var name: String,
    var kills: Int = 0,
    var deaths: Int = 0,
    var lastLogin: Long = System.currentTimeMillis()
)

Add @ExcludeFromPersistence to skip fields:

data class PlayerData(
    val uuid: String,
    var name: String,

    @ExcludeFromPersistence
    var transientCache: Map<String, Any> = emptyMap()
)

Store Operations

val store = DataHandler.createStoreType<String, PlayerData>(DataStoreType.SQL) {
    it.id = "players"
}

// Store (upsert)
store.store(player.uuid, player)

// Retrieve
val loaded = store.retrieve(player.uuid)  // returns PlayerData? or null

// Delete
store.delete(player.uuid)

// Check existence
val exists = store.exists(player.uuid)

// Get all keys
val allKeys = store.keys()  // Set<String>

Swapping Backends

Change one line to swap from flatfile to SQL — everything else stays the same:

// Before (flatfile)
dataFramework { }
val store = DataHandler.createStoreType<String, PlayerData>(DataStoreType.FLATFILE) { ... }

// After (SQL) — same store API
dataFramework { sqlite(path = "./data/honey.db") }
val store = DataHandler.createStoreType<String, PlayerData>(DataStoreType.SQL) { ... }

Lifecycle

override fun onEnable() {
    dataFramework {
        sqlite(path = File(dataFolder, "data.db").path)
    }
}

override fun onDisable() {
    DataHandler.closeAllConnections()
}

Backends

BackendBest ForPage
FlatfileSmall plugins, dev mode, zero configFlatfile
SQLRelational data, joins, most production useSQL
MongoDBDocument data, flexible schemas, high write throughputMongoDB
RedisCaching, sessions, pub/sub, real-time dataRedis

Dependencies

Add Honey to your build.gradle.kts:

dependencies {
    compileOnly("me.jordanfails:honey:1.0-SNAPSHOT")
}

Honey is bundled in Unify.jar, so you only need the compile-only dependency.

On this page