Java 资源与SQLite

Java 资源与SQLite,java,android,sqlite,resources,Java,Android,Sqlite,Resources,我试图分析使用SQLite和使用资源来开发一个需要大量文本(几本书)的应用程序之间的权衡。我读过,也读过。然而,这两种方法似乎都在将SQLite与运行时解析XML进行比较。我不知道同样的问题是否也适用于使用字符串和int资源数组。事实上,我有很多未知数,我很感激其他人能提供的任何见解 资料详情:约40本书;每本书三种语言;平均书长25章;平均章节长度25段;总共约75000段。文本按段落存储;不需要更精细的粒度。对于每种语言,应用程序的文本逻辑视图都是一个跨越所有书籍的段落数组。还有“目录”(T

我试图分析使用SQLite和使用资源来开发一个需要大量文本(几本书)的应用程序之间的权衡。我读过,也读过。然而,这两种方法似乎都在将SQLite与运行时解析XML进行比较。我不知道同样的问题是否也适用于使用字符串和int资源数组。事实上,我有很多未知数,我很感激其他人能提供的任何见解

资料详情:约40本书;每本书三种语言;平均书长25章;平均章节长度25段;总共约75000段。文本按段落存储;不需要更精细的粒度。对于每种语言,应用程序的文本逻辑视图都是一个跨越所有书籍的段落数组。还有“目录”(TOC)数据,一直到段落级别。所有数据都是严格只读的。我需要支持两种查询类型:1)用指定的语言检索段落或段落范围的文本;2) 给定段落编号,确定章节中的书籍、章节和段落偏移量。我不需要使用SQLite的任何字符串函数

我目前的分析是:

SQLite:离线创建SQLite数据库,将其打包为原始资源或资产,并在应用程序首次运行(和/或升级)时将其复制到数据库位置。我已经为此实现了一个原型数据库,其中包含六个表

  • 可以使用SQL查询数据库,因此不需要编写任何搜索算法
  • 我知道它可以处理这么多数据
  • 需要几个SQL范围查询来回答类型2查询
  • 需要两倍的空间:在.apk文件中,安装到应用程序的db区域时需要两倍的空间
  • Android的SQLite实现需要外部存储(SD卡),所以没有SD卡应用程序就无法工作。亚马逊表示,应用程序不需要SD卡,所以这样做可能会排除KindleFire的兼容性。(糟糕!)
  • 资源:离线创建xml数组资源文件的集合,并将它们复制到项目的res/values文件夹中。文本将被分成许多字符串数组:每本书每章一个数组。大约有3000个阵列。索引将作为int数组实现。对于每本书,索引数据将跨语言共享。我可能还需要生成一些类型化的数组资源,以便为生成的资源ID提供索引。我希望索引数组足够小,可以在应用程序启动时完全加载到内存中

  • 类型1查询涉及加载正确的字符串数组和访问数组元素。类型2查询涉及(已加载的)索引数据的二进制搜索
  • 我不知道Android中的资源系统是否能够处理那么多的资源阵列
  • 不知道与使用SQLite相比性能会如何
  • 我认为混合方法也是可能的:以一种方式存储TOC数据,以另一种方式存储文本本身


    再一次,我非常感谢任何有助于此分析的想法或见解。

    一个切点

    亚马逊的KindleFire应用程序指南规定,应用程序不需要SD卡,所以这样做可能会排除KindleFire的兼容性。(糟糕!)

    今天的版本实际上建议

    您可以部署一个较小的APK,它可以快速下载和安装,然后在第一次启动时下载其他资源并将它们保存在本地文件系统上

    用于更大的应用程序,而不是完全打包。此外,他们禁止的似乎是[我的]

    将任何类型的视频或音频内容复制、录制、下载、存储或类似操作到Amazon Fire TV或Fire TV Stick设备、任何SD存储卡或任何连接的外部存储器(如适用)上


    因此,该限制现在似乎已经过时。

    我的想法是将其存储为自定义xml格式,以便您可以直接查询文本的xml。API级别8是XPath支持的起点,这听起来非常适合。要补充Dan的评论:您可以压缩数据并将其推送到GZip Inputstream以节省空间。@Dan-我没有想过使用XPath。我得调查一下,看看是否合适。唯一的问题是,我们的客户希望支持API级别4,当然需要级别7的支持:(@Dan-还有,在幕后,XPath不是还需要通过xml解析才能得到一段数据吗?性能与SQLite相比如何?我还没有做过任何比较——也许自定义xml格式和自定义XPath之类的扫描仪可以帮上忙?记录重要的位置。只是我的想法。