在Android中解析圣经的最佳方法

Mat*_*son 7 java xml android xml-parsing

我正在创建一个需要访问圣经的Android应用程序.我希望它离线,所以我不想使用其中一个互联网API.看完这个这个帖子,我决定在本地存储文本作为XML,像这样

<bible>
<b n="Genesis">
<c n="1">
<v n="1">In the beginning, God created the heavens and the earth.</v>
Run Code Online (Sandbox Code Playgroud)

我的问题是该文件大约有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();
}
Run Code Online (Sandbox Code Playgroud)

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

我已经考虑将它存储为多个XML文件来更快地解析它(每本书的一个单独的文件)但是如果可能的话也不愿意.

我对任何建议持开放态度,包括将文本存储为XML之外的其他内容.

谢谢

Kum*_*tra 5

-首先解析的XML使用SAX, DOM, or Pull Parser,或者你可以尝试一些真棒图书馆一样JAXP and JAXB or the infamous Castor.

-其次,你可以将圣经本地存储到SQLiteDataBase中,因为SQLite只是一个没有任何服务器的文件,它的工作速度更快.它可以小到250K的大小.

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

-始终更好地保持UI工作在UI线程上,非UI工作在非UI线程上,但随着Android版本的到来,这成为一个法律HONEYCOMB.

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

-使用上述功能可以在后台执行处理器繁重的工作时保持UI 响应速度.

  • +1除此之外,我建议在`AsyncTask`中执行这些任务.它可以在第一次运行时同时运行,可能在询问用户设置或显示某种启动/加载屏幕时. (2认同)

小智 3

我只想使用SQLite作为“起点”——也就是说,为什么不呢?(好吧,实际上,现有的图书馆/图书阅读器/完善的文件模式会更好,但除此之外:-)

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

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

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