Iphone IPad SQLite从外部MS SQL Server DB推拉数据

Iphone IPad SQLite从外部MS SQL Server DB推拉数据,iphone,sql-server,web-services,ipad,sqlite,Iphone,Sql Server,Web Services,Ipad,Sqlite,这是我上一篇文章的延续(http://stackoverflow.com/questions/4182664/ipad-app-pull-and-push-relational-data). 我的计划是,当ipad应用程序启动时,我将通过Web服务从网络托管的MS SQL Server数据库中提取数据(配置数据,即系统中使用的部门、类型等关系数据),并将其填充到ipad上的SQL Lite数据库中。然后,当我加载一个列表时,我会通过一个webservice再次将数据拉过这行,并将其填充到ipad

这是我上一篇文章的延续(http://stackoverflow.com/questions/4182664/ipad-app-pull-and-push-relational-data). 我的计划是,当ipad应用程序启动时,我将通过Web服务从网络托管的MS SQL Server数据库中提取数据(配置数据,即系统中使用的部门、类型等关系数据),并将其填充到ipad上的SQL Lite数据库中。然后,当我加载一个列表时,我会通过一个webservice再次将数据拉过这行,并将其填充到ipad上的sqllitedb中(而不仅仅是运行select命令来填充列表)

我的问题是: 1.通过网络跨线路传输数据的最有效方式是什么?每个人似乎都用不同的方式做这件事。我的想法是,我将为每种类型的数据拉取(例如RetrieveContactList)提供一个Web服务,该服务将查询数据库,然后将该数据转换为“某物”以跨线路发送。我的问题是,它应该转换成什么“东西”? 2.每个人都在谈论odata服务。这是否适用于需要复杂读写的应用程序

在此之前,我创建了一个简单的iphone应用程序,与sql server db对话(我刚刚发送了我自己的结构化xml),但现在有了这个应用程序,数据调用将大得多,因此效率是关键。

我将对这类问题给出我的“标准”答案(这类问题的评分总是很高)-稍微解决了您的具体问题:

忘记您正在“将记录从一个数据库移动到另一个数据库”这一事实。您实际上只是从一个数据库中读取数据——通过网络发送数据——解析数据——然后将数据写入iPhone数据库

为此:

  • 在运行MS SQL server的web服务器上,编写一个基于某些web查询(或非查询)的网页(perl、ASP,任意),从MS SQL数据库读取适用的内容,并以XML格式输出

  • 在iPad上,使用NSXMLParser类来请求和解析XML数据。NSXMLParser的好处在于,它在一个调用中完成了所有实际打开HTTP连接、通过网络获取数据和解析XML的工作,即:

    • (id)initWithContentsOfURL:(NSURL*)url
  • 使用NSXMLParser调用从解析的XML文档中获取所需的数据,并使用标准核心数据服务将其写入本地iPhone数据库


  • 我建议您的服务器端代码返回JSON而不是XML,因为在iOS端使用它更简单。(在服务器端设置相对简单)

    另外,从应用程序发送一个标题字段,其中包含应用程序上次查询数据的日期,并获取服务器端代码以仅返回自该日期以来已更改的数据。使用SQL Server上的日期列保存已更新行的记录

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:requestURL]];
    [request setValue:lastCallTime forHTTPHeaderField:@"If-Modified-Since"];
    
    lastCallTime是NSDictionary中的一个条目,它保存响应头中的日期

    [response allHeaderFields][@"Date"]
    
    这是一篇关于如何在服务器上获取If-Modified-Since值的文章

    然后可以在查询中使用它


    最后一件事是还要确保服务器返回压缩的数据,因为这将有助于提高性能,并且当数据到达时,iOS默认情况下会对其进行解压缩

    不要使用initWithContentsOfURL:(NSURL*)url进行同步连接例如:如果在主线程上运行此操作,则会阻止UI。使用NSURLConnection委托方法进行异步URL连接并从网络中获取数据。收到数据后,将其交给NSXMLParser initWithData:(NSData*)data并让它进行解析。我强烈反对同步连接,即NSURLConnection中的sendSynchronousConnection或initWithContentsOfURL:。