アプリケーション固有のデータを格納する



  • この記事は、Google Drive™ APIに関する記事を和訳したものです。
  • 原文: Store application-specific data
  • 元記事のライセンスは CC-BYで、この和訳記事のライセンスは CC-BYです。
  • 自己責任でご利用ください。
  • 和訳した時期は 2019年6月ころです。

Drive APIは、あなたのアプリがアプリケーションデータを格納するために使用することができる特別な隠しフォルダを含んでいます。

アプリケーションデータフォルダとは何?

'Application Data folder' は、あなたのアプリケーションによってのみアクセス可能な特別なフォルダです。 そのコンテンツはユーザおよび他のアプリから隠されています。 ユーザから隠されているにも関わらず、アプリケーションデータフォルダはユーザの Drive上に格納され、したがって、ユーザの Driveのストレージクォータを使用します。 アプリケーションデータフォルダは、構成ファイル、セーブドゲームのデータ、あるいは、ユーザが直接対話するべきではない他のファイルのタイプを格納するために使用されることができます。

ユーザはアプリケーションデータフォルダのコンテンツを確認することはできませんが、彼らは、Manage Appsダイアログにて、あなたのアプリのアプリケーションデータフォルダによって使用されるストレージの量を確認することができます:

Manage apps dialog showing Application Data folder size

ユーザが彼らの Driveからあなたのアプリをアンインストールした場合には、あなたのアプリケーションデータフォルダは削除されます。 さらには、彼らはあなたのアプリのデータフォルダを手動で削除することができます。

アプリケーションデータフォルダを使用するための承認を取得する

あなたのアプリケーションデータフォルダを使用できるようにするには、次のスコープへのアクセスをリクエストします:

https://www.googleapis.com/auth/drive.appdata

スコープ、および、それらへのアクセスをリクエストする方法の詳細については、私のアプリには何のスコープが必要?を参照してください。

アプリケーションデータフォルダを操作する

アプリケーション固有のフォルダは、エイリアス appDataFolderを使用してアクセス可能です。 このエイリアスは、他のフォルダ IDのように使用されることができます; 例えば、あなたのアプリケーションフォルダの下に直接配置されたファイルをリストするとき、あるいは、親として appDataFolderを使用することによってファイルを作成するときです。

開始するために必要となる情報の多くは、クライアントライブラリの例も含めて、Files referenceで詳しく説明されています。

アプリケーションデータフォルダにファイルを挿入する

アプリケーションは、アプリケーションデータフォルダに新しいファイルを格納するために、次のコードスニペットを使用することができます:

Java

File fileMetadata = new File();
fileMetadata.setName("config.json");
fileMetadata.setParents(Collections.singletonList("appDataFolder"));
java.io.File filePath = new java.io.File("files/config.json");
FileContent mediaContent = new FileContent("application/json", filePath);
File file = driveService.files().create(fileMetadata, mediaContent)
    .setFields("id")
    .execute();
System.out.println("File ID: " + file.getId());

Python

file_metadata = {
    'name': 'config.json',
    'parents': ['appDataFolder']
}
media = MediaFileUpload('files/config.json',
                        mimetype='application/json',
                        resumable=True)
file = drive_service.files().create(body=file_metadata,
                                    media_body=media,
                                    fields='id').execute()
print 'File ID: %s' % file.get('id')

PHP

$fileMetadata = new Google_Service_Drive_DriveFile(array(
    'name' => 'config.json',
    'parents' => array('appDataFolder')
));
$content = file_get_contents('files/config.json');
$file = $driveService->files->create($fileMetadata, array(
    'data' => $content,
    'mimeType' => 'application/json',
    'uploadType' => 'multipart',
    'fields' => 'id'));
printf("File ID: %s\n", $file->id);

.NET

var fileMetadata = new File()
{
    Name = "config.json",
    Parents = new List<string>()
    {
        "appDataFolder"
    }
};
FilesResource.CreateMediaUpload request;
using (var stream = new System.IO.FileStream("files/config.json",
    System.IO.FileMode.Open))
{
    request = driveService.Files.Create(
        fileMetadata, stream, "application/json");
    request.Fields = "id";
    request.Upload();
}
var file = request.ResponseBody;
Console.WriteLine("File ID: " + file.Id);

Ruby

