7

我正在创建一个需要访问圣经的 Android 应用程序。我希望它离线,所以我不喜欢使用其中一种互联网 API。读完这篇文章后,我决定将文本本地存储为 XML,就像这样

<bible>
<b n="Genesis">
<c n="1">
<v n="1">In the beginning, God created the heavens and the earth.</v>

我的问题是该文件几乎有 34,000 行长(4.4 MB),并且解析整个文本需要很长时间(几分钟)。

现在我正在使用 XmlPullParser,就像这样

XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
XmlPullParser xpp = factory.newPullParser();

InputStream iStream = getResources().openRawResource(R.raw.bible);
BufferedReader reader = new BufferedReader(new InputStreamReader(iStream));
xpp.setInput(reader);

int eventType = xpp.getEventType();

while (eventType != XmlPullParser.END_DOCUMENT)
{
    // do something here
    eventType = xpp.next();
}

有没有更好的方法在 Android 上本地存储和/或访问圣经?

我考虑将它存储为多个 XML 文件以更快地解析它(每本书一个单独的文件),但如果可能的话,我不希望这样做。

我愿意接受任何建议,包括将文本存储为 XML 以外的其他内容。

谢谢

4

3 回答 3

5

-首先解析使用XMLSAX, DOM, or Pull Parser或者你可以尝试一些很棒的库,比如JAXP and JAXB or the infamous Castor.

-其次,您可以将圣经本地存储到SQLite数据库中,由于 SQLite 只是一个没有任何服务器的文件,它的工作速度相当快。它的大小可以小至 250K。

//////////////// 编辑部分 //////////////////////// //

-UI 工作在 UI Thread 上总是更好,而 Non-UI 工作在 Non-UI 线程上总是更好,但是随着Android 版本的到来,这成为了一个法律。HONEYCOMB

-所以你可以使用Thread along with Handler,或者选择使用 Android 提供的更简单的选项,称为PainLess Threading,它的AsyncTask

-当您在后台执行处理器繁重的工作时,使用上述内容将保持您的UI 响应速度。

于 2012-10-26T05:27:46.200 回答
3

我只是将SQLite用作“起点”——也就是说,为什么不呢?(嗯,真的,现有的图书馆/图书阅读器/完善的文件模式会更好,但除非:-)

SQLite 具有非常高效的“磁盘”访问——例如,无需“解析”到内存或读取整个文件——并且它支持对索引的有效搜索(例如查找特定的诗句或获取 Exodus 中的第 2 章到第 12 章)。我希望 SQLite 数据库和原始 XML 文件都具有相当的文件大小(假设 XML 是 UTF-8 编码的)。

然后制作一个程序/函数将 XML“加载”到 SQLite 数据库中的适当模式中 - 这可以提前完成(例如,在 PC 上,然后分发预填充的 SQLite 数据库文件)或第一次说 XML加载到客户端。这实际上可以是与现在相同的阅读代码..只需将“做某事”替换为“更新数据库”即可。

除非有特别好的理由,否则我会避免使用文件拆分方法——它可以更快地找到特定的章节/诗句,但它并不能真正“解决问题”。由于它使用的是顺序读取器而不是完整的 DOM,它不一定会导致内存减少 - 它只会限制垃圾在搜索时“读取”(然后丢弃)。但话又说回来,为什么不是SQLite?

于 2012-10-26T05:14:34.923 回答
1

我的建议是使用 XML 以外的其他东西。请注意,我一般对 XML没有任何意见。只是想清楚一点,因为那里有很多人认为 XML 对任何事情都没有好处。

以下是在这种情况下使用 XML 的一些预期后果:

查找时间

这会使跳转到文本中的特定位置总是很昂贵。XML 将为您提供两种方法:

  1. 以流式方式阅读整个文档,直到找到要查找的片段。非常慢。
  2. 将整个文档读入内存数据结构,这将允许您创建从某种位置标识符到实际文本片段的内存索引。在内存消耗方面非常昂贵。

紧凑

将整本圣经变成一个 XML 文件会变得非常庞大。当然有诸如Fast InfosetEfficient XMLInfoset的二进制编码, XML 背后的数据模型)之类的解决方案。这会有所帮助,但可能不会有太大帮助。Gzip 可能会减少到大约。原始大小的 1/3,这又会有所帮助,但它仍然会很大。

该怎么做?

我的建议是考虑对圣经文本进行二进制编码;一种为快速查找而优化的。就像,在文件中有一个索引将位置(诗句)映射到实际文本片段开始的偏移量。如果你做得好,甚至还有比 XML 更紧凑的东西的好处。

更难?

这听起来要困难得多,但实际上可能不会。您还可以考虑查看Preon,因为 Preon 也已在 Android 上使用,并且允许您以声明方式将内存中的数据结构映射到其二进制编码表示。框架本身会判断是否有机会从输入文件中延迟加载数据。

于 2012-10-26T06:39:29.223 回答