{"record":{"id":"49b9c84e371d9e33","repo":"microg/GmsCore","slug":"unsupported-cursor-on-this-platform","errorCode":null,"errorMessage":"Unsupported cursor on this platform!","messagePattern":"Unsupported cursor on this platform!","errorType":"exception","errorClass":"RuntimeException","httpStatus":null,"severity":"error","filePath":"play-services-base/src/main/java/com/google/android/gms/common/data/DataHolder.java","lineNumber":182,"sourceCode":"        if (cursor instanceof AbstractWindowedCursor) {\n            CursorWindow cursorWindow = ((AbstractWindowedCursor) cursor).getWindow();\n            int pos = cursor.getPosition();\n            int type = -1;\n            if (cursorWindow.isNull(pos, i)) {\n                type = FIELD_TYPE_NULL;\n            } else if (cursorWindow.isLong(pos, i)) {\n                type = FIELD_TYPE_INTEGER;\n            } else if (cursorWindow.isFloat(pos, i)) {\n                type = FIELD_TYPE_FLOAT;\n            } else if (cursorWindow.isString(pos, i)) {\n                type = FIELD_TYPE_STRING;\n            } else if (cursorWindow.isBlob(pos, i)) {\n                type = FIELD_TYPE_BLOB;\n            }\n\n            return type;\n        }\n        throw new RuntimeException(\"Unsupported cursor on this platform!\");\n    }\n\n    /**\n     * Closes the data holder, releasing all of its resources and making it completely invalid.\n     */\n    @Override\n    public void close() {\n        synchronized (this) {\n            if (!closed) {\n                closed = true;\n                for (CursorWindow window : windows) {\n                    window.close();\n                }\n            }\n        }\n    }\n\n    /**","sourceCodeStart":164,"sourceCodeEnd":200,"githubUrl":"https://github.com/microg/GmsCore/blob/157c9d86ac46c195a86c2f15ab55c84036223f95/play-services-base/src/main/java/com/google/android/gms/common/data/DataHolder.java#L164-L200","documentation":"Thrown in DataHolder.getCursorType when the Cursor is not an AbstractWindowedCursor, so CursorWindow-based type introspection (isNull/isLong/isFloat/isString) cannot be used on this platform. It signals an unsupported platform cursor implementation, not bad input data.","triggerScenarios":"Thrown at play-services-base/src/main/java/com/google/android/gms/common/data/DataHolder.java:182 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Verify the Cursor passed to DataHolder comes from a SQLiteDatabase query (which returns AbstractWindowedCursor) rather than a custom wrapper","Wrap or replace the cursor with a CursorWindow-compatible implementation before creating the DataHolder","Extend AbstractWindowedCursor in the custom Cursor implementation"],"exampleFix":null,"handlingStrategy":"fallback","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"157c9d86ac46c195a86c2f15ab55c84036223f95","analyzedAt":"2026-09-06T17:27:33.892Z","contentChangedAt":"2026-09-06T17:27:33.892Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}