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

Database SQLite与文本文件数据库-大小比较?,database,sqlite,text,converter,Database,Sqlite,Text,Converter,我将转换SQLitedb表单中的text文件;我之所以关注这些问题,是因为我努力为它编写代码: 文本文件或其对应的sqlite数据库的大小是否相同 SQLite会比文本文件占用更少的空间吗 或者文本文件db是空间最小的文件 我希望文本文件更小,因为它没有开销:数据库提供的所有东西都有空间成本 听起来,对您来说,空间是唯一重要的东西,您希望经常更改文本文件的内容(您称之为“文本文件数据库”)。请注意,没有“文本文件数据库”这样的东西。与适当的数据库(如SQLite)相比,对它的读写速度将非常慢。

我将转换
SQLite
db表单中的
text
文件;我之所以关注这些问题,是因为我努力为它编写代码:

  • 文本文件或其对应的sqlite数据库的大小是否相同
  • SQLite会比文本文件占用更少的空间吗
  • 或者文本文件db是空间最小的文件

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

      听起来,对您来说,空间是唯一重要的东西,您希望经常更改文本文件的内容(您称之为“文本文件数据库”)。请注意,没有“文本文件数据库”这样的东西。与适当的数据库(如SQLite)相比,对它的读写速度将非常慢。添加不同的记录类型(数据库中的表)会使您的操作复杂化,我不想尝试在文本文件中的记录类型之间维护任何类型的引用链接

      希望这能有所帮助-

      -我强烈建议不要担心尺寸差异,因为尺寸差异可能无关紧要,而应该选择最能满足您其他需求的解决方案。文本文件可以很好地用于简单的项目,但数据库具有更多的功能,可以帮助您更高效、更稳健地组织、备份和查询数据


      要更深入地了解这两种选择的利弊,请查看:

      一些需要记住的事情:

      (关于此答案的说明:此处的文件引用内部/外部存储,而不是SharedPref)

      SQL:

      • 数据库有开销,这确实占用了很大的空间
      • 如果数据库或表损坏,则所有数据都会丢失(具体情况取决于您的应用程序。丢失数千张图片:不好。丢失删除日志:不太坏)
      • 可以压缩数据库(请参阅)
      • 如果ID有问题(或以任何方式标识行X),则可以将数据拆分为不同的表,这意味着一个数据库可以为每个对象提供多个表,其中对象X与对象Y存在标识冲突。这基本上意味着您可以将所有内容保存在一个文件中,并且仍然避免与名称冲突。(请阅读答案底部的更多内容)
      档案:

      • 每个文件都必须定义为它自己的独立文件,这会占用空间(文件名)
      • 如果不设置确定不同数据类型的高级读取器,则无法将所有属性存储在一个文件中。如果不这样做,并且每个属性都有一个文件,则会占用大量空间
      • 阅读数千行可能会变慢,尤其是当你有几个(比如100+个)非常大的文件时
      操作系统为每个文件使用空间,不包括内容。占用空间的实例的文件名。但需要记住的是,你可以将一个应用程序的所有数据保存在一个文件中。如果您有一个应用程序,其中两种不同类型的对象可能存在命名问题,则可以创建一个新数据库


      命名冲突

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

      场景1'

      对象X存储两个变量。文件名为(本例中x和y为坐标):

      但在更高版本中,对象Y附带了相同的两个文件。 因此,您必须为对象X和Y指定一个ID:

      0-x.txt
      0-y.txt
      
      每个文件仅在名称上使用3个字符(总共7个,包括扩展名)。设置越复杂,该值越大。参见场景2

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

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

      您可以创建通用方法,但也可以使用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作为其父对象的所有子对象的所有属性

      返回时,所有内容都存储在游标中

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

      当然,可以使用for循环来循环子循环
      SELECT * FROM childrentable WHERE `parent_id`='436'
      
      Saver.load("0-436-file_name", context);