1

我有一个存储说明书页面的表格。在开发应用程序并添加完一本指导书时,我发现该表超过 200MB,但包含页面的 PDF 只有 70MB 438 页。

问题是它将图像保存为最高质量。现在我想制作一个遍历每条记录的脚本,打开图像并将其再次保存为中等压缩。

我已经制作了一个记录集和一个循环来遍历每条记录以更改压缩率,但是应用程序在过程中途崩溃了。

无论我如何更改代码,它总是崩溃。

所以我采取了另一种方法并制作了一个包含 200 条记录的 for 循环。这很顺利,但它并没有改变数据库的文件大小???

运行时错误是UnsupportedOperationException,如下所示:

我得到的错误

这是代码:

  dim rs as RecordSet
  rs=lego.LegoData.SQLSelect("SELECT * FROM Books")
  dim resize as Picture
  while not rs.EOF
    resize = picture.FromData(rs.Field("intructions").StringValue)
    rs.Edit
    rs.Field("intructions").StringValue = resize.GetData(Picture.FormatJPEG, Picture.QualityMedium)
    rs.Update
    rs.MoveNext
  wend

不知何故,它会在 200 条记录后读取NIL,但不是NIL. 错误不是每次都发生在同一条记录上,它有它自己的意志吗?

有什么建议么?我还想内置书籍图像压缩功能,以便人们可以使导出的手册更小。

4

2 回答 2

2
  1. 如果您删除或压缩其中的数据,数据库文件不会自动变小。您必须发出VACCUM命令(例如使用SQLExecute("VACUUM"))。您只能在提交后发出该命令,因此首先执行SQLExecute("COMMIT"). 或者使用 SQLite 工具(例如 SQLVue)手动完成。

  2. 如果resize.GetData返回 nil,则表示它无法读取 JPEG 格式的数据。也许它不是 JPEG 数据,而是 GIF 或其他东西。尝试先将数据加载到字符串中,然后在调试器中查看它,使用二进制(十六进制字节)视图来查看它的情况。

  3. 如果遇到异常,请将代码包装在一个try块中以防止应用停止,如下所示:

    try
      resize = picture.FromData(rs.Field("intructions").StringValue)
    catch exc as RuntimeException
      // The image could not be loaded - let's skip it
      rs.MoveNext
      continue
    end try
    
于 2017-01-29T16:34:28.520 回答
1

我找到了一种使代码更快的解决方案,但仍然出现崩溃 OutofMemory 异常

  dim rs as RecordSet
  dim pic as RecordSet
  rs=lego.LegoData.SQLSelect("SELECT ID, SETID, Page FROM Books")
  dim resize as Picture
  dim count as Integer = 0
  while not rs.EOF
    pic = LegoData.SQLSelect("Select ID, Intructions FROM Books WHERE ID = " + Str(rs.Field("ID").IntegerValue))
    if pic <> nil then
      if len(pic.Field("intructions").StringValue) > 0 then
        resize = picture.FromData(pic.Field("intructions").StringValue)
        pic.Edit
        pic.Field("intructions").StringValue = resize.GetData(Picture.FormatJPEG, Picture.QualityMedium)
        pic.Update
        if count = 100 then
          LegoData.SQLExecute("COMMIT")
          LegoData.SQLExecute("VACUUM")
          count = 0
        else
          count = count + 1
        end if
      end if
    end if
    rs.MoveNext
  wend
  LegoData.SQLExecute("COMMIT")
  LegoData.SQLExecute("VACUUM")

在崩溃之前它开始用 Nil 更新我的图像,比如崩溃之前的 15 张图像

于 2017-01-30T01:55:34.653 回答