Определение момента распаковки zip базы данных - PullRequest
2 голосов
/ 16 апреля 2010

При первоначальном запуске приложения AIR (после 1-й установки) я получаю zip zip, который затем распаковываю с помощью FZip.После этой операции мне немедленно нужно загрузить данные из сгенерированной базы данных sqlite, что не удается, поскольку я не могу определить, когда zip полностью распакован и / или был создан sqlite.

Есть предложения?Спасибо!

  • Для ясности: я отправляю событие в Cairngorm, конечно, после того, как моя операция с результатами была выполнена, но этого недостаточно.

1 Ответ

1 голос
/ 29 августа 2010

Ну, у вас вроде есть ответ в вопросе.

Я быстро взглянул на FZip документы и заметил, что событие отправляется, когда ZIP-файл загружен.

Просто сканирование по коду, в FZipLibrary.as есть метод processNext () который содержит цикл while для просмотра файлов в архиве. Вы можете добавить константу FILE_PARSED в FZipEvent и отправить такое событие оттуда после завершения цикла while.

Я не могу сейчас попробовать это проверить, но вот что я имею в виду:

/*
 * Copyright (C) 2006 Claus Wahlers and Max Herkender
 *
 * This software is provided 'as-is', without any express or implied
 * warranty.  In no event will the authors be held liable for any damages
 * arising from the use of this software.
 *
 * Permission is granted to anyone to use this software for any purpose,
 * including commercial applications, and to alter it and redistribute it
 * freely, subject to the following restrictions:
 *
 * 1. The origin of this software must not be misrepresented; you must not
 *    claim that you wrote the original software. If you use this software
 *    in a product, an acknowledgment in the product documentation would be
 *    appreciated but is not required.
 * 2. Altered source versions must be plainly marked as such, and must not be
 *    misrepresented as being the original software.
 * 3. This notice may not be removed or altered from any source distribution.
 */

package deng.fzip
{
    import deng.fzip.FZipFile;
    import flash.events.Event;

    /**
     * FZip dispatches FZipEvent objects when a file contained in the
     * ZIP archive has finished loading and can be accessed. There is 
     * only one type of FZipEvent: FZipErrorEvent.FILE_LOADED.
     */     
    public class FZipEvent extends Event
    {
        /**
        * The file that has finished loading.
        */      
        public var file:FZipFile;

        /**
        * Defines the value of the type property of a FZipEvent object.
        */      
        public static const FILE_LOADED:String = "fileLoaded";

        /**
        * Zip contents were parsed
        */      
        public static const FILE_PARSED:String = "fileParsed";

        /**
         * Constructor
         * 
         * @param type The type of the event. Event listeners can 
         * access this information through the inherited type property. 
         * There is only one type of FZipEvent: 
         * FZipEvent.PARSE_ERROR.
         * 
         * @param file The file that has finished loading.
         * 
         * @param bubbles Determines whether the Event object participates 
         * in the bubbling stage of the event flow. Event listeners can 
         * access this information through the inherited bubbles property.
         * 
         * @param cancelable Determines whether the Event object can be 
         * canceled. Event listeners can access this information through 
         * the inherited cancelable property.
         */     
        public function FZipEvent(type:String, file:FZipFile = null, bubbles:Boolean = false, cancelable:Boolean = false) {
            this.file = file;
            super(type, bubbles, cancelable);
        }

        /**
         * Creates a copy of the FZipEvent object and sets the value 
         * of each property to match that of the original.
         * 
         * @return A new FZipEvent object with property values that 
         * match those of the original.
         */     
        override public function clone():Event {
            return new FZipEvent(type, file, bubbles, cancelable);
        }
    }
}

Это было бы просто добавлением константы для события.

<code>/*
 * Copyright (C) 2006 Claus Wahlers and Max Herkender
 *
 * This software is provided 'as-is', without any express or implied
 * warranty.  In no event will the authors be held liable for any damages
 * arising from the use of this software.
 *
 * Permission is granted to anyone to use this software for any purpose,
 * including commercial applications, and to alter it and redistribute it
 * freely, subject to the following restrictions:
 *
 * 1. The origin of this software must not be misrepresented; you must not
 *    claim that you wrote the original software. If you use this software
 *    in a product, an acknowledgment in the product documentation would be
 *    appreciated but is not required.
 * 2. Altered source versions must be plainly marked as such, and must not be
 *    misrepresented as being the original software.
 * 3. This notice may not be removed or altered from any source distribution.
 */

