如何使用Drive API在Google Drive中查询Xamarin.Android中的IDriveResource?

时间:2017-08-17 01:19:04

标签: xamarin xamarin.android google-drive-api

我尝试使用查询在Google云端硬盘应用文件夹中获取IDriveResource,但我在使用类型转换方面遇到了问题。 这是我到目前为止的代码:

using (IDriveFolder appFolder = DriveClass.DriveApi.GetAppFolder(googleApiClient))
using (QueryClass query = new QueryClass.Builder().AddFilter(Filters.Eq(SearchableField.Title, MY_FILE_NAME)).Build())
using (var queryResult = await appFolder.QueryChildrenAsync(googleApiClient, query))
using (var driveItem = queryResult.MetadataBuffer)
{
    using (var driveFile = await driveItem.DriveId.AsDriveFile().OpenAsync(googleApiClient, DriveFile.ModeWriteOnly, null))
    using (var outputStream = driveFile.DriveContents.OutputStream)
    using (var writer = new OutputStreamWriter(outputStream))
    using (var changeSet = new MetadataChangeSet.Builder()
                .SetLastViewedByMeDate(new Java.Util.Date())
                .Build())
    {
        writer.Write(MY_TEXT);
        writer.Close();
        driveFile.DriveContents.Commit(googleApiClient, changeSet);
    }
}

但编译器无法识别 driveItem 中的 DriveId 属性。我需要输入强制转换 driveItem ,但编译器不会接受任何选项。如果它接受 driveItem 声明(如MetadataBuffer),则它不会拥有 DriveId 属性。如果我尝试IDriveFile或IDriveResource,它就不会接受变量声明中的强制转换。

我尝试将 driveItem 传递给类似的方法时遇到了同样的问题:

private async Task<bool> saveDriveItem(???? driveItemToSave) 
{
   ...
}

我不能使用这种方法,因为我找不到合适的????要使用的类型。

有什么想法吗?

感谢。

1 个答案:

答案 0 :(得分:1)

MetadataBuffer是元数据条目的集合,您尝试将其用作单个MetaData对象。

当您使用云端硬盘查询时,您可以取回多个文件/文件夹,因为云端硬盘允许您在同一文件夹中拥有多个同名文件。

查看查询中的所有结果:

using (IDriveFolder appFolder = DriveClass.DriveApi.GetAppFolder(googleApiClient))
using (QueryClass query = new QueryClass.Builder().AddFilter(Filters.Eq(SearchableField.Title, MY_FILE_NAME)).Build())
using (var queryResult = await appFolder.QueryChildrenAsync(googleApiClient, query))
{
    foreach (var driveItem in queryResult.MetadataBuffer)
    {
        Log.Debug("SO", driveItem.Title);   
    }
}

由于您使用AppFolder并且只有您的应用可以写入, suppmably 您只有一个文件具有该唯一文件名,除非您的代码未检查预先存在文件,只是写一个具有相同名称的新文件(允许)。

仅检查MetadataBuffer中的一个结果,否则请记录错误消息:

using (IDriveFolder appFolder = DriveClass.DriveApi.GetAppFolder(googleApiClient))
using (QueryClass query = new QueryClass.Builder().AddFilter(Filters.Eq(SearchableField.Title, MY_FILE_NAME)).Build())
using (var queryResult = await appFolder.QueryChildrenAsync(googleApiClient, query))
{
    if (queryResult.MetadataBuffer.Count == 1)
    {
        var driveItem = queryResult.MetadataBuffer.Get(0) as Metadata;
        using (var driveFile = await driveItem.DriveId.AsDriveFile().OpenAsync(googleApiClient, DriveFile.ModeWriteOnly, null))
        {
            // do something with your drivefile...
        }
    }
    else
    {
        Log.Error("SO", $"The query for {MY_FILE_NAME} returned {queryResult.MetadataBuffer.Count} results?!?!?");
        // Your app is writing multiple files with the same name...
    }
}