2011-06-14 154 views
1

我是一名学习android的php/mysql开发人员。我正在创建一个android应用程序,它接收来自我的php应用程序的信息,以创建不同产品的列表视图,从而打开该产品详细信息的Web视图。xml数据存储的最佳方法

目前我的iPhone应用程序的PHP CMS Web应用程序输出的XML列表....(也分别输出HTML)。我有完全控制的PHP应用程序,所以如果有更好的方式来输出Android应用程序的数据,请让我知道。

我创建的代码,从网络读取XML和创建列表视图。该列表可以每天刷新,因此每次应用程序启动时都不需要从在线xml读取数据。

所以我想存储本地检索到的数据以提高我的应用程序响应速度。在任何给定时间最多可以存储500个产品描述,最多可存储30个不同的XML列表。我正在开发一个包含约30个产品的xml列表。

为了获得最佳性能,我应该存储在sqlLite分贝的产品信息,或者我应该实际的XML文件存储在缓存/ db或类似应用程序缓存一些其他的方法。

我也被认为创造了数据的更新的服务,这会是一个好主意?

回答

2

存储数据的最有效方式是RAM。但是如果你想缓存它,那么最有效的方式就是数据库。

我建议你在sqlite android数据库中存储你的数据。

你也可以考虑XML荏苒你更快的网络传输,并通过java.util.zip包解压类。使用datainput/outputstream,您甚至可以考虑使用更简单的数据传输格式,而不是xml的详细格式。 (我这样做,我的应用程序和它的伟大工程)

这里有一些细节上的数据输入/输出流的方法:

  • 想象一个专有的协议为您的数据,你只需要什么。没有标签,没有属性,只是原始值的顺序。
  • 在客户端,使用URL.getContent()获取数据的输入流并将其转换为输入流。
  • 仍然在客户端,建立一个封装你的套接字输入流的数据输入流并按顺序读取数据。使用readInt,readDouble,readUTF等。
  • 在客户端,从php,你需要找到一种方法来保存您的数据格式与客户端预期的数据格式兼容。我无法讲述很多关于PHP的知识,我只使用java编程。

这种技术的优点是您可以节省带宽,因为只有数据,并且由于xml而没有详细的装饰。您应该阅读Java规范以了解如何在数据输出流中编写double,int,字符串。但使用两种语言很难获得正确的数据。

如果PHP不能保存格式以适当的方式,使用XML,它会简单得多。首先尝试使用普通的xml,然后尝试使用zip或tarball或xml文件。

但所有这些都是关于网络连接期间的速度增益。

你必须做的第二部分是将你列表的每一行存储在SQL表中。然后,您可以使用CursorAdapter为您的列表视图快速检索它(它打破了迷人的MVC模型,但速度非常快!)。

+0

谢谢Stéphane,你可以扩展RAM和datainput/outputstream方法吗?这些如何工作?如果我选择了sqlite方法,我应该保存整个XML作为记录,或者我应该解析并保存在字段中的数据? – 2011-06-14 17:00:43

+0

@Traveling_Monk我将在anwser中详细介绍数据对象输入流。对于RAM而言,我的意思是没有比在RAM中,内存中,加载到列表或适配器中更快的速度。但是,如果您不希望数据在应用程序退出时被擦除,这还不够。 – Snicolas 2011-06-14 17:03:46

1

对不起,但写评论太长了。这不是为了回答你的问题,因为我认为斯特凡很好地回答了。最好的解决方案确实是将数据存储在sqlite数据库中。然后,您需要创建用作数据,数据库和应用程序之间连接的类。我不想因为这里所说的话而赞扬(我也投了票)。

我很关心其他建议(使用低级原始数据流进行数据操作,列表中的步骤就是这个答案)。我强烈建议您避免创建自己的专有协议。它是这样的:

  • 我需要交换数据。
  • 我不想处理将外部API集成到我的代码中的麻烦。
  • 我知道我可以写两个5分钟的例程来读写数据来回。
  • 因此,我只是创建了我自己的专有格式来交换数据!

无论何时我需要处理未知,晦涩和任意数据blob序列,它都会让我流泪。这是一件好事,记得为什么我们应该使用未知格式:

  • 重新发明轮子是适得其反。它似乎不是,但在中期来看是这样。您可以轻松地将您的项目调整到其他媒体(服务器端,其他平台)。
  • 使用现成的组件可以帮助您稍后扩展代码。
  • 无论何时您需要将您的解决方案适应其他技术和媒介,您的工作速度都会更快。否则,您可能会以特设的代码解决方案结束,这些解决方案不是(容易)可扩展和可互操作的。
  • 使用现成的组件可以使您利用该特定技术的进步。当您使用Android API时,这一点尤为重要,因为它们经常针对未来的性能进行优化(请参阅Android的Designing for Performance)。滚动自己的标准可能会导致性能损失。
  • 除非您记录您的协议,否则忘记您自己创建的协议是非常容易的。只要给它足够的时间,就会发生:你需要重新学习/记住。如果你记录,那么你只是在浪费你大脑的计算时间。
  • 你认为你不需要扩展你的工作,但是大部分时间你都会有机会。
  • 当你这样做时,你会希望你已经学会了如何轻松,无缝地整合知名的格式。
  • 无论如何都需要学习曲线。根据我的经验,当你学习时,你实际上整合了众所周知的格式更快比想象你自己的做事方式。
  • 最后,将您的数据信任给那些将自己的生命转化为创造凝聚力和智能标准的天才。他们更了解它!

最后,如果目的是为了避免XML的典型冗长,无论出于何种原因,您有几个选项。现在我可以想到CSV,但我并不是数据存储方面的专家,所以如果你不适应它,我相信你可以找到很多好的备选方案,并有大量准备好使用的API。

祝你好运!

+0

谢谢你为什么不DIY自己的流的原因,我并不期待这种方法。 CSV,嗯,可能会插入数据库真的很容易,在Android的支持sqlite的[LOAD DATA INFILE](http://dev.mysql.com/doc/refman/5.1/en/load-data.html) ?或者我应该只读它像[这](http://stackoverflow.com/questions/2887119/populate-android-database-from-csv-file/4210473#4210473)? – 2011-06-14 21:50:31

+1

好点@大卫。当然,这总是一个决定,它只依赖于性能(或模糊的尝试)来创建专有的协议。尽管如此,它是有效的。但正如你提到的那样,csv可以完成这项工作,甚至更好:JSON! – Snicolas 2011-06-14 21:52:27

+0

Snicolas:JSON为+1。你是对的。起初效率很高,但我想知道值得多少效率是值得的。我知道规则不是刻在石头上,常识是(这就是为什么我说你的答案是100%正确的)。说...对于非常小的批量数据应用程序来说,这当然可以应用,而XML将是无用的。但是在一般的应用程序中,我不认为这是值得的,而且当应用程序增长时,这种差异越来越难以察觉。但是,返回并查看熟悉的代码或者有人处理您的代码时总是很好。我只是XML的粉丝,因为1)它很容易(...) – davidcesarino 2011-06-15 13:50:42

相关问题