본문 바로가기
Android/Exceptions

The parents field is not directly writable in update requests. Use the addParents and removeParents parameters instead.

by featherwing 2020. 4. 15.
반응형

Google Drive API의  files().update(fileid, metadata,con) 메소드를 사용할 때 발생했습니다.

 

 File metadata = new File().setName(name);
                     metadata.setParents(Collections.singletonList("appDataFolder"));
                     metadata.setMimeType("text/plain");
                     
                // Convert content to an AbstractInputStreamContent instance.
                ByteArrayContent contentStream = ByteArrayContent.fromString("text/plain", content);

                // Update the metadata and contents.
                mDriveService.files().update(fileId, metadata, contentStream).execute();

 

위와같은 코드를 통해 드라이브에 이미 존재하는 파일의 업데이트를 수행하는 작업을 하고 있었는데

 

처음에는 로그캣에서 아래의 오류밖에 확인할 수 없었습니다.

Drive (HTTPLog)-Static: isSBSettingEnabled false 

 

해당 오류의 경우 찾아보니 네트워크 오류 등 원인이 너무많아, 오류만으로는 원인을 찾을 수 없었는데

 

코드상의 문제는 없고, 파일의 Update가 아닌 Create는 잘되고 있었기 때문에 코드상의 큰 문제도 아닐거라 생각했습니다.

 

구글 드라이브 예제에서 제시하고 있는 Task API 대신 RxJava와 핸들러를 달아 보니

 

아래의 상세한 오류를 확인할 수 있었습니다.

 

The parents field is not directly writable in update requests. Use the addParents and removeParents parameters instead.

 

 

원인은 metadata의 setParents 부분입니다.

metadata.setParents(Collections.singletonList("appDataFolder"));

에러메세지는 이미 존재하는 파일의 Parents 부분을 직접 업데이트 할 수 없다는 내용이며 아마도, 이미 존재하는 파일의 parents 부분을 파일을 업데이트 하는 과정에서 setPatents로 다시 추가해 주었기 때문에 발생한 것으로 생각됩니다.

 

파일의 업데이트가 목적이고, 위치이동은 하지 않을 것이었기 때문에 아래와 같이 metadata의 setParents 부분을 제거해주니 정상적으로 기능하는것을 확인할 수 있었습니다.

 

 File metadata = new File().setName(name);
                     
                // Convert content to an AbstractInputStreamContent instance.
                ByteArrayContent contentStream = ByteArrayContent.fromString("text/plain", content);

                // Update the metadata and contents.
                mDriveService.files().update(fileId, metadata, contentStream).execute();
반응형

댓글