package deng.fzip {
    import flash.events.*;
    import flash.display.Bitmap;
    import flash.display.BitmapData;
    import flash.display.DisplayObject;
    import flash.display.Loader;
    import flash.utils.ByteArray;

    /**
     * Dispatched when all pending files have been processed. 
     *
     * @eventType flash.events.Event.COMPLETE 
     */
    [Event(name="complete", type="flash.events.Event")]

    /**
     * <p>FZipLibrary works with a FZip instance to load files as
     * usable instances, like a DisplayObject or BitmapData. Each file
     * from a loaded zip is processed based on their file extentions.
     * More than one FZip instance can be supplied, and if it is
     * currently loading files, then FZipLibrary will wait for incoming
     * files before it completes.</p>
     * 
     * <p>Flash's built-in Loader class is used to convert formats, so the
     * only formats currently supported are ones that Loader supports.
     * As of this writing they are SWF, JPEG, GIF, and PNG.</p>
     * 
     * <p>The following example loads an external zip file, outputs the
     * width and height of an image and then loads a sound from a SWF file.</p>
     * 
     * <pre>
     * package {
     *  import flash.events.*;
     *  import flash.display.BitmapData;
     *  import deng.fzip.FZip;
     *  import deng.fzip.FZipLibrary;
     *  
     *  public class Example {
     *      private var lib:FZipLibrary;
     *      
     *      public function Example(url:String) {
     *          lib = new FZipLibrary();
     *          lib.formatAsBitmapData(".gif");
     *          lib.formatAsBitmapData(".jpg");
     *          lib.formatAsBitmapData(".png");
     *          lib.formatAsDisplayObject(".swf");
     *          lib.addEventListener(Event.COMPLETE,onLoad);
     *          
     *          var zip:FZip = new FZip();
     *          zip.load(url);
     *          lib.addZip(zip);
     *      }
     *      private function onLoad(evt:Event) {
     *          var image:BitmapData = lib.getBitmapData("test.png");
     *          trace("Size: " + image.width + "x" + image.height);
     *          
     *          var importedSound:Class = lib.getDefinition("data.swf", "SoundClass") as Class;
     *          var snd:Sound = new importedSound() as Sound;
     *      }
     *  }
     * }
* * @see http://livedocs.macromedia.com/flex/201/langref/flash/display/Loader.html * / открытый класс FZipLibrary расширяет EventDispatcher { статическое приватное const FORMAT_BITMAPDATA: uint = (1 << 0); статическое приватное const FORMAT_DISPLAYOBJECT: uint = (1 << 1); приватная переменная pendingFiles: Array = []; приватная переменная pendingZips: Array = []; приватная переменная currentState: uint = 0; приватная переменная currentFilename: String; приватная переменная currentZip: FZip; приватная переменная currentLoader: Loader; приватная переменная bitmapDataFormat: RegExp = / [] /; приватная переменная displayObjectFormat: RegExp = / [] /; private var bitmapDataList: Object = {}; приватная переменная displayObjectList: Object = {}; / ** * Конструктор * / публичная функция FZipLibrary () { } / ** * Используйте этот метод для добавления экземпляра FZip в очередь обработки. * Если указанный экземпляр FZip не активен (в данный момент принимает файлы) * когда он обработан, будут обрабатываться только файлы, которые уже загружены. * * @param zip Экземпляр FZip для обработки * / публичная функция addZip (zip: FZip): void { pendingZips.unshift (почтовый); processNext (); } / ** * Используется для указания расширения файла, которое запускает форматирование в BitmapData. * * @param ext Расширение файла (".jpg", ".png" и т. д.) * / публичная функция formatAsBitmapData (ext: String): void { bitmapDataFormat = addExtension (bitmapDataFormat, ext); } / ** * Используется для указания расширения файла, которое запускает форматирование в DisplayObject. * * @param ext Расширение файла (".swf", ".png" и т. д.) * / открытая функция formatAsDisplayObject (ext: String): void { displayObjectFormat = addExtension (displayObjectFormat, ext); } / ** * @частный * / приватная функция addExtension (оригинал: RegExp, ext: String): RegExp { вернуть новый RegExp (ext.replace (/ [^ A-Za-z0-9] /, "\\ $ &") + "$ |" + original.source); } / ** * Запрос файла, который был отформатирован как BitmapData. * ReferenceError выбрасывается, если файл не существует как * BitmapData. * * @param filename Имя файла экземпляра BitmapData. * / публичная функция getBitmapData (имя файла: String): BitmapData { if (! bitmapDataList [имя_файла] равно BitmapData) { выбросить новую ошибку ("Файл \" "+ имя файла +" \ "не найден как BitmapData"); } вернуть bitmapDataList [имя файла] как BitmapData; } / ** * Запрос файла, который был отформатирован как DisplayObject. * ReferenceError выбрасывается, если файл не существует как * DisplayObject. * * @param filename Имя файла экземпляра DisplayObject. * / публичная функция getDisplayObject (filename: String): DisplayObject { if (! displayObjectList.hasOwnProperty (filename)) { throw new ReferenceError ("File \" "+ filename +" \ "не был найден как DisplayObject"); } вернуть displayObjectList [имя файла] как DisplayObject; } / *** Получить определение (например, класс) из SWF-файла, который имеет * был отформатирован как DisplayObject. * ReferenceError выбрасывается, если файл не существует как * DisplayObject или определение не существует. * * @param filename Имя файла экземпляра DisplayObject. * / публичная функция getDefinition (имя файла: строка, определение: строка): объект { if (! displayObjectList.hasOwnProperty (filename)) { throw new ReferenceError ("File \" "+ filename +" \ "не был найден как DisplayObject,"); } var disp: DisplayObject = displayObjectList [имя файла] как DisplayObject; пытаться { return disp.loaderInfo.applicationDomain.getDefinition (определение); } catch (e: ReferenceError) { сгенерировать новый ReferenceError («Определение» + «определение +» \ «в файле \» «+ имя файла +» \ «не может быть получено:« + e.message); } вернуть ноль; } / ** * @частный * / приватная функция processNext (evt: Event = null): void { while (currentState === 0) { if (pendingFiles.length> 0) { var nextFile: FZipFile = pendingFiles.pop (); if (bitmapDataFormat.test (nextFile.filename)) { currentState | = FORMAT_BITMAPDATA; } if (displayObjectFormat.test (nextFile.filename)) { currentState | = FORMAT_DISPLAYOBJECT; } if ((currentState & (FORMAT_BITMAPDATA | FORMAT_DISPLAYOBJECT))! == 0) { currentFilename = nextFile.filename; currentLoader = новый Loader (); currentLoader.contentLoaderInfo.addEventListener (Event.COMPLETE, loaderCompleteHandler); currentLoader.contentLoaderInfo.addEventListener (IOErrorEvent.IO_ERROR, loaderCompleteHandler); var content: ByteArray = nextFile.content; content.position = 0; currentLoader.loadBytes (содержание); перерыв; } } else if (currentZip == null) { if (pendingZips.length> 0) { currentZip = pendingZips.pop (); var i: uint = currentZip.getFileCount (); while (i> 0) { pendingFiles.push (currentZip.getFileAt (- я)); } if (currentZip.active) { currentZip.addEventListener (Event.COMPLETE, zipCompleteHandler); currentZip.addEventListener (FZipEvent.FILE_LOADED, fileCompleteHandler); currentZip.addEventListener (FZipErrorEvent.PARSE_ERROR, zipCompleteHandler); перерыв; } еще { currentZip = null; } } еще { dispatchEvent (new Event (Event.COMPLETE)); перерыв; } } еще { перерыв; } } dispatchEvent (новый FZipEvent (FZipEvent.FILE_PARSED)); } / ** * @частный * / приватная функция loaderCompleteHandler (evt: Event): void { if ((currentState & FORMAT_BITMAPDATA) === FORMAT_BITMAPDATA) { if (currentLoader.content это Bitmap && (currentLoader.content как Bitmap) .bitmapData это BitmapData) { var bitmapData: BitmapData = (currentLoader.content as Bitmap) .bitmapData bitmapDataList [currentFilename] = bitmapData.clone (); // trace (currentFilename + "-> BitmapData (" + bitmapData.width + "x" + bitmapData.height + ")");} else if (currentLoader.content равен DisplayObject) {var width: uint = uint (currentLoader.content.width);var height: uint = uint (currentLoader.content.height);if (width && height) {var bitmapData2: BitmapData = new BitmapData (width, height, true, 0x00000000);bitmapData2.draw (currentLoader);bitmapDataList [currentFilename] = bitmapData2;// trace (currentFilename + "-> BitmapData (" + bitmapData2.width + "x" + bitmapData2.height + ")");} else {trace ("File \" "+ currentFilename +" \ "не удалось преобразовать в BitmapData");}} else {trace ("File \" "+ currentFilename +" \ "не удалось преобразовать в BitmapData");}} if ((currentState & FORMAT_DISPLAYOBJECT) === FORMAT_DISPLAYOBJECT) {if (currentLoader.content равен DisplayObject) {// trace (currentFilename + "-> DisplayObject");displayObjectList [currentFilename] = currentLoader.content;} else {currentLoader.unload ();trace ("File \" "+ currentFilename +" \ "не может быть загружен как DisplayObject");}} else {currentLoader.unload ();} currentLoader = null;currentFilename = "";currentState & = ~ (FORMAT_BITMAPDATA | FORMAT_DISPLAYOBJECT);processNext ();} / ** * @private * / приватная функция fileCompleteHandler (evt: FZipEvent): void {pendingFiles.unshift (evt.file);processNext ();} / ** * @private * / приватная функция zipCompleteHandler (evt: Event): void {currentZip.removeEventListener (Event.COMPLETE, zipCompleteHandler);currentZip.removeEventListener (FZipEvent.FILE_LOADED, fileCompleteHandler);currentZip.removeEventListener (FZipErrorEvent.PARSE_ERROR, zipCompleteHandler);currentZip = null;processNext ();}}}

И это будет еще одна строка кода, добавленная для отправки события FILE_PARSED.

Грязная версия будет иметь try / catch заблокировать и попытаться получить доступ к файлу несколько раз (по таймеру или enter_frame).Когда файл, наконец, готов, остановите этот цикл проверки и продолжайте.

HTH

...