EllanJiang/GameFramework · critical · GameFrameworkException

You must set data provider helper first.

Error message

You must set data provider helper first.

What it means

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.

Solutions

  1. Call SetDataProviderHelper(helper) with a valid IDataProviderHelper implementation before ReadData.
  2. In Unity, verify the helper component is attached and assigned on the corresponding GameFramework component.
  3. Check initialization code so resource manager and helper are both set in the same init routine.

Example fix

// before
dataProvider.SetResourceManager(m_ResourceManager);
dataProvider.ReadData("Assets/Config.dat", 0, null);
// after
dataProvider.SetResourceManager(m_ResourceManager);
dataProvider.SetDataProviderHelper(new ConfigHelper());
dataProvider.ReadData("Assets/Config.dat", 0, null);
Defensive patterns

Strategy: validation

Validate before calling

if (m_DataProviderHelper == null) { /* attach/assign the helper component */ }
dataProvider.ReadData(assetName, 0, userData);

Type guard

bool HasHelper(IDataProviderHelper h) => h != null;

Try / catch

try { dataProvider.ReadData(name, 0, null); }
catch (GameFrameworkException e) when (e.Message.Contains("data provider helper")) { Log.Error("Assign an IDataProviderHelper via SetDataProviderHelper before reading data."); }

Prevention

When it happens

Trigger: Calling ReadData(dataAssetName, priority, userData) after SetResourceManager but before SetDataProviderHelper, or never calling SetDataProviderHelper at all on the DataProvider instance.

Common situations: 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.

Understand the failure class

Background: "not installed", "pip install", "required for": how missing-dependency errors surface across open-source libraries — this error's family across 34 libraries.

Related errors


AI-assisted analysis of EllanJiang/GameFramework@d0c010b051 (2026-09-15). Data as JSON: /api/errors/68ebe378f64cce1d. Report an issue: GitHub.

Appendix: source

Thrown at GameFramework/Base/DataProvider/DataProvider.cs:191

            ReadData(dataAssetName, Constant.DefaultPriority, userData);
        }

        /// <summary>
        /// 读取数据。
        /// </summary>
        /// <param name="dataAssetName">内容资源名称。</param>
        /// <param name="priority">加载数据资源的优先级。</param>
        /// <param name="userData">用户自定义数据。</param>
        public void ReadData(string dataAssetName, int priority, object userData)
        {
            if (m_ResourceManager == null)
            {
                throw new GameFrameworkException("You must set resource manager first.");
            }

            if (m_DataProviderHelper == null)
            {
                throw new GameFrameworkException("You must set data provider helper first.");
            }

            HasAssetResult result = m_ResourceManager.HasAsset(dataAssetName);
            switch (result)
            {
                case HasAssetResult.AssetOnDisk:
                case HasAssetResult.AssetOnFileSystem:
                    m_ResourceManager.LoadAsset(dataAssetName, priority, m_LoadAssetCallbacks, userData);
                    break;

                case HasAssetResult.BinaryOnDisk:
                    m_ResourceManager.LoadBinary(dataAssetName, m_LoadBinaryCallbacks, userData);
                    break;

                case HasAssetResult.BinaryOnFileSystem:
                    int dataLength = m_ResourceManager.GetBinaryLength(dataAssetName);
                    EnsureCachedBytesSize(dataLength);
                    if (dataLength != m_ResourceManager.LoadBinaryFromFileSystem(dataAssetName, s_CachedBytes))

View on GitHub (pinned to d0c010b051)