如何使用Drive API在Google Drive中为Xamarin.Android查询IDriveResource? [英] How to query an IDriveResource in Google Drive for Xamarin.Android using the Drive API?

查看:135
本文介绍了如何使用Drive API在Google Drive中为Xamarin.Android查询IDriveResource?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

 使用(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,查询))
使用(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);
}
}

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



实际上,在尝试传递 driveItem 转换为以下方法:

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

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

有什么想法?

谢谢。

解决方案 MetadataBuffer 是元数据条目的集合,您试图将其作为单数使用 MetaData object。



当您使用云端硬盘查询时,您可以取回多个文件/文件夹,因为云端硬盘允许您拥有多个具有相同名称的文件,同样的文件夹。



查看您查询中的所有结果:

 使用(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(queryResult.MetadataBuffer中的var driveItem)
{
Log.Debug( SO,driveItem.Title);




$ b $ p $因为你正在使用 AppFolder 只有你的应用程序可以写入它,假设你只有一个文件具有唯一的文件名,除非你的代码没有检查预先存在的文件,只是写一个新的一个具有相同的名称(这将被允许)。

检查 MetadataBuffer 中只有一个结果,否则会记录一条错误消息:

$ p $ 使用(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;
使用(var driveFile = await driveItem.DriveId.AsDriveFile()。OpenAsync(googleApiClient,DriveFile.ModeWriteOnly,null))
{
//对驱动文件做些什么...




Log.Error(SO,${MY_FILE_NAME}的查询返回了{queryResult.MetadataBuffer.Count}结果?!? !?);
//您的应用程序正在写入多个具有相同名称的文件...


code $ pre $ $ b

I'm trying to get an IDriveResource in the Google Drive Apps Folder using a query, but I'm having trouble with type casting. Here's the code I got so far:

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);
    }
}

But the compiler doesn't recognize DriveId property in driveItem. I need to type cast driveItem, but the compiler won't accept any option. If it accepts on the driveItem declaration (like MetadataBuffer), it won't have the DriveId property. If I try IDriveFile or IDriveResource it won't accept the cast in the variable declaration.

I'm actually having the same problem when trying to pass driveItem to a method like:

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

I can't use this kind of method because I can't find the right ???? type to use.

Any ideas?

Thanks.

解决方案

MetadataBuffer is a collection of Metadata entries and you are trying to use it as a singular MetaData object.

When you use a Drive query, you could get back multiple files/folders as Drive allows you to have multiple files with the same name even within the same folder.

Review all the results from your query:

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);   
    }
}

Since you are using AppFolder and only your app can write to it, assumably you only have one file with that unique file name unless your code is not checking for a pre-existing file and just writes a new one with the same name (which would be allowed).

Check for only one result in the MetadataBuffer, else log an error message:

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...
    }
}

这篇关于如何使用Drive API在Google Drive中为Xamarin.Android查询IDriveResource?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