如何使用驱动API在Google Drive中查询Xamarin.Android的IDriveResource?
我正在尝试使用查询在Google Drive Apps文件夹中获取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
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个文件的原因。它还没有同步,因为我每次调试时都要选择帐户,它在同步之前进行查询。