【问题标题】:best method for xml data storagexml数据存储的最佳方法
【发布时间】:2011-09-14 21:12:10
【问题描述】:

我是一名 php/mysql 开发者,学习 android。我正在创建一个从我的 php 应用程序接收信息的 android 应用程序,以创建不同产品的列表视图,这将打开该产品详细信息的 Web 视图。

目前我的 php cms Web 应用程序为 iphone 应用程序输出 xml 列表....(另外,单独输出 html)。我完全控制了 php 应用程序,所以如果有更好的方法来输出 android 应用程序的数据,请告诉我。

我创建了从 Web 读取 xml 并创建列表视图的代码。列表可以每天刷新,所以不需要每次应用启动时都从在线的xml中读取数据。

所以我正在考虑将检索到的数据存储在本地,以提高我的应用响应能力。在任何给定时间,最多可以将 500 个产品描述存储在最多 30 个不同的 xml 列表中。我从一个包含大约 30 种产品的 xml 列表开始开发。

为了获得最佳性能,我应该将产品信息存储在 sqlLite db 中,还是应该将实际的 xml 文件存储在 cache/db 或其他方法(如应用程序缓存)中。

我还想将数据更新创建为服务,这是个好主意吗?

【问题讨论】:

    标签: android xml http sqlite optimization


    【解决方案1】:

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

    我建议您将数据存储在 sqlite android 数据库中。

    您还可以考虑压缩 xml 以加快网络传输并通过 java.util.zip 包类进行解压缩。您甚至可以考虑一种更简单的数据传输格式,比 xml 更简洁,使用数据输入/输出流。 (我在我的应用程序中这样做,效果很好)

    以下是数据输入/输出流方法的一些细节:

    • 为您的数据设想一个专有协议,只满足您的需要。没有标签,没有属性,只是按顺序排列的原始值。
    • 在客户端,使用 URL.getContent() 获取数据的输入流并将其转换为输入流。
    • 仍然在客户端,构建一个数据输入流,封装您的套接字输入流并按顺序读取数据。使用 readInt、readDouble、readUTF 等。
    • 在客户端,从 php 开始,您需要找到一种方法以与客户端期望的数据格式兼容的格式保存数据。我对 PHP 不太了解,我只使用 java 编程。

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

    如果php不能以合适的方式保存格式,使用xml,会简单很多。首先尝试使用纯 xml,然后尝试使用 zip、tarball 或 xml 文件。

    但这一切都是关于网络连接期间的速度增益。

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

    【讨论】:

    • 谢谢 Stéphane,你能扩展 RAM 和 datainput/outputstream 方法吗?这些将如何工作?如果我选择 sqlite 方法,我应该将整个 xml 保存为记录还是应该解析并保存字段中的数据?
    • @Traveling_Monk 我将在 anwser 中详细介绍数据对象输入流。对于 RAM,我的意思是没有什么比在 RAM、内存中、在列表或适配器中加载数据更快的了。但如果您不想在应用退出时删除数据,这还不够。
    【解决方案2】:

    对此很抱歉,但是写评论太长了。这不是要回答您的问题,因为在我看来,Stéphane 回答得很好。最好的解决方案确实是将数据存储在 sqlite 数据库中。然后,您需要创建一个类以用作数据、数据库和应用程序之间的连接。我不想因为这里已经说过的话而受到赞扬(我也投了赞成票)。

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

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

    每当我需要处理未知、晦涩和任意的数据块序列时,它都会让我哭泣。记住为什么我们应该使用未知格式总是好的:

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

    最后,如果目的是避免 XML 的典型冗长,无论出于何种原因,您都有多种选择。现在我能想到 CSV,但我不是数据存储方面的专家,所以如果你不习惯它,我相信你可以找到具有大量现成 API 的好的替代方案。

    祝你好运!

    【讨论】:

    • 谢谢你为什么不自己DIY流的原因,我不期待那种方法。 CSV,嗯,这可能会使插入数据库变得非常容易,android 上的 sqlite 是否支持LOAD DATA INFILE?还是我应该像this 一样阅读它?
    • 好点@David。当然,创建专有协议始终是一个仅依赖于性能(或糟糕的混淆尝试)的决定。尽管如此,它是有效的。但正如你所提到的,csv 可以完成这项工作甚至更好:JSON!
    • Snicolas:JSON +1。你说得对。一开始它很有效,但我想知道值得权衡的效率有多少。我知道规则不是一成不变的,常识是(这就是为什么我说你的答案是 100% 正确的)。说...对于非常小的批量数据应用程序,当然可以应用,而 XML 将是无用的。但是在一般的应用程序上,我认为它不值得,并且随着应用程序的增长,这种差异越来越难以察觉。但是返回并查看熟悉的代码,或者当有人处理您的代码时总是好的。我只是 XML 的粉丝,因为 1) 它很容易 (...)
    • (...) 可用,非常常见,2) 我相信它更具可扩展性:在这个网络时代,XML 因其可扩展性和适用于不同目的而具有优势。 3) 您可以使用非常苗条的 XML 实现,所有这些都符合标准。它们的大小可以与 JSON 相媲美(但我不确定性能,因为我从未在 Android 中使用过 JSON)。无论如何,由于 XML 和 (IIRC) JSON 在 Android 公共 API 中都可用,我确信任何替代方案都将受益于 Android 团队为 API 提供的最终性能优化。我会选择任何我觉得舒服的。 (...)
    • (...) 和尚:我不知道。也许 sqlite .import 命令会起作用?尝试谷歌搜索。祝你好运!
    猜你喜欢
    • 2012-12-21
    • 2012-04-18
    • 2020-04-24
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    相关资源
    最近更新 更多