I have the following code, which lists out the files in the root, but does not list any of the sub folders in the root:
NSString *parentId = #"root";
GTLQueryDrive *queryDrive = [GTLQueryDrive queryForFilesList];
queryDrive.q = [NSString stringWithFormat:#"'%#' in parents and trashed=false", parentId];
[self.driveService executeQuery:queryDrive completionHandler:^(GTLServiceTicket *ticket,GTLDriveFileList *files,NSError *error)
{
if (error == nil)
{
NSLog(#"Number of files: %i", [files.items count]);
NSLog(#"Have results");
// Iterate over files.items array
for(GTLDriveFile *file in files)
{
NSLog(#"File Title: %# | ID: %#",file.title, file.identifier);
}
}
else
{
NSLog(#"An error occurred: %#", error);
}
}];
This lists out the 7 files I have in the folder, but at the same level as the 7 files, I have a sub folder.
For example:
root->file1
root->file2
...etc
all come back
But root->MyFolder does not get listed in the result set.
Any ideas?
You might want to check how you've authenticated your app. If you authenticate with only your app's files as your scope, you will not see other files and folders created outside of your app.
When you authenticate like this:
self.gDriveAuthenticationViewController = GTMOAuth2ViewControllerTouch(scope:kGTLAuthScopeDrive,
clientID:clientId,
clientSecret:clientSecret,
keychainItemName:keychainName,
delegate:self,
finishedSelector:"viewController:finishedWithAuth:error:")
Use scope:kGTLAuthScopeDrive instead of kGTLAuthScopeDriveFile
Related
Say I am assuming that my Box account has a folder called "TestFolder". I want to get the folder ID of that folder so I can write files to it from within my iOS app.
Is my only option to traverse the entire root of my Box account looking for that folder name? Something like this?
__block NSString *folderID;
BOXContentClient *contentClient = [BOXContentClient defaultClient];
BOXFolderItemsRequest *listAllInRoot = [contentClient folderItemsRequestWithID:BOXAPIFolderIDRoot];
[listAllInRoot performRequestWithCompletion:^(NSArray *items, NSError *error) {
if (error != nil) {
NSLog(#"Something bad happened when listing Box contents.");
return;
}
int ii,nItems = (int) [items count];
for (ii=0; ii<nItems; ii++) {
BOXItem *currItem = [items objectAtIndex:ii];
if ([[currItem name] isEqualToString:#"TestFolder"] && [currItem isFolder]) {
folderID = [currItem modelID];
break;
}
}
}];
You can use the Box API search endpoint to query a folder by name. If the search endpoint finds the folder, the response will include the folder's id.
Here is an example that shows how to make this call with the Box iOS SDK:
BOXContentClient *contentClient = [BOXContentClient defaultClient];
BOXSearchRequest *searchRequest = [contentClient searchRequestWithQuery:#"Test Folder" inRange:NSMakeRange(0, 1000)];
[searchRequest performRequestWithCompletion:^(NSArray *items, NSUInteger totalCount, NSRange range, NSError *error) {
// If successful, items will be non-nil and contain BOXItem model objects; otherwise, error will be non-nil.
}];
After looking and finding for a shared folder that matches a given name, I need to know if that folder's creator/owner is a specific google account. How could I achieve that utilizing Google Drive's Objective-C SDK.
Here is my query that finds the shared folder given its name:
GTLQueryDrive *queryDrive = [GTLQueryDrive queryForFilesList];
queryDrive.q = #"mimeType='application/vnd.google-apps.folder' and trashed=false";
[self.service executeQuery:queryDrive completionHandler:^(GTLServiceTicket *ticket,
GTLDriveFileList *files,
NSError *error) {
if (error == nil)
{
NSString *identifier = #"";
for(GTLDriveFile *file in files.files)
{
NSArray *tempArray = [NSArray arrayWithArray:file.owners];
NSLog(#"File Title: %# | ID: %#",file.name , file.identifier);
if ([file.name isEqualToString:#"GIVEN FOLDER NAME"]) {
identifier = file.identifier;
//How to know if the found folder is owned by a specified email?
break;
}
}
if ([identifier isEqualToString:#""]) {
[UISpinningWheelController removeSpinningWheel:self.view];
[self showAlertWithTitle:#"Error" andMessage:#"The required folder has not been shared with this Google account. Please contact the administrator."];
}
}
else {
[UISpinningWheelController removeSpinningWheel:self.view];
[self showAlertWithTitle:#"Error" andMessage:[error localizedDescription]];
}
}];
Thank you so much for your help.
In my application, I need to get file's description, however, the descriptionProperty was always nil for every file I've got. I did the same thing using google API explorer (the field was the same: items(description, title)), and could get the description successfully.
The code is the following:
GTLQueryDrive *query = [GTLQueryDrive queryForFilesList];
query.fields = #"items(description,title)";
[driveService executeQuery:query completionHandler:^(GTLServiceTicket *ticket, GTLDriveFileList *files, NSError *error) {
if (error == nil) {
NSLog(#"has %d files", [files.items count]);
GTLDriveFile *item;
for (int i = 0; i < files.items.count; i ++) {
item = [files.items objectAtIndex: i];
NSLog(#"%#", item.title);
NSLog(#"%#", item.descriptionProperty);
}
} else {
NSLog(#"An error occurred: %#", error);
}
}];
the log message I've got:
has 19 files
TestFile.txt
(null)
TestFile1.txt
(null)
...
As you can see, I got the title successfully, but the description was null for every file. I also tried not to set query.fields to let it get all fields. In this case, I could successfully get the description. But I really don't want to get all fields cause it's not necessary at all. Does anyone know what caused the problem? Thanks a lot!
Thanks for the report, this is a bug that should be fixed this week.
Using the Google Drive iOS API, how can I create a folder AND share it?
GTLDriveFile * folder = [GTLDriveFile object];
folder.title = #"Test";
folder.mimeType = #"application/vnd.google-apps.folder";
// ???
May be this one helps you. This code is for creating folder with specific name.
Code 1 :
-(void)createFolderWithName:(NSString *)folderName {
GTLDriveFile *file = [GTLDriveFile object];
file.title = #"FileUpload";
file.mimeType = #"application/vnd.google-apps.folder";
// To create a folder in a specific parent folder, specify the identifier
// of the parent:
// _resourceId is the identifier from the parent folder. Here i am using root as the parent folder.
NSString *resourceId = #"root";
if (resourceId.length && ![resourceId isEqualToString:#"0"]) {
GTLDriveParentReference *parentRef = [GTLDriveParentReference object];
parentRef.identifier = resourceId;
file.parents = [NSArray arrayWithObject:parentRef];
}
GTLQueryDrive *query1 = [GTLQueryDrive queryForFilesInsertWithObject:file uploadParameters:nil];
[[self appDelegate].driveService executeQuery:query1 completionHandler:^(GTLServiceTicket *ticket, id object, NSError *error) {
if (!error) {
//I see this in the console...
//No Errors in Folder Query:
//GTLDriveFileList 0x108f3430: {kind:"drive#fileList"
//etag:""Q5ElJByAJoL0etObruYVPRipH1k/vyGp6PvFo4RvsFtPoIWeCReyIC8""}
NSLog(#"No Errors in Folder Query: %#",object);
GTLDriveFileList *list = (GTLDriveFileList *)object;
//So, none of this for() loop happens
for (GTLDriveFile *file in list.items) {
NSLog(#"Folder: \n \n %# \n \n",file);
//NSLog(#"\n file extension value is %#",file.fileExtension);
//NSLog(#"\n file size value is %#",file.fileSize);
}
} else {
NSLog(#"Folder Query Error: %#",error);
}
}];
}
In the above code resourceId is the parent folder id, under which u want to create the folder.
I don't know how to share the full folder, but i think it is same like sharing the file.
If u want to know about particular file sharing please refer this link. In the link you can find the example for objective-c code.
https://developers.google.com/drive/v2/reference/permissions/insert
Using the following method, I am able to get the sub-folders, but this code retrieves all the folders from the root. For example, if there is a folder in trash also it retrieves that along with folders in My Drive.
My requirement is that, if the folder is not there in the My Drive, then first I should create one and then insert files. My problem is, when I am checking for the folder name, as the folder exist in trash but not in My Drive, I am getting response as folder exists.
Here is my method to retrieve folders.
If anyone has some idea, please let me know.
-(void)getFileListFromSpecifiedParentFolder {
GTLQueryDrive *query2 = [GTLQueryDrive queryForFilesList];
// GTLQueryDrive *query2 = [GTLQueryDrive queryForChildrenListWithFolderId:#"My Drive"];
query2.q = #"";
//or i also use this code
query2.q = #"mimeType = 'application/vnd.google-apps.folder'";
// queryTicket can be used to track the status of the request.
[self.driveService executeQuery:query2
completionHandler:^(GTLServiceTicket *ticket,
GTLDriveChildList *children, NSError *error) {
NSLog(#"\nGoogle Drive: file count in the folder: %d", children.items.count);
//incase there is no files under this folder then we can avoid the fetching process
if (!children.items.count) {
return ;
}
if (error == nil) {
for (GTLDriveChildReference *child in children) {
GTLQuery *query = [GTLQueryDrive queryForFilesGetWithFileId:child.identifier];
// queryTicket can be used to track the status of the request.
[self.driveService executeQuery:query
completionHandler:^(GTLServiceTicket *ticket,
GTLDriveFile *file,
NSError *error) {
NSLog(#"\nfile name = %# \n file kind %# \n file identifier %#", file.title,file.kind,file.identifier);
}];
}
}
else
[self createFolderForGoogleDriveWithName:#"Music"];
}];
}
You can filter out trashed directories with the following query: application/vnd.google-apps.folder' and trashed = false