advanced
40 min

DataStore & Saving Data

Learn how to save and load player data persistently.

DataStoreServiceGetAsyncSetAsyncError Handling

1
Introduction to DataStore

DataStores let you save data that persists between game sessions.

Setting Up DataStore

local DataStoreService = game:GetService("DataStoreService")
local playerData = DataStoreService:GetDataStore("PlayerData")

-- Enable Studio testing (only for testing!)
-- Enable in Game Settings > Security > Enable Studio Access to API Services

DataStores must be enabled in Game Settings to work.

💡 Tips:

  • • Enable API Services in Game Settings for testing
  • • DataStores only work in published games or with Studio Access
  • • Never save data too frequently (rate limits apply)

2
Saving and Loading Data

Use GetAsync to load and SetAsync to save data.

Basic Save/Load

local DataStoreService = game:GetService("DataStoreService")
local playerData = DataStoreService:GetDataStore("PlayerData")

-- Load data
local function loadData(player)
  local userId = player.UserId
  local data
  
  local success, err = pcall(function()
    data = playerData:GetAsync(userId)
  end)
  
  if success then
    return data or {Coins = 0, Level = 1}  -- Default data
  else
    warn("Error loading data: " .. err)
    return {Coins = 0, Level = 1}
  end
end

-- Save data
local function saveData(player, data)
  local userId = player.UserId
  
  local success, err = pcall(function()
    playerData:SetAsync(userId, data)
  end)
  
  if success then
    print("Data saved successfully!")
  else
    warn("Error saving data: " .. err)
  end
end

Always use pcall() to handle DataStore errors gracefully.

3
Complete Save System

Implement a full save system with auto-save.

Full Implementation

local Players = game:GetService("Players")
local DataStoreService = game:GetService("DataStoreService")
local dataStore = DataStoreService:GetDataStore("PlayerData")

local playerData = {}

Players.PlayerAdded:Connect(function(player)
  -- Load data
  local data = loadData(player)
  playerData[player.UserId] = data
  
  -- Create leaderstats
  local leaderstats = Instance.new("Folder")
  leaderstats.Name = "leaderstats"
  leaderstats.Parent = player
  
  local coins = Instance.new("IntValue")
  coins.Name = "Coins"
  coins.Value = data.Coins
  coins.Parent = leaderstats
end)

Players.PlayerRemoving:Connect(function(player)
  -- Save on leave
  local data = playerData[player.UserId]
  if data then
    data.Coins = player.leaderstats.Coins.Value
    saveData(player, data)
  end
end)

Load data when player joins, save when they leave.

💡 Tips:

  • • Always save data when players leave
  • • Consider auto-saving every few minutes
  • • Use UpdateAsync() for complex data updates
  • • Never save during BindToClose in Studio (causes issues)

Practice Exercises

Exercise 1: Simple Save System

Create a system that saves and loads player coins.

Starter Code:

local DataStoreService = game:GetService("DataStoreService")
local Players = game:GetService("Players")

-- Create your save system
Show Solution
local DataStoreService = game:GetService("DataStoreService")
local Players = game:GetService("Players")
local coinStore = DataStoreService:GetDataStore("Coins")

Players.PlayerAdded:Connect(function(player)
  local coins = coinStore:GetAsync(player.UserId) or 0
  
  local leaderstats = Instance.new("Folder")
  leaderstats.Name = "leaderstats"
  leaderstats.Parent = player
  
  local coinsValue = Instance.new("IntValue")
  coinsValue.Name = "Coins"
  coinsValue.Value = coins
  coinsValue.Parent = leaderstats
end)

Players.PlayerRemoving:Connect(function(player)
  coinStore:SetAsync(player.UserId, player.leaderstats.Coins.Value)
end)

Ready for more?

Continue your learning journey

Executors.Online - Your Roblox Developer Hub