SQLite与文本文件数据库 - 大小比较?

时间:2014-01-25 14:45:48

标签: database sqlite text converter

我要转换text db格式的SQLite文件;我担心这些问题,因为我们正在努力为它编写代码:

  • 文本文件或其对应的sqlite db是否都具有相同的大小?
  • SQLite占用的空间比文本文件少?
  • 或文本文件db是空间最小的那个?

3 个答案:

答案 0 :(得分:4)

"Hardware is cheap" - 我强烈建议不要担心尺寸差异,无论如何这可能都是微不足道的,而是选择最能满足其他需求的解决方案。文本文件可以很好地用于简单项目,但数据库具有更多功能,可以帮助您更有效,更健壮地组织,备份和查询数据。

要更深入地了解这两个选项的优缺点,请查看:database vs. flat files

答案 1 :(得分:3)

要记住的一些事情:

(关于这个答案的注释:这里的文件引用内部/外部存储,而不是SharedPrefs)

SQL:

  • 数据库有开销,占用大小
  • 如果数据库或表损坏,所有数据都会丢失(这有多糟糕取决于您的应用。丢失数千张图片:不好。丢失删除日志:不是很糟糕)
  • 可以压缩数据库(请参阅this
  • 如果您遇到ID问题(或者您识别第X行的任何方式),您可以将数据拆分到不同的表中,这意味着一个数据库可以为每个对象提供多个表,其中对象X与对象Y有识别冲突。意味着您可以将所有内容保存在一个文件中,并且仍然避免与名称冲突。 (阅读答案底部的更多内容)

文件:

  • 每个文件都必须定义为自己的单独文件,占用空间(文件名称)
  • 您无法将所有属性存储在一个文件中,而无需设置确定不同类型数据的高级阅读器。如果你不这样做,每个属性都有一个文件,你将占用大量空间。
  • 阅读数千行可能会变慢,特别是如果你有几个(比如100多个)非常大的文件

操作系统为每个文件使用空间,不包括内容。占用空间的实例文件的名称。但要记住的是,您可以将应用程序的所有数据保存在单个文件中。如果您的应用程序中两种不同类型的对象可能存在命名问题,则可以创建新数据库。

命名冲突

假设您有两个对象,对象X和Y.

情景1 '

对象X存储两个变量。文件名是(x和y在这种情况下是坐标):

x.txt
y.txt

但是在更高版本中,对象Y带有相同的两个文件。 所以你必须为对象X和Y分配一个ID:

0-x.txt
0-y.txt

每个文件仅在名称上使用3个字符(总共7个字符,包括扩展名)。随着设置越复杂,这越大。见方案2

但是保存在数据库中,您将得到ID为0的行并找到X或Y列。 您不必担心文件名。

此外,如果每个对象都保存了大量文件,则加载或保存每个文件的引用将占用大量空间。这会影响您的APK文件,并慢慢将您推向50 MB限制(谷歌播放限制)。

您可以创建通用方法,但您可以使用SQL执行相同操作并在APK文件中节省空间。但与文本文件相比,SQL确实在名称方面节省了一些空间。

但是请注意,如果您保存2-3个文件(只是为了取一个数字),那些名字的几个字节就不会重要

当你开始保存数百个文件,长名称以避免命名冲突时,就是当SQL为你节省空间时。如果桌子太大,你可以压缩它。您可以压缩文本文件以节省一些空间,但使用单行文件时,没有太多要保存的内容。

场景2

对象X和Y各有三个孩子。

每个孩子都有3个保存到文件系统的变量。如果只有一个对象有3个孩子,它可以像这样保存它

[id][variable name].txt

但是因为有另外一个父母有3个孩子(相同类型,并且他们保存相同的文件),最后保存的对象的孩子是保存的孩子。第3个被覆盖。

所以你必须添加父ID:

[parent ID][child ID][variable name].txt

请记住,这些示例主要关注一些对象。节省的空间量很少,但是当您节省数百个(如果不是数千个)文件时,即开始节省空间时。

现在,如果您创建一个表,则可以存储主对象(在这种情况下为X和Y)。然后,您可以创建第一个表,使其可以识别对象是父对象还是子对象,或者可以创建第二个表。第二个表有两个ID值;一个用于识别父母,另一个用于识别孩子。因此,如果要查找对象436的所有子节点,只需编写此查询:

SELECT * FROM childrentable WHERE `parent_id`='436'

这将为所有具有对象436作为其父级的子项提供所有属性。

返回时,所有内容都存储在Cursor中。

如果您对文件执行相同操作,则此行(其中Saver是文件保存和加载类):

Saver.load("0-436-file_name", context);

当然,可以使用for循环来循环子ID(开头为0),但是你还需要保存多少个孩子:你不能轻易获得文件,所以你必须存储关于对象数量和对象子对象的值。

这意味着您必须在更多文件中保存更多值才能获得您首先保存的文件。这是一个非常难以做到的事情。数据库可以帮助您不必编写文件来跟踪您保存的文件数量。数据库将在每个查询中返回[x]结果。因此,如果对象436没有子节点,则SQL返回0行。但是在文件中,您必须将0保存为子项数量。猜测文件名会导致I / O异常。

答案 2 :(得分:1)

我希望文本文件更小,因为它没有开销:数据库给你的所有东西都有空间成本。

听起来空间是唯一对您而言重要的事情,并且您希望经常更改文本文件的内容(您将其称为“文本文件数据库”)。请注意,没有'text file db'这样的东西。与适当的db(例如SQLite)相比,读取和写入它将非常慢。添加不同的记录类型(数据库中的表)会使您的想法变得复杂,我不想尝试在文本文件中维护记录类型之间的任何类型的引用链接。

希望有所帮助 -