file_metadata = {
    name: 'config.json',
    parents: ['appDataFolder']
}
file = drive_service.create_file(file_metadata,
                                 fields: 'id',
                                 upload_source: 'files/config.json',
                                 content_type: 'application/json')
puts "File Id: #{file.id}"

Node.js

var fileMetadata = {
  'name': 'config.json',
  'parents': ['appDataFolder']
};
var media = {
  mimeType: 'application/json',
  body: fs.createReadStream('files/config.json')
};
drive.files.create({
  resource: fileMetadata,
  media: media,
  fields: 'id'
}, function (err, file) {
  if (err) {
    // Handle error
    console.error(err);
  } else {
    console.log('Folder Id:', file.id);
  }
});

Objective-C

NSData *fileData = [[NSFileManager defaultManager] contentsAtPath:@"files/config.json"];

GTLRDrive_File *metadata = [GTLRDrive_File object];
metadata.name = @"config.json";
metadata.parents = @[@"appDataFolder"];

GTLRUploadParameters *uploadParameters = [GTLRUploadParameters uploadParametersWithData:fileData
                                                                               MIMEType:@"application/json"];
uploadParameters.shouldUploadWithSingleRequest = TRUE;
GTLRDriveQuery_FilesCreate *query = [GTLRDriveQuery_FilesCreate queryWithObject:metadata
                                                               uploadParameters:uploadParameters];
query.fields = @"id";
[driveService executeQuery:query completionHandler:^(GTLRServiceTicket *ticket,
                                                     GTLRDrive_File *file,
                                                     NSError *error) {
    if (error == nil) {
        NSLog(@"File ID %@", file.identifier);
    } else {
        NSLog(@"An error occurred: %@", error);
    }
}];

アプリケーションデータフォルダからファイルをリストする

次のコードスニペットは、アプリケーションデータフォルダに格納されたすべてのファイルをプログラムでリストする方法を示しています:

Java

FileList files = driveService.files().list()
    .setSpaces("appDataFolder")
    .setFields("nextPageToken, files(id, name)")
    .setPageSize(10)
    .execute();
for (File file : files.getFiles()) {
  System.out.printf("Found file: %s (%s)\n",
      file.getName(), file.getId());
}

Python

response = drive_service.files().list(spaces='appDataFolder',
                                      fields='nextPageToken, files(id, name)',
                                      pageSize=10).execute()
for file in response.get('files', []):
    # Process change
    print 'Found file: %s (%s)' % (file.get('name'), file.get('id'))

PHP

$response = $driveService->files->listFiles(array(
    'spaces' => 'appDataFolder',
    'fields' => 'nextPageToken, files(id, name)',
    'pageSize' => 10
));
foreach ($response->files as $file) {
    printf("Found file: %s (%s)", $file->name, $file->id);
}

.NET

var request = driveService.Files.List();
request.Spaces = "appDataFolder";
request.Fields = "nextPageToken, files(id, name)";
request.PageSize = 10;
var result = request.Execute();
foreach (var file in result.Files)
{
    Console.WriteLine(String.Format(
        "Found file: {0} ({1})", file.Name, file.Id));
}

Ruby

response = drive_service.list_files(spaces: 'appDataFolder',
                                    fields: 'nextPageToken, files(id, name)',
                                    page_size: 10)
for file in response.files
  # Process change
  puts "Found file: #{file.name} #{file.id}"
end

Node.js

drive.files.list({
  spaces: 'appDataFolder',
  fields: 'nextPageToken, files(id, name)',
  pageSize: 100
}, function (err, res) {
  if (err) {
    // Handle error
    console.error(err);
  } else {
    res.files.forEach(function (file) {
      console.log('Found file:', file.name, file.id);
    });
  }
});

Objective-C


GTLRDriveQuery_FilesList *query = [GTLRDriveQuery_FilesList query];
query.spaces = @"appDataFolder";
query.fields = @"nextPageToken, files(id, name)";
[driveService executeQuery:query completionHandler:^(GTLRServiceTicket *ticket,
                                                     GTLRDrive_FileList *files,
                                                     NSError *error) {
    if (error == nil) {
        for(GTLRDrive_File *file in files) {
            NSLog(@"Found file: %@ (%@)", file.name, file.identifier);
        }
    } else {
        NSLog(@"An error occurred: %@", error);
    }
}];