Wprowadzenie

KitsuneDB to nowoczesna biblioteka ORM dla Androida, która eliminuje boilerplate związany z bazami danych SQLite. Inspirowana filozofią RedBeanPHP, oferuje podejście "zero konfiguracji" - zacznij pisać kod, a baza danych sama dostosuje się do Twoich potrzeb.

💡
Główna filozofia: W trybie FLUID (development) tabele, kolumny i indeksy są tworzone automatycznie. Przed release wygeneruj schemat jednym kliknięciem i przełącz na tryb FROZEN (production).

Kluczowe cechy

🔄

Dynamiczne tabele

Tryb FLUID automatycznie tworzy i modyfikuje schemat bazy. Dodajesz pole? Tabela się rozszerza.

🫘

Beans

Dynamiczne obiekty bez konieczności definiowania klas. Elastyczny kontener na dane.

🔗

Relacje

One-to-many, many-to-many, parent-child bez pisania JOINów.

📦

TypedBean

Mapowanie na Kotlin data class gdy potrzebujesz type-safety.

🚀

Auto-Migration

Automatyczne migracje struktury przy update aplikacji.

📡

Observers & Flow

Reaktywne obserwowanie zmian z Kotlin Flow i LiveData.

🔎

Full-Text Search

Wyszukiwanie pełnotekstowe z wagami i podświetlaniem.

🔐

Encryption

Szyfrowanie AES-256 dla wrażliwych danych.

Szybki przykład

// Inicjalizacja
KDB.setup(context, "my_database", KDB.Mode.FLUID)

// Tworzenie i zapisywanie
val user = KDB.dispense("user")
user["name"] = "Jan Kowalski"
user["email"] = "jan@example.com"
user["age"] = 30

val id = KDB.store(user)  // Tabela tworzona automatycznie!

// Odczyt
val loaded = KDB.load("user", id)
val adults = KDB.find("user", "age >= ?", 18)

// QueryBuilder
val users = KDB.query("user")
    .where("age >= ?", 18)
    .whereLike("email", "%@gmail.com")
    .orderByDesc("created_at")
    .limit(10)
    .find()

// Relacje
val author = KDB.dispense("author")
author["name"] = "George Orwell"
KDB.store(author)

val book = KDB.dispense("book")
book["title"] = "1984"
book.setParent(author)
KDB.store(book)

// Usuwanie
KDB.trash(user)

Pełna lista funkcjonalności

Core

Funkcja Opis
🔄 Dynamiczne tabeleAutomatyczne tworzenie i modyfikacja schematu w trybie FLUID
🫘 BeansDynamiczne obiekty reprezentujące rekordy
📝 CRUDstore, load, trash, find, findOne
🔗 Relacjeone-to-many, many-to-many, parent-child
🔍 QueryBuilderFluent API do zaawansowanych zapytań
📦 TypedBeanMapowanie na Kotlin data class
🔄 MigracjeAuto-migration + ręczne migracje danych
💼 TransakcjeWsparcie dla transakcji z rollback

Zaawansowane

Funkcja Opis
⏰ TimestampsAutomatyczne created_at i updated_at
🗑️ Soft DeleteMiękkie usuwanie z przywracaniem
✅ ValidatorsWalidacja danych przed zapisem
📋 Validation RulesDeklaratywne reguły walidacji
🪝 HooksCallbacki lifecycle (before/after)
💾 CacheCache'owanie z auto-invalidacją
📡 ObserversReaktywne obserwowanie z Kotlin Flow
🔍 ScopesPredefiniowane filtry

Enterprise

Funkcja Opis
🔎 Full-Text SearchFTS5 z wagami i fuzzy search
🔍 Smart SearchWyszukiwanie po wielu polach z rankingiem
🔐 EncryptionAES-256 dla wrażliwych danych
📝 JSON FieldsZłożone struktury w polach JSON
📜 Audit TrailHistoria zmian z rollback
🎭 Fuse (Models)Active Record z logiką biznesową
🎯 EventsEvent Sourcing
🧮 Computed FieldsPola wyliczane automatycznie

Narzędzia

Funkcja Opis
🗃️ RepositoryTypowane repozytoria
🏛️ DAO PatternInterfejsy jak w Room
📱 LiveDataAndroid LiveData support
🧹 Data SeederDane testowe z Faker
📊 Query ProfilerAnaliza wydajności, N+1
💾 Export/ImportBackup do JSON
🔒 RLSRow-Level Security (multi-tenant)
🏷️ TaggingUniwersalne tagowanie
📎 AttachmentsPliki powiązane z rekordami
⏱️ Job QueueZadania w tle
📈 Time SeriesDane czasowe z agregacjami
🌐 i18nWielojęzyczne pola

Następne kroki

📦

Instalacja

Dodaj KitsuneDB do swojego projektu Android

🚀

Szybki start

Pierwsze kroki z biblioteką

🫘

Beans

Poznaj podstawowy element biblioteki