【问题标题】:Can I store an SQLite database within another SQLite database?我可以将 SQLite 数据库存储在另一个 SQLite 数据库中吗?
【发布时间】:2013-11-05 09:36:09
【问题描述】:

我实际上使用的是旧版本的 Realbasic (2008),并且一直在使用 VB 脚本将几个小型数据库备份为 Zip 文件。

我现在发现 thnis 方法在 Windows 8 上不起作用,也不是跨平台的。

由于我希望备份在单个文件中以便它可以是增量的,因此我考虑使用大型数据库来保存较小数据库的副本。

这可能吗?

我无意为此购买插件。

【问题讨论】:

  • 可以将 zip 文件放入 blob。

标签: database sqlite realbasic


【解决方案1】:

类似于 Pauls 的回答。您可以读取要存储到 MemoryBlock 中的文件的二进制数据,然后将生成的字符串保存到数据库中。我们已经在几个应用程序中做到了这一点。不要指望它会很快,因为所有这些都是先在 RAM 中发生,然后再写入数据库。

理想情况下,我认为您希望在保存之前压缩文件/字符串。但是 Xojo 没有内置 gzip,因此您必须使用 3rd 方解决方案进行压缩或通过 Declares 进行操作系统调用。

【讨论】:

  • 您好,我似乎记得您的名字是 Bob - 如果我错了,请纠正我。正如您以前使用过这种方法一样,由于我不熟悉内存块,您能否给我一些关于该过程的指针。是否只是使用二进制流读取数据库的情况?当然欢迎所有帮助。艾伦...
  • Alan,MemoryBlock 实际上与 String 相同,只是没有编码,您可以通过其他方式访问其内容。如果您只想存储数据块,可以使用 String 或 MemoryBlock。根据经验,处理文本时使用 String,处理二进制数据时使用 MemoryBlock。
  • 您好 Thomas,感谢您的意见。我决定使用 MemoryBlock 是因为我认为 RealSQLDatabase 将大部分数据存储为二进制......尽管我在某处读到所有内容都存储为字符串。关于您的其他评论...我后来意识到可以简化代码并最终使用与您自己的代码非常相似的代码,再次感谢。我现在还拥有读取和写入数据的方法,因此我的备份程序现在应该是跨平台的。
【解决方案2】:

您可以将任何内容作为 BLOB 存储在 SQLite 表中。

您还可以考虑使用 VirtualVolume 和 BinaryStream 将 DB 文件写入单个“容器”文件。

http://docs.xojo.com/index.php/VirtualVolume

【讨论】:

  • VirtualVolume 的唯一问题是速度极慢。
  • 嗨,保罗,谢谢你的想法。我以前从未使用过虚拟卷,但它听起来像是一个方便的“工具”。我想我可以看看 BKeeneys 的建议,事实上,这是我昨天的一个想法。尽管我也没有这方面的经验,但我必须想出内存块的想法。艾伦...
【解决方案3】:

感谢 Paul 和 BKeeney 的帮助。 BKeeney 最接近,经过一些实验,我成功了!

这就是我所做的......

      //
      Dim l, p As Integer
      Dim ReadFromFile as BinaryStream
      Dim f as FolderItem

      f= GetFolderItem("Keyhoe.db3")

      If f <> Nil Then
        l = f.Length
        ReadFromFile=f.OpenAsBinaryFile( False)

        mb = New MemoryBlock(l)

        While Not ReadFromFile.EOF
          mb.byte(p) = ReadFromFile.ReadInt8
          p = p + 1
        wend

        ReadFromFile.close
      End If

      Dim dbFile as FolderItem
      Dim db as REALSQLdatabase
      db= New REALSQLdatabase
      Dim mydate as New Date
      Dim rec as DatabaseRecord

      dbFile = GetFolderItem("Backup.db3")
      db.DatabaseFile = dbFile
      If db.Connect Then
        rec = New DatabaseRecord

        rec.Column("Name") = "Keyhoe"
        rec.BlobColumn("Content") = mb.LeftB(l)
        db.InsertRecord("Databases",rec)
        db.Commit
      else
        MsgBox "Error: "+db.ErrorMessage
      End if

      msgbox "Done..."

再次感谢...我现在要做的就是弄清楚如何恢复数据库,但是有几个示例可以用于该任务。

干杯,

艾伦...

【讨论】:

  • 仅供参考:升级到 Xojo 可以让您访问 SQLiteDatabase 类,该类可以增量地从 BLOB 列中加载/加载数据。见docs.xojo.com/index.php/SQLiteDatabase.CreateBlob
  • 您好,Paul,我看过 Xojo,之前在 Real Studio 看过,坦率地说,看不到升级的好处(对我来说)。请注意,Windows 正在“发展”的方式,我不怀疑在未来的某个时候我将不得不屈服。我的另一个烦恼是,当我从 VB6 转移到 RB 开始时,我可以简单地坐下来编写一个程序。然而,现在看来,我不仅要花钱买 Xojo 软件,而且还差点要买 Monkeybread。恐怕没有。无论如何,谢谢,艾伦...
  • 您的示例中有一些多余的代码:阅读循环可以变成一行:“mb = ReadFromFile.Read(l)”。您也不需要进一步向下的“mb.LeftB(l)”,只需“mb”就足够了。
猜你喜欢
  • 1970-01-01
  • 2014-04-26
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-19
相关资源
最近更新 更多