2017-01-29 8 views
1

J'ai une table qui stocke les pages du manuel d'instructions. tout en travaillant sur l'application et fini d'ajouter un livre d'instuction, j'ai trouvé que la table était plus de 200 Mo, mais le fichier PDF contenant les pages était seulement 70MB 438 Pages.Vous devez modifier la compression des images stockées dans la base de données SQLite avec XOJO mais obtenir une erreur pendant le processus

Le problème est qu'il enregistre les images en qualité maximale. Maintenant, je veux faire un script qui va sur chaque enregistrement ouvre les images et l'enregistre à nouveau comme une compression moyenne.

J'ai créé un ensemble d'enregistrements et une boucle pour parcourir chaque enregistrement afin de changer la compression, mais l'application se bloque à mi-chemin du processus.

Peu importe comment je change le code, il se bloque toujours.

J'ai donc pris une autre approche et fait une boucle de 200 enregistrements. Cela se passe bien, mais il n'a pas changé la taille du fichier de la base de données ???

L'erreur d'exécution est un UnsupportedOperationException, comme indiqué ici:

Error I'm getting

Voici le code:

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 

D'une certaine façon, il lit NIL après 200 dossiers, mais ce n'est pas NIL. L'erreur ne se produit pas chaque fois au même enregistrement, il a sa propre volonté?

Des suggestions? Je veux intégrer une fonction de compression d'image de livre ainsi les gens peuvent rendre le manuel exporté plus petit.

Répondre

1
  1. Le fichier de base de données n'est pas automatiquement réduit si vous supprimez ou compactez des données à l'intérieur. Vous devez émettre la commande VACCUM (par exemple avec SQLExecute("VACUUM")). Vous pouvez exécuter cette commande uniquement après l'avoir validée. Commencez par créer un SQLExecute("COMMIT"). Ou utilisez un outil SQLite tel que SQLVue pour le faire à la main.

  2. Si resize.GetData renvoie zéro, cela signifie qu'il ne peut pas lire les données au format JPEG. Peut-être que ce n'est pas dans les données JPEG mais un GIF ou autre chose. Essayez d'abord de charger les données dans une chaîne et regardez-la dans le débogueur, en utilisant la vue Binary (hex octets) pour voir ce qu'il en est.

  3. Si vous obtenez une exception, Enroulez le code dans un bloc try de maintenir l'application de l'arrêt, comme ceci:

    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

J'ai trouvé une solution pour accélérer le code, ayant toujours l'accident OutofMemorry exception

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

Avant le crash de son départ mettre à jour mes images avec Nil comme 15 images bEFO re it crash

+0

J'ai ajouté une limite au sql pour ne faire que 200 lignes, et l'ai changé manuellement pour parcourir toute la table de 800+ lignes. Ma base de données est plus petite maintenant, et était une solution de contournement rapide pour le moment.pas d'erreur, cela signifie que ce n'est pas parce que des données corrompues – Berry

+1

Il se peut que Xojo ait une fuite de mémoire ici. Je vous suggère de demander l'aide du forum Xojo. Ce n'est pas le bon endroit pour trouver des bugs. –