Saving and Retrieving Table via DataStore2

I used @Kampfkarren’s DataStore2 to save and load player’s arrest data in table, few keys combined using DataStore2.Combine.

The Economy and License data worked as well as I’ve intended, but the problem is I can’t really understand how to add and save the key and value in the retrieved table of Arrester, ArrestTime, and ArrestReason by using :GetTable of DataStore2.

I found several possible reasons why it wouldn’t load any data on Arresting GUI;

  • the default table itself is written incorrectly
  • failure during retrieving saved data table
  • failure during saving table
  • incorrectly written table which is meant to be saved as new data after being retrieved by :GetTable function
  • error made during turning table to an array using for do loop (refer script below)

Things which are not concern about the error; irrelevant

  • failure to send or receive RemoteEvent (tested with print())
  • misspelling (was checked multiple times, and script won’t output any errors)

Maybe you are curious about

Why don’t you use DataStore Editor Plugin to check if your data is saved correctly as you have intended?

But unfortunately, I do not own DataStore Editor plugin, and I am not the owner of the place itself; - hence I couldn’t check if value is saving correctly.

Script
```lua
local ServerScriptService = game:GetService("ServerScriptService")
local Players = game:GetService("Players")
local ReplicatedStorage = game:GetService("ReplicatedStorage")

local ArrestRemote = game:GetService("ReplicatedStorage").ArrestRemote

local DataStore2 = require(1936396537)

if not game:GetService("RunService"):IsStudio() then
	
	DataStore2.Combine("UserData", "Economy", "License", "Arrester", "ArrestTime", "ArrestReason", "LastArrestedTime", "Wanted")
	
	_G.UserData = {
		Economy = {
			["Cash"] = 1000,
			["Bank"] = 0 
		},
		License = {
			["DriverLicense"] = false,
			["BladeLicense"] = false,
			["LightFirearmLicense"] = false,
			["HeavyFirearmLicense"] = false
		},
		Arrester = {
		},
		ArrestTime = {
		},
		ArrestReason = {
		},
		LastArrestedTime = 0,
		Wanted = "Not Wanted"
	}
	
	Players.PlayerAdded:Connect(function(player)
		local EconomyData = DataStore2("Economy", player)
		local LicenseData = DataStore2("License", player)
		local ArresterData= DataStore2("Arrester", player)
		local ArrestTimeData = DataStore2("ArrestTime", player)
		local ArrestRecordData = DataStore2("ArrestReason", player)
		local LastArrestedTimeData = DataStore2("LastArrestedTime", player)
		local WantedLevelData = DataStore2("Wanted", player)
		
		player.CharacterAppearanceLoaded:Wait()
		
		local function UpdateEconomy()
			local getEconomyData = EconomyData:GetTable(_G.UserData.Economy)
			local getLicenseData = LicenseData:GetTable(_G.UserData.License)
			player.PlayerGui.MainUI.Information.Cash.Text = getEconomyData["Cash"]
			player.PlayerGui.MainUI.Information.Bank.Text =  getEconomyData["Bank"]
		end
		
		local function UpdateLicense()
			local getEconomyData = EconomyData:GetTable(_G.UserData.Economy)
			local getLicenseData = LicenseData:GetTable(_G.UserData.License)
			if getLicenseData["DriverLicense"] == false then
				player.PlayerGui.MainUI.Information.DriverLicense.BackgroundColor3 = Color3.fromRGB(211, 58, 58)
			elseif getLicenseData["DriverLicense"] == true then
				player.PlayerGui.MainUI.Information.DriverLicense.BackgroundColor3 = Color3.fromRGB(58, 211, 64)
			end
			if getLicenseData["BladeLicense"] == false then
				player.PlayerGui.MainUI.Information.BladeLicense.BackgroundColor3 = Color3.fromRGB(211, 58, 58)
			elseif getLicenseData["BladeLicense"] == true then
				player.PlayerGui.MainUI.Information.BladeLicense.BackgroundColor3 = Color3.fromRGB(58, 211, 64)
			end
			if getLicenseData["LightFirearmLicense"] == false then
				player.PlayerGui.MainUI.Information.LightFirearmLicense.BackgroundColor3 = Color3.fromRGB(211, 58, 58)
			elseif getLicenseData["LightFirearmLicense"] == true then
				player.PlayerGui.MainUI.Information.LightFirearmLicense.BackgroundColor3 = Color3.fromRGB(58, 211, 64)
			end
			if getLicenseData["HeavyFirearmLicense"] == false then
				player.PlayerGui.MainUI.Information.HeavyFirearmLicense.BackgroundColor3 = Color3.fromRGB(211, 58, 58)
			elseif getLicenseData["HeavyFirearmLicense"] == true then
				player.PlayerGui.MainUI.Information.HeavyFirearmLicense.BackgroundColor3 = Color3.fromRGB(58, 211, 64)
			end
		end
		
		UpdateEconomy()
		UpdateLicense()
		
		EconomyData:OnUpdate(UpdateEconomy)
		LicenseData:OnUpdate(UpdateLicense)
	end)
	
	local function tableToArray(Data, DefaultData)
		local Table = Data:GetTable(DefaultData)
		local Array = {}
		for k, v in pairs(Table) do
			table.insert(Table, {k, v})
		end
		return Array
	end
	
	ArrestRemote.OnServerEvent:Connect(function(player, state, raycastInstance, arrestingReason, arrestingTime)
		local ArrestUI = player.PlayerGui.ArrestUI
		local ArrestPopUp = player.PlayerGui.ArrestUI.ArrestPopUp
		local ArrestRecord = player.PlayerGui.ArrestUI.ArrestRecord
		
		if state == "ArrestUI" then
			local TargetPlayer = Players:GetPlayerFromCharacter(raycastInstance.Parent)
			local Array = tableToArray(DataStore2("ArrestReason", TargetPlayer), "ArrestReason")
			print(TargetPlayer.Name)
			ArrestUI.Main.ArrestPrior.Text = tostring(#Array)
			ArrestUI.Main.Wanted.Text = DataStore2("Wanted", player):Get(_G.UserData.Wanted)
			
		elseif state == "MakeArrest" then
			local TargetPlayer = Players:FindFirstChild(ArrestUI.Main.Username.Text)
			local ArresterArray = tableToArray(DataStore2("Arrester", TargetPlayer), _G.UserData.Arrester)
			local ArrestReasonArray = tableToArray(DataStore2("ArrestReason", TargetPlayer), _G.UserData.ArrestReason)
			local ArrestTimeArray = tableToArray(DataStore2("ArrestTime", TargetPlayer), _G.UserData.ArrestTime)
			local getArresterTable = {}
			DataStore2("Arrester", TargetPlayer):GetTable(_G.UserData.Arrester)
			local getArrestReasonTable = {}
			DataStore2("ArrestReason", TargetPlayer):GetTable(_G.UserData.ArrestReason)
			local getArrestTimeTable = {}
			DataStore2("ArrestTime", TargetPlayer):GetTable(_G.UserData.ArrestTime)
			
			print(TargetPlayer.Name)
			
			getArresterTable[tostring(#ArresterArray + 1)] = player.Name
			getArrestReasonTable[tostring(#ArrestReasonArray + 1)] = ArrestPopUp.Main.ArrestingReason.TextBox.Text
			getArrestTimeTable[tostring(#ArrestTimeArray + 1)] = ArrestPopUp.Main.ArrestingTime.TextBox.Text
			
			DataStore2("Arrester", TargetPlayer):Set(getArresterTable)
			DataStore2("ArrestReason", TargetPlayer):Set(getArrestReasonTable)
			DataStore2("ArrestTime", TargetPlayer):Set(getArrestTimeTable)
			
			DataStore2("LastArrestTime", TargetPlayer):Set(tonumber(ArrestPopUp.Main.ArrestingTime.TextBox.Text))
			
		elseif state == "ArrestRecordOpen" then
			local TargetPlayer = Players:FindFirstChild(ArrestUI.Main.Username.Text)
			local ArresterArray = tableToArray(DataStore2("Arrester", TargetPlayer), "Arrester")
			local ArrestReasonArray = tableToArray(DataStore2("ArrestReason", TargetPlayer), "ArrestReason")
			local ArrestTimeArray = tableToArray(DataStore2("ArrestTime", TargetPlayer), "ArrestTime")
			local getArresterTable = DataStore2("Arrester", TargetPlayer):GetTable(_G.UserData.Arrester)
			local getArrestReasonTable = DataStore2("ArrestReason", TargetPlayer):GetTable(_G.UserData.ArrestReason)
			local getArrestTimeTable = DataStore2("ArrestTime", TargetPlayer):GetTable(_G.UserData.ArrestTime)
			
			if #ArresterArray ~= 0 then
				ArrestRecord.Main.Page.Text = tostring(#ArresterArray)
				ArrestRecord.Main.Arrester.TextLabel.Text = getArresterTable[tostring(#ArresterArray)]
				ArrestRecord.Main.ArrestTime.TextLabel.Text = getArrestTimeTable[tostring(#ArrestTimeArray)]
				ArrestRecord.Main.ArrestReason.TextLabel.Text = getArrestReasonTable[tostring(#ArrestReasonArray)]
			end
		elseif state == "ArrestRecordNext" then
			local TargetPlayer = Players:FindFirstChild(ArrestUI.Main.Username.Text)
			local ArresterArray = tableToArray(DataStore2("Arrester", TargetPlayer), "Arrester")
			local ArrestReasonArray = tableToArray(DataStore2("ArrestReason", TargetPlayer), "ArrestReason")
			local ArrestTimeArray = tableToArray(DataStore2("ArrestTime", TargetPlayer), "ArrestTime")
			local getArresterTable = DataStore2("Arrester", TargetPlayer):GetTable(_G.UserData.Arrester)
			local getArrestReasonTable = DataStore2("ArrestReason", TargetPlayer):GetTable(_G.UserData.ArrestReason)
			local getArrestTimeTable = DataStore2("ArrestTime", TargetPlayer):GetTable(_G.UserData.ArrestTime)
			
			if #ArresterArray ~= 0 then
				if tonumber(ArrestRecord.Main.Page.Text) >= #ArresterArray then
					ArrestRecord.Main.Page.Text = "1"
					ArrestRecord.Main.Arrester.TextLabel.Text = getArresterTable["1"]
					ArrestRecord.Main.ArrestTime.TextLabel.Text = getArrestTimeTable["1"]
					ArrestRecord.Main.ArrestReason.TextLabel.Text = getArrestReasonTable["1"]
				elseif #ArresterArray > tonumber(ArrestRecord.Main.Page.Text) >= 1 then
					ArrestRecord.Main.Arrester.TextLabel.Text = getArresterTable[tostring(tonumber(ArrestRecord.Main.Page.Text) + 1)]
					ArrestRecord.Main.ArrestTime.TextLabel.Text = getArrestTimeTable[tostring(tonumber(ArrestRecord.Main.Page.Text) + 1)]
					ArrestRecord.Main.ArrestReason.TextLabel.Text = getArrestReasonTable[tostring(tonumber(ArrestRecord.Main.Page.Text) + 1)]
					ArrestRecord.Main.Page.Text = tostring(tonumber(ArrestRecord.Main.Page.Text) + 1)
				end
			end
		elseif state == "ArrestRecordPrevious" then
			local TargetPlayer = Players:FindFirstChild(ArrestUI.Main.Username.Text)
			local ArresterArray = tableToArray(DataStore2("Arrester", TargetPlayer), "Arrester")
			local ArrestReasonArray = tableToArray(DataStore2("ArrestReason", TargetPlayer), "ArrestReason")
			local ArrestTimeArray = tableToArray(DataStore2("ArrestTime", TargetPlayer), "ArrestTime")
			local getArresterTable = DataStore2("Arrester", TargetPlayer):GetTable(_G.UserData.Arrester)
			local getArrestReasonTable = DataStore2("ArrestReason", TargetPlayer):GetTable(_G.UserData.ArrestReason)
			local getArrestTimeTable = DataStore2("ArrestTime", TargetPlayer):GetTable(_G.UserData.ArrestTime)
			
			if #ArresterArray ~= 0 then
				if tonumber(ArrestRecord.Main.Page.Text) <= 1 then
					ArrestRecord.Main.Page.Text = tostring(#ArresterArray)
					ArrestRecord.Main.Arrester.TextLabel.Text = getArresterTable[tostring(#ArresterArray)]
					ArrestRecord.Main.ArrestTime.TextLabel.Text = getArrestTimeTable[tostring(#ArresterArray)]
					ArrestRecord.Main.ArrestReason.TextLabel.Text = getArrestReasonTable[tostring(#ArresterArray)]
				elseif #ArresterArray >= tonumber(ArrestRecord.Main.Page.Text) > 1 then
					ArrestRecord.Main.Arrester.TextLabel.Text = getArresterTable[tostring(tonumber(ArrestRecord.Main.Page.Text) - 1)]
					ArrestRecord.Main.ArrestTime.TextLabel.Text = getArrestTimeTable[tostring(tonumber(ArrestRecord.Main.Page.Text) - 1)]
					ArrestRecord.Main.ArrestReason.TextLabel.Text = getArrestReasonTable[tostring(tonumber(ArrestRecord.Main.Page.Text) - 1)]
					ArrestRecord.Main.Page.Text = tostring(tonumber(ArrestRecord.Main.Page.Text) - 1)
				end
			end
		end
	end)
	
end
```

I would heavily appreciate your help, solution and any suggestions, if you have any concern related to my issue, please do reply to this topic.

2 Likes