Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用驱动API在Google Drive中查询Xamarin.Android的IDriveResource?_Xamarin_Xamarin.android_Google Drive Api - Fatal编程技术网

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

如何使用驱动API在Google Drive中查询Xamarin.Android的IDriveResource?,xamarin,xamarin.android,google-drive-api,Xamarin,Xamarin.android,Google Drive Api,我正在尝试使用查询在Google Drive Apps文件夹中获取IDriveResource,但在类型转换方面遇到问题。 这是我到目前为止得到的代码: using (IDriveFolder appFolder = DriveClass.DriveApi.GetAppFolder(googleApiClient)) using (QueryClass query = new QueryClass.Builder().AddFilter(Filters.Eq(SearchableField.Ti

我正在尝试使用查询在Google Drive Apps文件夹中获取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属性。我需要键入castdriveItem,但编译器不接受任何选项。如果它接受driveItem声明(如MetadataBuffer),它将不具有DriveId属性。如果我尝试IDriveFile或IDriveResource,它将不接受变量声明中的强制转换

实际上,我在尝试将driveItem传递给以下方法时遇到了相同的问题:

private async Task<bool> saveDriveItem(???? driveItemToSave) 
{
   ...
}
专用异步任务saveDriveItem(????driveItemToSave)
{
...
}
我不能使用这种方法,因为我找不到合适的方法????要使用的类型

有什么想法吗


谢谢。

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))
{
    foreach (var driveItem in queryResult.MetadataBuffer)
    {
        Log.Debug("SO", driveItem.Title);   
    }
}
由于您使用的是
AppFolder
,并且只有您的应用程序可以写入该文件夹,因此假设您只有一个具有唯一文件名的文件,除非您的代码没有检查预先存在的文件,而只是写入具有相同名称的新文件(这是允许的)

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

谢谢我忘了缓冲区可以带来多个文件。这里发生了一些非常奇怪的事情。我的应用程序只使用一个xml文件。如果文件不存在(queryResult.MetadataBuffer.Count==0),它将创建一个。但每次我启动我的应用程序,它都会创建一个新的。queryResult始终返回0 MetadataBuffer.Count。你知道在Android设备上调试时有什么已知的bug吗?@Dpedrinha不,我基本上也是这么做的。如果查询结果中的
Count
为零,则该查询/搜索结果为零。假设您创建了一个基于AppDrive的文件,并且该文件已同步,则可以卸载/重新安装/更新该应用程序。。。查询结果应该是
1
。我知道。但它会创建多个看起来相同的文件。我想这是调试时的问题。每次调试时,查询返回0。但是,如果我运行应用程序而不附加到调试,它将获得文件。这可能与我每次调试时,驱动器api都会要求一个帐户有关。但即便如此,选择相同的账户也应该有效。看起来查询没有查询云,只是查询本地同步文件。这就是它返回0个文件的原因。它还没有同步,因为我每次调试时都要选择帐户,它在同步之前进行查询。