2017-01-29 8 views
1

私は教科書のページを格納するテーブルを持っています。 アプリで作業していてインスタントブックを追加し終わったところ、テーブルが200MBを超えていたが、そのページを含むPDFはわずか70MBの438ページだった。XOJOでSQLiteデータベースに保存された画像の圧縮を変更する必要がありますが、処理中にエラーが発生します

問題は、画像を最大品質で保存することです。今私は、すべてのレコードを上書きするスクリプトを作成して、画像を開き、再び中間圧縮として保存したいと考えています。

私はレコードセットとループを作成して圧縮を変更するために各レコードを調べましたが、アプリケーションがプロセスの途中でクラッシュします。

コードを変更しても、いつでもクラッシュします。

私は他のアプローチをとって200レコードのforループを作成しました。 これはうまくいきましたが、データベースのファイルサイズは変更されませんでしたか?ここに示されているよう

ランタイムエラーが、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")を実行してください。または、SQLVueなどのSQLiteツールを使用して手作業で行います。

  2. resize.GetDataがnilを返す場合、データをJPEGとして読み取ることができないことを意味します。たぶんそれはJPEGデータではなく、GIFまたは他のものです。最初に文字列にデータを読み込み、デバッガでバイナリ(16進バイト)ビューを使用してその内容を確認します。

  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

私は、高速なコードを作るための解決策を見つけました、まだそのスタートはbefo 15枚の画像のように無記号 と私の画像を更新する前にクラッシュクラッシュ 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") 

を持ちますそれがクラッシュする

+0

SQLにLIMITを追加して200行のみを実行し、それを手動で変更してテーブル全体800+個の行に移動しました。私のデータベースは今は小さく、今すぐ迅速な回避策でした。エラーがないので、データが破損しているためではありません。 – Berry

+1

Xojoにメモリリークが発生している可能性があります。代わりにXojoフォーラムで助けを求めることをお勧めします。これはバグを発見するのに適切な場所ではありません。 –

関連する問題