如何在另一个应用程序中访问一个应用程序sqlite数据库

时间:2014-03-24 05:36:28

标签: ios iphone ipad

我有一个应用程序,我创建了sqlite数据库并存储在文档目录中。现在我从现有应用程序打开其他应用程序,并且我想访问现有的数据库路径。我怎么能这样做任何人都可以帮助我。我编写下面的代码打开另一个应用程序并调用文档目录。但它获取了错误的文档目录路径。

==============

UIApplication *ourApplication = [UIApplication sharedApplication];
    NSString *ourPath = @"POSRetail://";
    NSURL *ourURL = [NSURL URLWithString:ourPath];
    if ([ourApplication canOpenURL:ourURL])
    {

        databasePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        NSLog(@"databasePath : %@",databasePath);
        NSString *filePath = [databasePath stringByAppendingPathComponent:@"testapp.sqlite"];

        BOOL fileExists = [[NSFileManager defaultManager] fileExistsAtPath:filePath];

        if(fileExists)
        {

            NSMutableString *strRecord =[[NSMutableString alloc]init];
            //Retrieve the values of database
            const char *dbpath = [filePath UTF8String];
            if (sqlite3_open(dbpath, &sdatabase) == SQLITE_OK)
            {
                // NSString *querySQL = [NSString stringWithFormat:@"SELECT * FROM employee"];
                // const char *query_stmt = [querySQL UTF8String];
                const char *query_stmt = "Select * from info";
                sqlite3_stmt *statement;
                //const char *query_stmt = "Select * from sqlite_master where type='table'";
                NSMutableArray *arrTemp = [[NSMutableArray alloc] init];
                if(sqlite3_prepare_v2(sdatabase, query_stmt, -1, &statement, NULL) == SQLITE_OK)
                {
                    while (sqlite3_step(statement)==SQLITE_ROW) {

                        [arrTemp addObject:[NSString stringWithFormat:@"%s",sqlite3_column_text(statement, 0)]];
                        [strRecord appendFormat:@"%@,",[NSString stringWithFormat:@"%s",sqlite3_column_text(statement, 0)]];
                        [arrTemp addObject:[NSString stringWithFormat:@"%s",sqlite3_column_text(statement, 1)]];
                        [strRecord appendFormat:@" %@,",[NSString stringWithFormat:@"%s",sqlite3_column_text(statement, 1)]];
                        [arrTemp addObject:[NSString stringWithFormat:@"%s",sqlite3_column_text(statement, 2)]];
                        [strRecord appendFormat:@" %@,",[NSString stringWithFormat:@"%s",sqlite3_column_text(statement, 2)]];
                        [arrTemp addObject:[NSString stringWithFormat:@"%s",sqlite3_column_text(statement, 3)]];
                        [strRecord appendFormat:@" %@\n",[NSString stringWithFormat:@"%s",sqlite3_column_text(statement, 3)]];
                    }

                    NSLog(@"arrTemp : %@",arrTemp);
                    sqlite3_finalize(statement);
                }
                else
                {
                    NSAssert1(0, @"Error: failed to prepare statement with message '%s'.", sqlite3_errmsg(sdatabase));
                }
                sqlite3_close(sdatabase);
            }
            else
            {
                sqlite3_close(sdatabase);
                NSAssert1(0, @"Failed to open database with message '%s'.", sqlite3_errmsg(sdatabase));
            }
        }
        else
        {
            NSLog(@"SQLITE DATABASE NOT AVAILABLE");
        }
    }
    else {
        UIAlertView *alertView = [[UIAlertView alloc] initWithTitle:@"Receiver Not Found" message:@"The Receiver App is not installed. It must be installed." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [alertView show];
        [alertView release];
    }

4 个答案:

答案 0 :(得分:2)

好像您想要访问其他iOS App数据,然后来自Apple

的两个字

Not Possible

由于iOS应用适用于SandBox Environment在应用之间共享数据,因此无法通过file system直接共享数据,但也有一些方法可用于共享数据审核

<强> Custom URL Scheme:

  • iOS programming指南现在有一个关于在两者之间传递数据的部分 应用程序让一个应用程序声明某个URL prefix然后拥有 其他应用引用URL。对于你的这一点你可以看 这Apple DocumentationSOiOS相关 这个问题。

<强> Good Thread

  • 文档交互控制器以及委托对象, 提供应用内支持,以管理用户与文件的交互 本地系统。例如,电子邮件程序可能使用此类 允许用户预览附件并在其他中打开它们 应用。使用此类为其提供适当的用户界面 预览,打开,复制或打印指定的文件。

<强> UIDocumentInteractionController

  • iCloud是一项免费服务,可让用户访问他们的个人 所有内容        他们的设备 - 通过Apple ID无线和自动。 iCloud是这样做的        将基于网络的存储与专用API相结合,完全支持        与操作系统集成。 Apple提供服务器基础设施        备份和用户帐户,因此您可以专注于构建功能强大的iCloud    的应用程序。

注意:没有关于越狱的想法{{1}}设备我得到了参考iCloud API:

答案 1 :(得分:2)

目前无法直接访问其他应用程序的数据。 因为每个应用程序都在沙箱环境中运行。

但你能做到,怎么做?

您需要使用iCloud。您可以在应用程序之间共享存储在iCloud中的数据,因此将数据库文件存储在iCloud中。

<强>参考文献:

您可以在此处找到有关iCloud的教程:iCloud Programming
我在这里描述了数据共享:iCloud Data Sharing

答案 2 :(得分:0)

我认为这根本不可能,每个应用程序都在自己的VM中运行,其他应用程序无法访问彼此的数据,除非数据写在SD卡本身的共享空间上。

答案 3 :(得分:0)

您可以越狱您的设备,然后使用一些越狱开发库来为您提供每个应用程序的沙盒文件夹,或者您可以自己迭代Application文件夹。