{"record":{"id":"68ebe378f64cce1d","repo":"EllanJiang/GameFramework","slug":"you-must-set-data-provider-helper-first","errorCode":null,"errorMessage":"You must set data provider helper first.","messagePattern":"You must set data provider helper first\\.","errorType":"exception","errorClass":"GameFrameworkException","httpStatus":null,"severity":"critical","filePath":"GameFramework/Base/DataProvider/DataProvider.cs","lineNumber":191,"sourceCode":"            ReadData(dataAssetName, Constant.DefaultPriority, userData);\n        }\n\n        /// <summary>\n        /// 读取数据。\n        /// </summary>\n        /// <param name=\"dataAssetName\">内容资源名称。</param>\n        /// <param name=\"priority\">加载数据资源的优先级。</param>\n        /// <param name=\"userData\">用户自定义数据。</param>\n        public void ReadData(string dataAssetName, int priority, object userData)\n        {\n            if (m_ResourceManager == null)\n            {\n                throw new GameFrameworkException(\"You must set resource manager first.\");\n            }\n\n            if (m_DataProviderHelper == null)\n            {\n                throw new GameFrameworkException(\"You must set data provider helper first.\");\n            }\n\n            HasAssetResult result = m_ResourceManager.HasAsset(dataAssetName);\n            switch (result)\n            {\n                case HasAssetResult.AssetOnDisk:\n                case HasAssetResult.AssetOnFileSystem:\n                    m_ResourceManager.LoadAsset(dataAssetName, priority, m_LoadAssetCallbacks, userData);\n                    break;\n\n                case HasAssetResult.BinaryOnDisk:\n                    m_ResourceManager.LoadBinary(dataAssetName, m_LoadBinaryCallbacks, userData);\n                    break;\n\n                case HasAssetResult.BinaryOnFileSystem:\n                    int dataLength = m_ResourceManager.GetBinaryLength(dataAssetName);\n                    EnsureCachedBytesSize(dataLength);\n                    if (dataLength != m_ResourceManager.LoadBinaryFromFileSystem(dataAssetName, s_CachedBytes))","sourceCodeStart":173,"sourceCodeEnd":209,"githubUrl":"https://github.com/EllanJiang/GameFramework/blob/d0c010b05167c58e92350449d04864a91ca13fd2/GameFramework/Base/DataProvider/DataProvider.cs#L173-L209","documentation":"ReadData also requires an IDataProviderHelper (the object that actually parses loaded bytes) to be assigned via SetDataProviderHelper. When m_DataProviderHelper is null, even with a resource manager present, the provider cannot parse the binary and throws. Like error 1, it is a setup-order failure.","triggerScenarios":"Calling ReadData(dataAssetName, priority, userData) after SetResourceManager but before SetDataProviderHelper, or never calling SetDataProviderHelper at all on the DataProvider instance.","commonSituations":"Forgetting to add/configure the helper (e.g. a DataTableHelper or ConfigHelper) in the Unity inspector; renaming or removing the helper component so the framework can't resolve it; custom helpers not registered in a custom flow.","solutions":["Call SetDataProviderHelper(helper) with a valid IDataProviderHelper implementation before ReadData.","In Unity, verify the helper component is attached and assigned on the corresponding GameFramework component.","Check initialization code so resource manager and helper are both set in the same init routine."],"exampleFix":"// before\ndataProvider.SetResourceManager(m_ResourceManager);\ndataProvider.ReadData(\"Assets/Config.dat\", 0, null);\n// after\ndataProvider.SetResourceManager(m_ResourceManager);\ndataProvider.SetDataProviderHelper(new ConfigHelper());\ndataProvider.ReadData(\"Assets/Config.dat\", 0, null);","handlingStrategy":"validation","validationCode":"if (m_DataProviderHelper == null) { /* attach/assign the helper component */ }\ndataProvider.ReadData(assetName, 0, userData);","typeGuard":"bool HasHelper(IDataProviderHelper h) => h != null;","tryCatchPattern":"try { dataProvider.ReadData(name, 0, null); }\ncatch (GameFrameworkException e) when (e.Message.Contains(\"data provider helper\")) { Log.Error(\"Assign an IDataProviderHelper via SetDataProviderHelper before reading data.\"); }","preventionTips":["Always pair SetResourceManager with SetDataProviderHelper during init.","Verify inspector assignments on GameFramework components after renaming helpers.","Unit-test provider setup before load in tooling."],"tags":["initialization","missing-dependency","dataprovider"],"backgroundTag":"missing-dependency","analyzedSha":"d0c010b05167c58e92350449d04864a91ca13fd2","analyzedAt":"2026-09-15T13:37:15.352Z","contentChangedAt":"2026-09-15T13:37:15.352Z","schemaVersion":2},"datasetVersion":"2026-09-15T23:17:13.987Z"}