Penyimpanan Data

*Konten ini diterjemahkan menggunakan AI (Beta) dan mungkin mengandung kesalahan. Untuk melihat halaman ini dalam bahasa Inggris, klik di sini.

Class.DataStoreService memungkinkan Anda menyimpan data yang perlu bertahan di antara sesi, seperti item di inventaris pemain atau poin keterampilan. Data store konsisten per pengalaman, jadi tempat apa pun dalam pengalaman dapat mengakses dan mengubah data yang sama, termasuk tempat di berbagai server.

Jika Anda ingin menambahkan kontrol izin granular ke data store Anda dan mengaksesnya di luar server Studio atau Roblox, Anda dapat menggunakan Buka Cloud APIs untuk data store.

Untuk data sementara yang perlu Anda update atau akses secara teratur, gunakan toko memori.

Mengaktifkan Akses ke Studio

Secara default, pengalaman yang dipraktikkan di Studio tidak dapat mengakses toko data, jadi Anda harus terlebih dahulu mengaktifkannya. Mengakses toko data di Studio dapat berbahaya untuk pengalaman langsung karena Studio mengakses toko data yang sama seperti aplikasi klien. Untuk menghindari menulis ulang produksi data, jangan aktifkan pengaturan ini untuk pengalaman tes terpisah.

Untuk mengaktifkan akses Studio dalam pengalaman dipublikasikan :

  1. Pergi ke Beranda > Pengaturan Permainan > Keamanan .
  2. Aktifkan tombol Aktifkan Studio Akses ke API Services .
  3. Klik Simpan .

Mengakses Toko Data

Untuk mengakses penyimpanan data di dalam pengalaman:

  1. Tambahkan DataStoreService ke sisi server Script .
  2. Gunakan fungsi GetDataStore() dan spesifikasi nama toko data yang ingin Anda gunakan. Jika toko data tidak ada, Studio menciptakan satu ketika Anda menyimpan data pengalaman Anda untuk pertama kalinya.

local DataStoreService = game:GetService("DataStoreService")
local experienceStore = DataStoreService:GetDataStore("PlayerExperience")

Menciptakan Data

Sebuah toko data pada dasarnya adalah kamus, mirip dengan tabel Lua. Sebuah kunci unik mengindeks setiap nilai di toko data, seperti Player.UserId pengguna atau string yang disebut untuk promo pengalaman.

Kunci Data Pengguna Nilai
3125060850
35167597920
50530609278.000
Kunci Data Promo Nilai
Acara Spesial AktifPesta Musim Panas 2
Kode Promo AktifBONUS123
Dapat mengakses tempat pestabenar

Untuk membuat entri baru, panggil SetAsync() dengan nama kunci dan nilai.


local DataStoreService = game:GetService("DataStoreService")
local experienceStore = DataStoreService:GetDataStore("PlayerExperience")
local success, errorMessage = pcall(function()
experienceStore:SetAsync("User_1234", 50)
end)
if not success then
print(errorMessage)
end

Mengaktualisasi Data

Untuk mengubah nilai tersimpan di tokodata, panggil UpdateAsync() dengan nama pengunci entri dan fungsi panggilan yang mendefinisikan cara Anda ingin menyimpan entri. Panggilan ini mengambil nilai saat ini dan mengembalikan nilai baru berdasarkan logika yang Anda definisikan. Jika pangg


local DataStoreService = game:GetService("DataStoreService")
local nicknameStore = DataStoreService:GetDataStore("Nicknames")
local function makeNameUpper(currentName)
local nameUpper = string.upper(currentName)
return nameUpper
end
local success, updatedName = pcall(function()
return nicknameStore:UpdateAsync("User_1234", makeNameUpper)
end)
if success then
print("Uppercase Name:", updatedName)
end

Tetapkan vs Update

Gunakan set untuk memperbarui unittertentu dengan cepat. Fungsi SetAsync() :

  • Dapat menyebabkan ketidakkonsistenan data jika dua server mencoba untuk menetapkan kunci yang sama pada saat yang sama
  • Hanya menghitung batas tulis

