- APEXのサンプル・データセットをOracle Backend for Firebaseのプロジェクトを構成したスキーマにインストールした上で、APEXのサンプル・アプリケーションを作成します。
- SQL Developer Extension for VS Codeを使って、インストールされたサンプル・スキーマのER図を作成し親子関係を確認します。Oracle Backend for FirebaseのRelational to collection mappingでは、サブ・コレクションの親コレクションは1つだけです。表の参照制約では参照先となる表(親)はいくつあっても良いため、サブ・コレクションの親コレクションは定義されている参照制約だけでは決められません。
- Oracle Backend for Firebaseのコンソールより、ステップ2で決めたRelational to collection mappingを定義します。
- Relational to collection mappingが定義されると、コレクションに対応するJSON Duality Viewが生成されます。生成されたJSON Duality Viewはトリガーによるサーバー側の更新を考慮せずにメタデータETAGを生成するため、ドキュメントの更新時に同時実行制御のエラーが発生します(ORA-42698: Cannot updateJSON Relational Duality View, Concurrent modification detected)。そのため、トリガーでアップデートされる列をGENERATED USINGで囲んでETAGの計算対象外にするよう、JSON Duality Viewの定義を変更します。
- 以上の準備を行なった後に、iOSアプリケーションを作成するフォルダをプロジェクトのフォルダとして、Codexのプロジェクトを作成します。プロジェクトのフォルダにアプリケーションの要件を配置します。
- 定義されたRelational to collection mappingにfusabase-cliでアクセスし取り出したコレクションのデータを元にして、参照するスキーマ情報を記述したファイルをプロジェクトのフォルダ以下に生成します。
- CodexにiOSアプリケーションの要件とスキーマ情報を元にして、iOSアプリケーションを生成するよう指示します。
- 生成されたiOSアプリケーションをXcodeで開き、アプリケーションを実行します。思った動きと違っていたり、こうして欲しいという要求をCodexに伝えてアプリケーションを改良します。
サンプル・データセットのインストール
SQL Developer Extension for VS Codeによるスキーマの確認
- eba_projects
- eba_project_milestones
- eba_project_comments
- eba_project_tasks
- eba_project_task_todos
- eba_project_task_links
- eba_project_status
Relational to collection mappingの定義
- 最上位のコレクションであるeba_projectsとeba_project_statusはAdd tableをクリックして追加します。
- eba_project_milestones、eba_project_comments、eba_project_tasksは、eba_projectsのサブ・コレクションの追加ボタンをクリックして追加します。
- eba_project_task_todos、eba_project_task_linksは、eba_project_tasksのサブ・コレクションの追加ボタンをクリックして追記します。
JSON Duality Viewの更新
select table_name, path from baas_collection_metadata where table_type = 'rel';
SQL> select table_name, path from baas_collection_metadata where table_type = 'rel';
TABLE_NAME PATH
______________________________ _______________________________________________________________________
EBA_PROJECT_COMMENTS$BAAS /eba_projects/_docId/eba_project_comments
EBA_PROJECT_MILESTONES$BAAS /eba_projects/_docId/eba_project_milestones
EBA_PROJECT_TASKS$BAAS /eba_projects/_docId/eba_project_tasks
EBA_PROJECT_TASK_LINKS$BAAS /eba_projects/_docId/eba_project_tasks/_docId/eba_project_task_links
EBA_PROJECT_TASK_TODOS$BAAS /eba_projects/_docId/eba_project_tasks/_docId/eba_project_task_todos
EBA_PROJECT_STATUS$BAAS /eba_project_status
EBA_PROJECTS$BAAS /eba_projects
7行が選択されました。
SQL>
select condition from baas_collection_metadata where table_type = 'rel';
SQL> select condition from baas_collection_metadata where table_type = 'rel';
CONDITION
____________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________
create or replace json relational duality view "EBA_PROJECT_COMMENTS$BAAS" as select json {'project_id':"PROJECT_ID", 'comment_text':"COMMENT_TEXT", 'created':"CREATED", 'created_by':"CREATED_BY", 'updated':"UPDATED", 'updated_by':"UPDATED_BY", 'OID' : SYS_MAKE_OID_FROM_PK("ID"),'_id':"ID",'parent_oid': GENERATED USING ( select '/' ||SYS_MAKE_OID_FROM_PK("EBA_PROJECTS"."ID") from "EBA_PROJECTS" where "EBA_PROJECTS"."ID" = "EBA_PROJECT_COMMENTS"."PROJECT_ID")} from "EBA_PROJECT_COMMENTS" with insert delete update
create or replace json relational duality view "EBA_PROJECT_MILESTONES$BAAS" as select json {'project_id':"PROJECT_ID", 'name':"NAME", 'description':"DESCRIPTION", 'due_date':"DUE_DATE", 'created':"CREATED", 'created_by':"CREATED_BY", 'updated':"UPDATED", 'updated_by':"UPDATED_BY", 'OID' : SYS_MAKE_OID_FROM_PK("ID"),'_id':"ID",'parent_oid': GENERATED USING ( select '/' ||SYS_MAKE_OID_FROM_PK("EBA_PROJECTS"."ID") from "EBA_PROJECTS" where "EBA_PROJECTS"."ID" = "EBA_PROJECT_MILESTONES"."PROJECT_ID")} from "EBA_PROJECT_MILESTONES" with insert delete update
create or replace json relational duality view "EBA_PROJECT_TASKS$BAAS" as select json {'project_id':"PROJECT_ID", 'milestone_id':"MILESTONE_ID", 'name':"NAME", 'description':"DESCRIPTION", 'assignee':"ASSIGNEE", 'start_date':"START_DATE", 'end_date':"END_DATE", 'cost':"COST", 'is_complete_yn':"IS_COMPLETE_YN", 'created':"CREATED", 'created_by':"CREATED_BY", 'updated':"UPDATED", 'updated_by':"UPDATED_BY", 'OID' : SYS_MAKE_OID_FROM_PK("ID"),'_id':"ID",'parent_oid': GENERATED USING ( select '/' ||SYS_MAKE_OID_FROM_PK("EBA_PROJECTS"."ID") from "EBA_PROJECTS" where "EBA_PROJECTS"."ID" = "EBA_PROJECT_TASKS"."PROJECT_ID")} from "EBA_PROJECT_TASKS" with insert delete update
create or replace json relational duality view "EBA_PROJECT_TASK_LINKS$BAAS" as select json {'project_id':"PROJECT_ID", 'task_id':"TASK_ID", 'link_type':"LINK_TYPE", 'url':"URL", 'application_id':"APPLICATION_ID", 'application_page':"APPLICATION_PAGE", 'description':"DESCRIPTION", 'created':"CREATED", 'created_by':"CREATED_BY", 'updated':"UPDATED", 'updated_by':"UPDATED_BY", 'OID' : SYS_MAKE_OID_FROM_PK("ID"),'_id':"ID",'parent_oid': GENERATED USING ( select '/' ||SYS_MAKE_OID_FROM_PK("EBA_PROJECTS"."ID") || '/' || SYS_MAKE_OID_FROM_PK("EBA_PROJECT_TASKS"."ID") from "EBA_PROJECTS","EBA_PROJECT_TASKS" where "EBA_PROJECTS"."ID" = "EBA_PROJECT_TASKS"."PROJECT_ID" and "EBA_PROJECT_TASKS"."ID" = "EBA_PROJECT_TASK_LINKS"."TASK_ID")} from "EBA_PROJECT_TASK_LINKS" with insert delete update
create or replace json relational duality view "EBA_PROJECT_TASK_TODOS$BAAS" as select json {'project_id':"PROJECT_ID", 'task_id':"TASK_ID", 'name':"NAME", 'description':"DESCRIPTION", 'assignee':"ASSIGNEE", 'is_complete_yn':"IS_COMPLETE_YN", 'created':"CREATED", 'created_by':"CREATED_BY", 'updated':"UPDATED", 'updated_by':"UPDATED_BY", 'OID' : SYS_MAKE_OID_FROM_PK("ID"),'_id':"ID",'parent_oid': GENERATED USING ( select '/' ||SYS_MAKE_OID_FROM_PK("EBA_PROJECTS"."ID") || '/' || SYS_MAKE_OID_FROM_PK("EBA_PROJECT_TASKS"."ID") from "EBA_PROJECTS","EBA_PROJECT_TASKS" where "EBA_PROJECTS"."ID" = "EBA_PROJECT_TASKS"."PROJECT_ID" and "EBA_PROJECT_TASKS"."ID" = "EBA_PROJECT_TASK_TODOS"."TASK_ID")} from "EBA_PROJECT_TASK_TODOS" with insert delete update
create or replace json relational duality view "EBA_PROJECT_STATUS$BAAS" as select json {'code':"CODE", 'description':"DESCRIPTION", 'display_order':"DISPLAY_ORDER", 'created':"CREATED", 'created_by':"CREATED_BY", 'updated':"UPDATED", 'updated_by':"UPDATED_BY", 'OID' : SYS_MAKE_OID_FROM_PK("ID"),'_id':"ID",'parent_oid':'_docId'} from "EBA_PROJECT_STATUS" with insert delete update
create or replace json relational duality view "EBA_PROJECTS$BAAS" as select json {'status_id':"STATUS_ID", 'name':"NAME", 'description':"DESCRIPTION", 'project_lead':"PROJECT_LEAD", 'budget':"BUDGET", 'completed_date':"COMPLETED_DATE", 'created':"CREATED", 'created_by':"CREATED_BY", 'updated':"UPDATED", 'updated_by':"UPDATED_BY", 'OID' : SYS_MAKE_OID_FROM_PK("ID"),'_id':"ID",'parent_oid':'_docId'} from "EBA_PROJECTS" with insert delete update
7行が選択されました。
SQL>
SQL> @json-duality-views.sql
View "EBA_PROJECT_COMMENTS$BAAS"は作成されました。
View "EBA_PROJECT_MILESTONES$BAAS"は作成されました。
View "EBA_PROJECT_TASKS$BAAS"は作成されました。
View "EBA_PROJECT_STATUS$BAAS"は作成されました。
View "EBA_PROJECTS$BAAS"は作成されました。
View "EBA_PROJECT_TASK_LINKS$BAAS"は作成されました。
View "EBA_PROJECT_TASK_TODOS$BAAS"は作成されました。
SQL>
スキーマ情報の生成
CodexによるiOSアプリケーションの生成
iOSアプリケーションのデバッグと更新
# Projects Androidアプリケーション要件
## 概要
Oracle Backend for Firebase(Fusabase)をバックエンドとして使用する、プロジェクト管理用の Android アプリケーション。
アプリケーション名: `Projects`
対象プラットフォーム: Android / Java
認証方式: Basic 認証
AndroidアプリケーションはAndroid Studioで扱える形式で作成してください。
## Fusabase 接続設定
app/fusabase-config.jsonとして以下を記述します。
```json
{
"schema": "testuser",
"app_name": "com.oracle.fusabase.projects",
"app_type": "ANDROID",
"app_id": "5A79FA609C221B92E063020012ACF003",
"objs_type": "dbfs",
"project_id": "59C1663EAB6F13DFE063020012AC5621",
"storage_bucket": "dbfs_BQYKZXSFPIUUWSH",
"auth_type": "base",
"auth_id": "59C1663EAB7313DFE063020012AC5621",
"ords_host": "http://10.0.2.2:8181/ords/testuser/"
}
```
Fusabase iOS SDK は以下のリポジトリから取得する。
https://github.com/oracle/fusabase-android-sdk.git
# Projects Webアプリケーション要件
## 概要
Oracle Backend for Firebase(Fusabase)をバックエンドとして使用する、プロジェクト管理用の Web アプリケーション。
アプリケーション名: `Projects`
対象プラットフォーム: Web / JavaScript
認証方式: Basic 認証
Webアプリケーションとして扱える形式で作成してください。
## Fusabase 接続設定
fusabase-config.jsとして以下を記述します。
```json
{
"schema": "testuser",
"app_name": "ProjectWeb",
"app_type": "WEB",
"app_id": "5A7B034D62F4B85DE063020012ACC847",
"objs_type": "dbfs",
"project_id": "59C1663EAB6F13DFE063020012AC5621",
"storage_bucket": "dbfs_BQYKZXSFPIUUWSH",
"auth_type": "base",
"auth_id": "59C1663EAB7313DFE063020012AC5621",
"ords_host": "http://localhost:8181/ords/testuser/"
}
```
Fusabase Web SDK は以下のリポジトリから取得する。
https://github.com/oracle/fusabase-js-sdk.git




































