2011-11-18 80 views
1

我制作了一个iphone应用程序,它使用了一个预先填写了问题/答案的SQLite数据库。每次我想更正/添加问题到数据库时,我都必须更新应用程序并将其提交给Apple。我刚刚开始了解一些JAX-RS API,并且已经提出了REST的问题等,并将它们公开为XML。所以我现在想要的是使用网络中的数据而不是固定的数据库,但我有一些问题:制作移动应用程序中的内容动态

  • REST和我描述的方式是“有效”的方式吗?
  • 我需要离线提供的问题,所以我想下载 文件到设备,并定期检查是否有新文件是 avalible并下载。

也许愚蠢的问题,但我没有,所以我任何帮助和思绪之中将大大appriciated做过很多Web服务:=)

+0

如果我理解正确,应用程序“Exoplanet”解决您的问题的方式是,只要包含行星的文档(在您的情况下,您的Q/A)就会在应用程序顶部弹出小红点警报,变化。然后,应用程序知道它应该去获取它,并将内容存储在手机SQLite数据库中。 – Kheldar

回答

0
  • 你需要有一个数据库(在数据库中读出:“A大量的数据以任何你喜欢的方式存储,不管是纯文本,xml还是sql),都可以在服务器上存储你的问题。
  • 你需要有一个接口来查询这些问题。
    • 一个简单的(但不是非常优化的)想法是,以xml格式存储该数据库,并定期(或通过用户输入)使应用程序抓住该XML并解析它。
    • 一个更复杂,更好的方法是让应用程序说出最后一次检索问题的时间,并只提供一个带有差异的xml。
    • 你的REST方法很好,可能是我上面描述的方法之一(你使用REST以“简单”或“更复杂”的方式返回它,但如果你不需要任何认证,你可能会不想所有的开销。最后,这是给你和你的需求。
  • 解析该文件(我使用XML作为例子,但可以使用JSON,CSV,等等)
  • 商店设备中的数据
    • 如果您使用的是“简单”方法,则可以使用xml擦除整个数据库并重新创建该数据库
    • 如果您使用了“更加复杂”的方法,你应该只添加你所得到的,因为你的服务器应该只提供了新的问题

陷阱:

  • 数据库需求不在应用程序包内,否则将无法写入(只能在模拟器上写入,而不能在设备上写入)
  • 您应该仔细考虑如何将这些问题存储在设备上(如果它是一个仅适用于iOS的应用程序,我推荐CoreData)

如果您想在应用程序图标(称为“徽章”)中显示带有数字的“红球”(在这种情况下为更新次数),您应该使用通知,需要在您的站点数据库中注册客户端标识符,并且每次有更新时,都应通知每个客户端。这不是微不足道的,我相信你应该首先实施解决方案,让应用程序在反方向前搜索数据。

如果您想了解更多有关通知,你可以使用:

请注意,这不是一成不变的。还有其他方法(应该是),但这是我在需要更新客户端数据库时使用的工作流程。

希望它指出你在正确的方向。随意要求澄清(如果需要)。

0

所以答案:

是的,这是工作的好方法,你可以使用网络上传最新 数据。你可以用两种方法做:

1)只上传新问题,并将它们添加到现有的sqlite 数据库为您的应用程序。但是您应该知道,数据库 必须放置在Documents目录中,而不是您的应用程序 Bundle中。示例代码,你可以在这里查看。

 BOOL success; 
     NSFileManager *fileManager = [NSFileManager defaultManager]; 
     NSError *error; 
     NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
     NSString *documentsDirectory = [paths objectAtIndex:0]; 
     NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"db.sqlite"]; 
     self.imagesPath = [documentsDirectory stringByAppendingPathComponent:@"images"]; 

//Check if you have local copy of your database 
     if (![fileManager fileExistsAtPath:imagesPath]) 
     { 
     NSError *error; 
      if (![fileManager createDirectoryAtPath:imagesPath withIntermediateDirectories:YES 
          attributes:NULL error:&error]) 
      { 
       NSAssert1(0, @"Error cannot create a directory %@", imagesPath); 
      } 
     } 



success = [fileManager fileExistsAtPath:writableDBPath]; 

//If you have no local copy, than copy default database, which you have added to project 
//Instead of this you can also download database from internet.  
     if (!success) 
     { 
      // The writable database does not exist, so copy the default to the appropriate location. 
      NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"db.sqlite"]; 
      success = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error]; 
      if (!success) { 
       NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]); 
      } 
     } 

2)你可以下载整个sqlite数据库并替换现有的。它很容易,但请记住,在这种情况下,您应该使用更多的流量。

  • 是的,只是存储在本地数据库中的文件目录,当你需要
    更新。