2017-01-29 2 views
1

У меня есть таблица, в которой хранятся страницы учебников. , работая над приложением и закончив добавлять книгу, я обнаружил, что таблица была более 200 МБ, однако PDF-файл, содержащий страницы, был всего 70 МБ 438 страниц.Необходимо изменить сжатие изображений, хранящихся в базе данных SQLite с помощью XOJO, но получить ошибку во время процесса

Проблема в том, что она сохраняет изображения в качестве максимального качества. теперь я хочу, чтобы сценарий, который проходит через каждую запись, открывает изображения и сохраняет его снова как среднее сжатие.

Я сделал набор записей и цикл, чтобы пройти через каждую запись, чтобы изменить сжатие, но приложение падает на полпути процесса.

Независимо от того, как я меняю код, он всегда сбой.

Итак, я принял другой подход и сделал цикл из 200 записей. Это хорошо, но он не изменил размер файла базы данных ???

Ошибка выполнения является UnsupportedOperationException, как показано здесь:

Error I'm getting

Это код:

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 

Как-то читает NIL после 200 записей, но это не NIL. Ошибка не происходит каждый раз на той же записи, у нее есть своя воля?

Любые предложения? Я хочу встроить функцию сжатия изображений в книгах, чтобы люди могли сделать меньшее руководство для экспорта.

ответ

1
  1. Файл базы данных автоматически не уменьшается, если вы удаляете или скомбинируете данные внутри него. Вы должны ввести команду VACCUM (например, с помощью SQLExecute("VACUUM")). Вы можете выполнить эту команду только после фиксации, поэтому сначала сделайте SQLExecute("COMMIT"). Или используйте SQLite-инструмент, такой как SQLVue, чтобы сделать это вручную.

  2. Если resize.GetData возвращает ноль, это означает, что он не может читать данные в формате JPEG. Возможно, это не данные JPEG, а GIF или что-то еще. Сначала попробуйте загрузить данные в строку и посмотрите на нее в отладчике, используя представление Binary (hex bytes), чтобы узнать, что с ним связано.

  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 
    
1

Я нашел решение, чтобы сделать код быстрее, еще есть исключения аварии OutofMemorry

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") 

Перед крушением его начать обновление моих изображений с Нилом как 15 изображений Befo re it crash

+0

Я добавил LIMIT в sql, чтобы сделать всего 200 строк, и изменил его вручную, чтобы пройти через всю таблицу в 800 строк. Теперь моя база данных меньше, и на данный момент это было непростым решением.нет ошибки, поэтому это означает, что это не потому, что поврежденные данные – Berry

+1

Возможно, Xojo здесь имеет утечку памяти. Я предлагаю вам обратиться за помощью в Xojo Forum. Это неправильное место для выяснения ошибок. –