一个 PropertyDatabase 视图的接口。
一个 PropertyDatabase 视图的概念类似于 Windows 的内存映射文件视图,尽管简单许多。每个 PropertyDatabase 视图都有自己的文件流,它可以独立于其他视图来访问 PropertyDatabase。一个 PropertyDatabase 的视图是同步的,因此允许并发访问。然而,为了让并发访问正常工作,每个线程必须自己具有一个视图的实例。
在 PropertyDatabase 类中可用的所有操作都在视图本身中可用。直接在 PropertyDatabase 实例上操作时,将创建一个内部视图以处理所有同步。由于我们处理的是文件,因此打开一个视图的成本不可忽略。因此,建议打开一个视图,并在丢弃它之前尽可能长时间使用它。
using System.Collections.Generic; using NUnit.Framework; using UnityEditor; using UnityEditor.Search; using UnityEngine; static class Example_IPropertyDatabaseView { // Where the property database will be written. const string propertyDatabaseFilePath = "Temp/test_ipropertydatabaseview_db"; static PropertyDatabase propertyDatabase; static void InitializePropertyDatabase() { // Setup the property database. We configure it with automatic flushing so the file store // will be updated automatically after an update. propertyDatabase = new PropertyDatabase(propertyDatabaseFilePath, true); } static void ClearPropertyDatabase() { propertyDatabase.Clear(); propertyDatabase.Dispose(); } static PropertyDatabaseRecordKey GetPropertyKey(int id, IPropertyDatabaseView view) { return view.CreateRecordKey((ulong)id / 100, view.CreatePropertyHash((id % 100).ToString())); } static object LoadPropertyValue(int id, IPropertyDatabaseView view) { var recordKey = GetPropertyKey(id, view); if (view.TryLoad(recordKey, out object value)) return value; // Fetch the value with the time consuming operation and store it for future // accesses. value = id.ToString(); view.Store(recordKey, value); return value; } [MenuItem("Examples/IPropertyDatabaseView/Interface")] public static void RunExample() { InitializePropertyDatabase(); if (!propertyDatabase.valid) { Debug.LogFormat(LogType.Error, LogOption.NoStacktrace, null, $"PropertyDatabase \"{propertyDatabase.filePath}\" failed to open properly."); return; } // Doing a change on the property database internally opens a view on the actual data, // which is non negligible. Therefore, it is advised to open a view once and use it as much as you // can. // Note: when doing concurrent accesses to the property database, each thread must have its own // view instance. var allValues = new Dictionary<int, object>(); using (var view = propertyDatabase.GetView()) { for (var i = 0; i < 1000; ++i) { var value = LoadPropertyValue(i, view); allValues.Add(i, value); } } // Validate everything is in the database using (var view = propertyDatabase.GetView()) { for (var i = 0; i < 1000; ++i) { var key = GetPropertyKey(i, view); if (!view.TryLoad(key, out object value)) Assert.Fail("Record should be in the database."); Assert.AreEqual(i.ToString(), value); } } ClearPropertyDatabase(); } }
清除 | 清除 PropertyDatabase 的全部内容。 |
创建文档密钥 | 从文档标识符中创建一个文档密钥。 |
创建属性哈希 | 从属性路径中创建一个属性哈希。 |
创建记录密钥 | 从文档标识符和属性路径中创建一个记录密钥。 |
枚举全部 | 枚举存储在 PropertyDatabase 中的所有记录 |
从记录中获取值 | 将一个记录值反序列化为其正确类型。 |
使无效 | 使单个属性记录无效,使其不再可检索。 |
使掩码无效 | 使存储在多个文档中且与文档密钥掩码相匹配的所有属性无效。 |
是否是可持久化类型 | 返回一个布尔值,表明一种类型是否可以持久化到备份文件中。 |
存储 | 存储一个文档属性。 |
同步 | 同步视图,使它们具有对相同内容的访问权限。 |
尝试加载 | 加载一个单个属性,已反序列化为一个对象。 |