我正在创建一个需要访问圣经的Android应用。我希望它离线,所以我不想使用其中一个互联网API。阅读此this帖后,我决定将文本本地存储为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以外的其他内容。
由于
答案 0 :(得分:5)
- 首先解析 XML
使用SAX, DOM, or Pull Parser
,或者您可以尝试一些非常棒的库JAXP and JAXB or the infamous Castor
。< / p>
- 其次,您可以将圣经本地存储到SQLite
数据库中,因为SQLite只是一个单个文件,没有任何服务器,它的工作速度更快。它可以小到250K。
///////////////////编辑部分/////////////////////// //////// 强>
- 保持 UI在UI线程上工作,非UI在非UI线程上工作总是更好,但这变成了 LAW < / strong>随着HONEYCOMB
版Android的到来。
- 因此,您可以使用Thread along with Handler
,也可以选择使用Android提供的更简单的选项,即 PainLess Threading ,其{{1} }
- 使用上述方法可以保持AsyncTask
响应,同时在后台执行处理器繁重的工作。
答案 1 :(得分:3)
我只会使用SQLite作为“起点” - 也就是说,为什么不? (嗯,真的,现有的图书馆/图书阅读器/完善的文件架构会更好,但除非: - )
SQLite具有非常高效的“磁盘上”访问权限 - 例如无需“解析”内存或读取整个文件 - 它支持对索引的有效搜索(例如查找特定的诗句或在Exodus中获取第2章到第12章)。我希望SQLite数据库和原始XML文件具有可比较的文件大小(假设XML是UTF-8编码的)。
然后创建一个程序/函数将XML“加载”到SQLite数据库中的相应模式中 - 这可以提前完成(例如在PC上然后分发预填充的SQLite数据库文件)或第一个时间表示XML已加载到客户端上。这可以与现在的读取代码有效相同。只需用“更新数据库”替换“做某事”。
我会避免使用文件分割方法,除非有一个特别好的理由 - 它会使找到特定章节/节目更快,但它并不真正“解决问题”。由于它使用顺序读取器而不是完整的DOM,因此不一定会导致更少的内存 - 它只会在搜索时限制垃圾“读取”(然后丢弃)。但话说回来,为什么不 SQLite?
答案 2 :(得分:1)
我的建议是使用除XML之外的其他内容。请注意,我不一般都有针对XML的内容;只是想明确这一点,因为有很多人认为XML对任何东西都不好。
以下是在这种情况下使用XML的一些预期后果:
查找时间
这会使您跳到文本中的特定位置总是昂贵。 XML将为您提供两种方法:
<强>紧强>
将整个圣经转换为XML文件将使其成为 HUGE 。当然还有Fast Infoset和Efficient XML等解决方案(Infoset的二进制编码,XML背后的数据模型)。这会有所帮助,但也许不是很多。 Gzip可能会减少到大约。原始大小的1/3,这也会有所帮助,但它仍然很大。
该怎么做?
我的建议是考虑你的圣经文本的二进制编码;一个针对快速查找进行了优化的方法。比如,在文件中有索引,将位置(一节)映射到实际文本片段开始的偏移量。如果你正确地做到这一点,甚至可以获得比XML更紧凑的东西。
<强>哈德吗
这听起来更难,但实际上,它可能不会。您也可以考虑查看Preon,因为Preon也已在Android上使用,并允许您以声明方式将内存数据结构映射到其二进制编码表示中。框架本身将确定是否有机会从输入文件中懒惰地加载数据。