2017-08-17 114 views
1

我试图使用查询在Google云端硬盘应用程序文件夹中获得IDriveResource,但我在使用类型转换时遇到了问题。 这里是我到目前为止的代码:如何使用Drive API在Google Drive中查询Xamarin.Android的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认识驱动器Id财产。我需要输入driveItem,但编译器不会接受任何选项。如果它接受driveItem声明(如MetadataBuffer),它将不具有DriveId属性。如果我尝试使用IDriveFile或IDriveResource,它将不会接受变量声明中的强制转换。

我确实有试图driveItem传递给像一个方法,当同样的问题:

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

我不能使用这种方法,因为我无法找到合适的? ??键入即可使用。

任何想法?

谢谢。

回答

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,只有您的应用程序可以写入,assumably你只有一个文件与唯一的文件名,除非你的代码不检查预先存在的文件,只是用相同的名称(这将被允许)写入新的文件。

检查在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... 
    } 
} 
+0

感谢。我忘了缓冲区可以带来多个文件。 – Dpedrinha

+0

@Dpedrinha没问题... – SushiHangover

+0

SushiHangover这里真的很奇怪。我的应用程序只使用一个xml文件。如果文件不存在(queryResult.MetadataBuffer.Count == 0),它会创建一个。但每次启动我的应用程序时,它都会创建一个新应用程序。 queryResult始终返回0 MetadataBuffer.Count。您是否知道在Android设备上进行调试时可能会发生的任何已知错误? – Dpedrinha