Gunakan update untuk menangani upaya multi-server. Fungsi UpdateAsync() :

  • Membaca nilai kunci saat ini dari server yang terakhir diperbarui sebelum membuat perubahan apa pun
  • Lebih lambat karena membaca sebelum menulis
  • Menghitung terhadap batas baca dan tulis

Membaca Data

Untuk membaca nilai entri data, panggil GetAsync() dengan nama kunci entri.


local DataStoreService = game:GetService("DataStoreService")
local experienceStore = DataStoreService:GetDataStore("PlayerExperience")
local success, currentExperience = pcall(function()
return experienceStore:GetAsync("User_1234")
end)
if success then
print(currentExperience)
end

Meningkatkan Data

Untuk meningkatkan angka dalam penyimpanan data, panggil IncrementAsync() dengan nama kunci entri dan nomor untuk berapa banyak mengubah nilai. IncrementAsync() adalah fungsi kenyamanan yang memungkinkan Anda untuk menghind


local DataStoreService = game:GetService("DataStoreService")
local experienceStore = DataStoreService:GetDataStore("PlayerExperience")
local success, newExperience = pcall(function()
return experienceStore:IncrementAsync("Player_1234", 1)
end)
if success then
print(newExperience)
end

Menghapus Data

Untuk menghapus entri dan mengembalikan nilai yang terkait dengan kunci, panggil RemoveAsync() .


local DataStoreService = game:GetService("DataStoreService")
local nicknameStore = DataStoreService:GetDataStore("Nicknames")
local success, removedValue = pcall(function()
return nicknameStore:RemoveAsync("User_1234")
end)
if success then
print(removedValue)
end

Metode

Ada dua jenis metadata yang dikaitkan dengan kunci:

  • Definisi layanan : Metode data baca hanya, seperti waktu pembaruan terbaru dan waktu pembuatan. Setiap objek memiliki metode data yang didefinisikan.
  • Pengguna-definisi : Metode data khusus untuk tag dan kategorisasi. Didefinisikan menggunakan objek DataStoreSetOptions dan fungsi SetMetadata().

