EscoStorage - решение проблемы хранения данных на ранних этапах разработки клиента.
Запись от pango размещена 22.11.2012 в 16:12
EscoStorage - решение проблемы хранения данных на ранних этапах разработки клиента.
Если приложение оперирует данными их надо где-то хранить, и как-то редактировать.
На первых порах мы хотим обойтись без базы, данных у нас мало (только для тестов)
а поля моделей будут часто меняться, это черевато издержками на миграции.
Но мы хотим иметь похожий на выгрузку формат, удобные формы для редактирования и заливки файлов.
Тут на помощь и приходит EscoStorage, основываясь на коде ваших классов,
он на лету генерирует формы для их редактирования, заливает в целевые папки файлы
и вписывает относительные пути к ним в нужные поля.
Данные храняться в json-строке, которая после загрузки конвертируется
в типизированные экземпляры as-классов (никаких парсеров писать не надо),
со всеми связями, в том числе списочными.
Как это работает, используются три проекта:
- библиотечный проект, где вы описываете модели
- air-проект, EscoAdmin, в котором вы ссылаетесь на модели и определяете путь хранения файла с данными и папку куда будет заливаться статика.
- третий - ваш проект в котором вы пользуетесь созданным хранилищем.
Подробности.
Библиотека моделей.
Каждый из классов модели наследуется от класса абстрактной записи(AbsRecord).
его поля могут быть следюущих типов int, uint, Number, String, Boolean,
наследник AbsRecord (реализация foreign-key),
либо вектор наследников AbsRecord (по сути many-to-many).
Например мы описываем 3 модели: Author, Genre и Book,
при этом у автора есть поле имени,
у жанра тоже есть поле имени,
а у книги помимо имени, будут автор и список жанров к которым она относиться,
в этом случае
Author.as
package com.owl.examples.storage.models { import com.owl.db.AbsRecord; public class Author extends AbsRecord { public var name:String } }
package com.owl.examples.storage.models { import com.owl.db.AbsRecord; public class Genre extends AbsRecord { public var name:String } }
package com.owl.examples.storage.models { import com.owl.db.AbsRecord; public class Book extends AbsRecord { public var title:String public var author:Author public var genres:Vector.<Genre> } }
теперь служебный компонент, который надо будет передавать админскому эир-приложению
ExampleStorage.mxml
<?xml version="1.0" encoding="utf-8"?> <db:DataBase xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:db="com.owl.db.*" > <db:tables> <db:Table type="{Author}"/> <db:Table type="{Book}"/> <db:Table type="{Genre}"/> </db:tables> <fx:Script> <![CDATA[ import com.owl.examples.storage.models.* ]]> </fx:Script> </db:DataBase>
он состоит из одного приложения вида:
MyAdmin.mxml
<?xml version="1.0" encoding="utf-8"?> <admin:EscoAdmin xmlns:fx="http://ns.adobe.com/mxml/2009" xmlns:admin="com.owl.esco.admin.*" xmlns:storage="com.owl.examples.storage.*" default_path="c:/папка_куда_сохраняется_файл_с_данными/storage.esf" > <admin:db> <storage:ExampleStorage prefix="c:/папка_куда_сохраняется_файл_с_данными/под-папка_где_храняться_залитые_файлы/"/> </admin:db> </admin:EscoAdmin>
экземпляр служебного класса, который знает о ваших моделях (ExampleStorage)
путь к файлу в котором будут храниться данные (*.esf)
и путь к папке в которую сохраняются залитые файлы (картинки, звук и тп)
Запустив его, увидим слева список моделей (картинка была выше)
если кликнуть на одну из них, можно будет создать запись этого типа,
а по клику на неё, заполнить данными.
Создав несоколько записей, сохранимся и посмотрим, что у нас получилось.
Создадим третий проект, сославшись на на библиотеку с моделями.
После этого можно загружать хранилище, указав с какими моделями мы будем работать.
Когда файл с данными будет загружен мы можем оперировать ими как обычными экземплярами as-классов,
которые мы объявили их в библиотеке.
Esco_storage_example_client.as
package { import com.owl.db.*; import com.owl.examples.storage.models.*; import flash.display.Sprite; import flash.events.Event; import flash.net.URLRequest; public class Esco_storage_example_client extends Sprite { private var loader:DBLoader = new DBLoader() private var storage:DataBase = new DataBase() public function Esco_storage_example_client() { storage.create_table_for(Author) storage.create_table_for(Book) storage.create_table_for(Genre) loader.addEventListener( Event.COMPLETE, on_complete) loader.load_to(storage, new URLRequest('c:/esco_example/storage.esf')) } private function on_complete(e:Event):void { var list:Array = storage.get_table(Book).list for each (var book:Book in list) { trace ('--------------------------') trace ( book.title ) trace ( book.author.name ) for each (var genre:Genre in book.genres) { trace (genre.name) } } } }}
Тут можно скачать все три проекта одним архивом
Если тема вызовет интерес, опишу остальные фичи (группировка типов, заливка файлов, загрузка файловых полей из клиента, кастомные рендереры, руссификация полей c помощью метадаты и тп.)
Всего комментариев 23
Комментарии
22.11.2012 22:13 | |
Я вот понимаю, что вроде прикольно. Но не понимаю, что мне не нравится. Буду думать.
А вы изначально пхпшник? |
23.11.2012 00:01 | |
Это что-то вроде phpMyAdmin?
|
23.11.2012 02:23 | |
Цитата:
Каждый из классов модели наследуется от класса абстрактной записи(AbsRecord).
|
23.11.2012 02:58 | |
у вас не модель, а просто VO
|
23.11.2012 10:36 | |
Цитата:
VO - это такое?
Джанго - крутая штука, да |
24.11.2012 01:38 | |
И ещё замечание автору. Используйте всё-таки общепринятые в конкретном языке конвенции наименований.
createTable |
24.11.2012 01:55 | |
Кстати на счет конвенций. Что-то я не могу таковые найти на сайте адоба (именно там). То что находится через тырнет - битые ссылки. Подскажет кто?
|
24.11.2012 02:22 | |
24.11.2012 04:45 | |
Юра Яровой, по просьбам трудящихся, восстановил страничку
http://garbage-collector.ru/2008/06/...n_russian.html |
24.11.2012 07:59 | |
Рискуя навлечь на себя гнев общественности,
всё же выскажу своё мнение, кемелКейс - не читабелен, в силу своей противоестественности. Комобинация createTableFor, однозначно воспринимается хуже чем create_table_for . Составные названия полей и методов состоящих из более чем трёх слов, без разрядки воспринимаются совсем адски неудобно. А если конвенция мешает читабельности - это плохая конвенция, и следование ей, не более чем досадное суеверие. Для меня это вопрос решённый, я отказался кемелкейса, во всех случаях кроме именования классов. Результат: имена классов визуально отличаются от всего остального, а названия методов и полей читаются легче. |
|
Обновил(-а) pango 24.11.2012 в 09:00
|
24.11.2012 14:53 | |
Цитата:
Для меня это вопрос решённый, я отказался кемелкейса,
|
24.11.2012 18:01 | |
ещё один перевод
http://anykeytocreate.blogspot.ru/20...s-for-as3.html |
Последние записи от pango