使移动应用内容动态化

时间:2011-11-18 12:10:36

标签: java iphone ios java-ee rest

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

  • REST和我描述“有效”方式的方式是什么?
  • 我需要离线提供问题所以我想下载了 将文档记录到设备并定期检查是否有更新的文档 avalible并下载。

可能是一些愚蠢的问题,但我之前没有做太多的网络服务,所以我有任何帮助,虽然会很有用:=)

2 个答案:

答案 0 :(得分:0)

  • 您需要在服务器中有一个数据库(在数据库中读取:“以任何您喜欢的方式存储的数据块,无论是纯文本,xml还是sql”)来存储您的问题。
  • 您需要有一个界面来查询这些问题。
    • 一个简单(但不是非常优化)的想法是,以xml格式存储该数据库并定期(或通过用户输入)使用该应用程序获取该xml并解析它。
    • 一个更复杂和更好的方法是让应用程序说“何时”它最后检索到的问题并仅提供带有差异的xml。
    • 您的REST方法很好,可能是我上面描述的方法之一(您使用REST以“简单”方式或“更复杂”方式返回它。但如果您不需要任何身份验证,则可能不想要所有这些开销。最后,这取决于你和你的需求。
  • 解析该文件(我使用XML作为示例,但您可以使用JSON,CSV等)
  • 将数据存储在您的设备中。
    • 如果您使用的是“简单”方法,则可以删除整个数据库并使用xml重新创建它
    • 如果你正在使用“更复杂”的方法,你应该只添加你得到的东西,因为你的服务器应该只提供新的问题

缺陷:

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

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

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

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

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

答案 1 :(得分:0)

答案:

- 是的,这是一种很好的工作方式,你可以使用网页上传最新的    数据。你可以用两种方式做到这一点:

1)上传新问题并将其添加到现有的sqlite中     适合您应用的数据库。但你应该知道,那个数据库     必须放在Documents目录而不是您的应用程序中     束。您可以在此处查看示例代码。

        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数据库并替换现有数据库。它' S     很容易,但请记住,你应该使用更多         在这种情况下的流量。

  • 是的,只需将您的本地数据库存储在文档目录中,然后执行 在需要时更新。