Untuk mengelola metadata, ekspansi SetAsync() , UpdateAsync() , GetAsync() , dan 1> Class.GlobalDataStore:IncrementAsync()|IncrementAsync()1> fungsi.

  • SetAsync() menerima argumen ketiga dan keempat yang opcional:

    • Tabel UserIds . Ini dapat membantu dengan konten hak milik dan pelacakan hak intelektual.

    • Sebuah objek DataStoreSetOptions, di mana Anda dapat mendefinisikan metadata khusus menggunakan fungsi SetMetadata().


      local DataStoreService = game:GetService("DataStoreService")
      local experienceStore = DataStoreService:GetDataStore("PlayerExperience")
      local setOptions = Instance.new("DataStoreSetOptions")
      setOptions:SetMetadata({["ExperienceElement"] = "Fire"})
      local success, errorMessage = pcall(function()
      experienceStore:SetAsync("User_1234", 50, {1234}, setOptions)
      end)
      if not success then
      print(errorMessage)
      end
  • GetAsync() , IncrementAsync() , dan RemoveAsync() mengembalikan nilai kedua dalam objek 0> Class.DataStoreKeyInfo0> . nilai kedua ini mengandung kedua prop dan fungsi yang

    • Fungsi GetUserIds() mengambil tabel dari UserIds yang Anda berikan kepada SetAsync().
    • Fungsi GetMetadata() mengambil metadata yang dibuat pengguna yang Anda berikan kepada SetAsync() melalui SetMetadata() .
    • Class.DataStoreKeyInfo.Version|Version properti mengambil versi kunci.
    • Class.DataStoreKeyInfo.CreatedTime|CreatedTime property mengambil waktu saat key dibuat, dibentuk sebagai jumlah milidetik sejak zaman era.
    • Class.DataStoreKeyInfo.UpdatedTime|UpdatedTime properti mengambil waktu terakhir ketika kunci diperbarui, dibentuk sebagai jumlah milidetik sejak zaman époc.

    local DataStoreService = game:GetService("DataStoreService")
    local experienceStore = DataStoreService:GetDataStore("PlayerExperience")
    local success, currentExperience, keyInfo = pcall(function()
    return experienceStore:GetAsync("User_1234")
    end)
    if success then
    print(currentExperience)
    print(keyInfo.Version)
    print(keyInfo.CreatedTime)
    print(keyInfo.UpdatedTime)
    print(keyInfo:GetUserIds())
    print(keyInfo:GetMetadata())
    end
  • Fungsi panggilan dari UpdateAsync() mengambil parameter tambahan dalam objek DataStoreKeyInfo yang menggambarkan keadaan kunci saat ini. Ini mengembalikan nilai yang diubah, kunci yang dikaitkan dengan UserIds , dan metrik unit.


    local DataStoreService = game:GetService("DataStoreService")
    local nicknameStore = DataStoreService:GetDataStore("Nicknames")
    local function makeNameUpper(currentName, keyInfo)
    local nameUpper = string.upper(currentName)
    local userIDs = keyInfo:GetUserIds()
    local metadata = keyInfo:GetMetadata()
    return nameUpper, userIDs, metadata
    end
    local success, updatedName, keyInfo = pcall(function()
    return nicknameStore:UpdateAsync("User_1234", makeNameUpper)
    end)
    if success then
    print(updatedName)
    print(keyInfo.Version)
    print(keyInfo.CreatedTime)
    print(keyInfo.UpdatedTime)
    print(keyInfo:GetUserIds())
    print(keyInfo:GetMetadata())
    end

Untuk batas ketika mendefinisikan metadata, lihat Batas Metode Data.

Toko Data yang Dipesan

Secara default, penyimpanan data tidak mengurutkan konten mereka. Jika Anda memerlukan mendapatkan data dalam cara yang diurutkan, seperti dalam statistik papan peringkat yang dipesan, panggil GetOrderedDataStore() alih-alih GetDataStore() .


local DataStoreService = game:GetService("DataStoreService")
local characterAgeStore = DataStoreService:GetOrderedDataStore("CharacterAges")

Toko data yang dipesan mendukung fungsi dasar yang sama seperti toko data default, plus fungsi GetSortedAsync() yang unik. Ini mengambil lebih dari satu sorting key berdasarkan perintah sorting tertentu, ukuran halaman, dan nilai minimum/maksimum.

Contoh berikut mengurutkan data karakter menjadi halaman dengan tiga entri, masing-masing dalam urutan menurun, lalu berulang melalui halaman dan menghasilkan setiap nama dan usia karakter.


local DataStoreService = game:GetService("DataStoreService")
local characterAgeStore = DataStoreService:GetOrderedDataStore("CharacterAges")
-- Menyimpan toko data yang dipesan
local characters = {
Mars = 19,
Janus = 20,
Diana = 18,
Venus = 25,
Neptune = 62
}
for char, age in characters do
local success, errorMessage = pcall(function()
characterAgeStore:SetAsync(char, age)
end)
if not success then
print(errorMessage)
end
end
-- Mengurutkan data dengan urutan turun ke halaman tiga entri masing-masing
local success, pages = pcall(function()
return characterAgeStore:GetSortedAsync(false, 3)
end)
if success then
while true do
-- Mendapatkan halaman saat ini (pertama)
local entries = pages:GetCurrentPage()
-- Melalui semua pasangan nilai kunci di halaman
for _, entry in entries do
print(entry.key .. " : " .. tostring(entry.value))
end
-- Memeriksa apakah halaman terakhir telah dicapai
if pages.IsFinished then
break
else
print("------")
-- Lewati ke halaman berikutnya
pages:AdvanceToNextPageAsync()
end
end
end