Scripting HelpersARCHIVE
A little piece of Roblox history. Preserved for everyone, one question at a time.Read about the archive →
COMMUNITY QUESTION

Help with simple DataStore error? Not saving data?

**My error: ** attempt to index local 'SavedData' (a number value)

Error is on line 15*

It's not saving data, most likely from the 1 error.

local PlayerData = game:GetService('DataStoreService'):GetDataStore('PlayerData')

game.Players.PlayerAdded:connect(function(Player)
	
	local Stats = Instance.new('Folder', Player)
	Stats.Name = 'Stats'
	
	local Coins = Instance.new('IntValue', Stats)
	Coins.Name = 'Coins'
	
	--//DataStore
	local Key = 'id-' ..Player.userId
	local SavedData = PlayerData:GetAsync(Key)
	if SavedData then
		Coins.Value = SavedData[1]
	else
		local DataToSave = {Coins.Value}
		PlayerData:SetAsync(Key, DataToSave)
	end
	
	Player.CharacterAdded:connect(function(Character)
		Character:WaitForChild("Animate"):remove()
	end)
end)

game.Players.PlayerRemoving:connect(function(Player)
	local Key = 'id-' ..Player.userId
	local SaveData = Player.Stats.Coins.Value
	PlayerData:SetAsync(Key, SaveData) 
end)

2 answers

Line 15 should be: Coins.Value = SavedData; so in all it should be:

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

game.Players.PlayerAdded:connect(function(player)
	local Stats = Instance.new("Folder", player);
	Stats.Name = "Stats";
	
	local Coins = Instance.new("IntValue", Stats);
	Coins.Name = "Coins";
	
	local Key = "user_" .. player.UserId;
	
	local SavedData = PlayerData:GetAsync(Key);
	
	if SavedData then
		Coins.Value = SavedData;
	else
		local Data = {Coins.Value};
		PlayerData:SetAsync(Key, Data);
	end
	
	player.CharacterAdded:connect(function(character)
		character:WaitForChild("Animate"):Destroy();
	end);
end);

game.Players.PlayerRemoving:connect(function(player)
	local Key = "user_" .. player.UserId;
	local Data = player.Stats.Coins.Value;
	PlayerData:SetAsync(Key, Data);
end);

1 comment

0

I watched a youtube tutorial on how to make this DataStore but Idk why they put "SavedData[1]"

The problem is that you are mixing the save types, in some places you save the data as a table and in others you just save it as a single value hence the error. As the data would be saved when a player leaves the game as a single value.

This example saves the data in a array and accesses it as a array:-

local PlayerData = game:GetService('DataStoreService'):GetDataStore('PlayerData')

-- it is best to make a variable of the key prefixes so you do not confuse them 
local keyPrefix = 'id-'

-- you could also make a function to return a key 

game.Players.PlayerAdded:connect(function(Player)

    local Stats = Instance.new('Folder', Player)
    Stats.Name = 'Stats'

    local Coins = Instance.new('IntValue', Stats)
    Coins.Name = 'Coins'

    local SavedData = PlayerData:GetAsync(keyPrefix .. Player.UserId) -- this should also be UserId
    if SavedData then
        Coins.Value = SavedData[1]
    else
        PlayerData:SetAsync(keyPrefix .. Player.UserId, {Coins.Value}) -- save as an array
    end

    Player.CharacterAdded:connect(function(Character)
        Character:WaitForChild("Animate"):Destroy() -- you should not be using remove as it is depricated
    end)
end)

game.Players.PlayerRemoving:connect(function(Player)
    PlayerData:SetAsync(keyPrefix .. Player.UserId, {Player.Stats.Coins.Value})  -- save as an array
end)

You will need remove the loading data part as this will error as you currently have a single value, you can also use a different key. I hope this helps.

This discussion is preserved as it was. New answers, comments, and votes are closed.