Skip to content

Datenspeicherung

Marc Staebler edited this page Mar 25, 2026 · 3 revisions

Datenspeicherung

UserApps bieten zwei Arten von persistentem Speicher: App-Speicher für globale Daten und User-Speicher für nutzerspezifische Daten. Beide überstehen App-Neustarts und Server-Reboots.


AppPersistence – Globaler App-Speicher

Der App-Speicher ist für Daten, die app-weit gelten (z.B. Konfigurationen, Spielstände, Statistiken).

var appPersistence = KnuddelsServer.getPersistence();

Datentypen

Es gibt drei Datentypen: Strings, Numbers und Objects.

// Strings speichern und laden
appPersistence.setString('welcomeMessage', 'Willkommen im Channel!');
var msg = appPersistence.getString('welcomeMessage', 'Standardwert');

// Zahlen speichern und laden
appPersistence.setNumber('totalGames', 42);
var games = appPersistence.getNumber('totalGames', 0);  // 0 ist der Standardwert

// Zahlen atomisch erhöhen
appPersistence.addNumber('totalGames', 1);  // Erhöht um 1

// Objekte speichern und laden (werden als JSON serialisiert)
appPersistence.setObject('config', { maxPlayers: 10, roundTime: 60 });
var config = appPersistence.getObject('config', {});

Gespeicherte Keys auflisten

var alleStringKeys = appPersistence.getStringKeys();
var alleNumberKeys = appPersistence.getNumberKeys();
var alleObjectKeys = appPersistence.getObjectKeys();

// Mit Pattern filtern
var punkteKeys = appPersistence.getNumberKeys('punkte_*');

Daten löschen

appPersistence.deleteString('welcomeMessage');
appPersistence.deleteNumber('totalGames');
appPersistence.deleteObject('config');

AppPersistence-Dokumentation


UserPersistence – Pro-Nutzer-Speicher

Jeder Nutzer hat einen eigenen Speicherbereich. Ideal für Punkte, Einstellungen, Spielfortschritt usw.

// Innerhalb von var App = { ... };
onUserJoined: function(user) {
    var userPersistence = user.getPersistence();

    // Zahlen
    userPersistence.setNumber('points', 300);
    var points = userPersistence.getNumber('points', 0);

    // Strings
    userPersistence.setString('favColor', 'blau');
    var color = userPersistence.getString('favColor', 'rot');

    // Objekte
    userPersistence.setObject('inventory', { sword: 1, shield: 2 });
    var inventory = userPersistence.getObject('inventory', {});

    // Zahlen atomisch erhöhen
    userPersistence.addNumber('points', 10);
},

UserPersistence-Dokumentation


UserPersistenceNumbers – Sortierte Abfragen

Für Ranglisten und Highscores kannst du die numerischen User-Persistence-Werte sortiert abfragen:

// Top 10 Nutzer nach Punkten
var bestUsers = UserPersistenceNumbers.getSortedEntries('points', {
    ascending: false,  // Höchste zuerst
    count: 10
});

for (var i = 0; i < bestUsers.length; i++) {
    var entry = bestUsers[i];
    var user = entry.getUser();
    var position = entry.getPosition();  // 1-basiert
    var wert = entry.getValue();

    KnuddelsServer.getDefaultLogger().info(
        position + '. ' + user.getNick() + ': ' + wert + ' Punkte'
    );
}

// Rang eines bestimmten Nutzers
var rank = UserPersistenceNumbers.getRank('points', user, {
    ascending: false
});

UserPersistenceNumbers-Dokumentation


Praxisbeispiel: Highscore-System

// Servercode

// Punkte vergeben
function addPoints(user, amount) {
    user.getPersistence().addNumber('points', amount);
}

// Highscore an den Client senden
// Innerhalb von var App = { ... };
onEventReceived: function(user, type, data, appContentSession) {
    if (type === "getHighscore") {
        var bestUsers = UserPersistenceNumbers.getSortedEntries('points', {
            ascending: false,
            count: 99
        });

        var highscore = [];
        for (var u = 0; u < bestUsers.length; u++) {
            var entry = bestUsers[u];
            highscore.push({
                uid: entry.getUser().getUserId(),
                name: entry.getUser().getNick(),
                pos: entry.getPosition(),
                val: entry.getValue()
            });
        }

        var yourRank = UserPersistenceNumbers.getRank('points', user, {
            ascending: false
        });

        if (appContentSession) {
            appContentSession.sendEvent('highscore', {
                yourRank: yourRank,
                highscore: highscore
            });
        }
    }
},

Limits

  • Persistenzgröße: maximal 102.400 Zeichen pro Schlüssel
  • Die Gesamtgröße der Datenbank ist begrenzt. Überprüfe mit appPersistence.getDatabaseFileSize() und appPersistence.getDatabaseFileSizeLimit()
  • Speichere nur das Nötigste und räume alte Daten regelmäßig auf

API-Referenz


← Zurück zur Übersicht

Navigation

Einstieg

Kernkonzepte

Features

Tutorials

Referenz & Hilfe

Clone this wiki locally