2017-08-17 112 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