<!--
  Licensed to the Apache Software Foundation (ASF) under one or more
  contributor license agreements.  See the NOTICE file distributed with
  this work for additional information regarding copyright ownership.
  The ASF licenses this file to You under the Apache License, Version 2.0
  (the "License"); you may not use this file except in compliance with
  the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.
-->
<!-- saved from url=(0014)about:internet -->
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>SampleSimpleDB.mxml</title>
<link rel="stylesheet" type="text/css" href="../SourceStyles.css"/>
</head>

<body>
<pre><span class="MXMLProcessing_Instruction">&lt;?xml version="1.0" encoding="utf-8"?&gt;</span>
<span class="MXMLComponent_Tag">&lt;s:View</span><span class="MXMLDefault_Text"> xmlns:fx="</span><span class="MXMLString">http://ns.adobe.com/mxml/2009</span><span class="MXMLDefault_Text">"
        xmlns:s="</span><span class="MXMLString">library://ns.adobe.com/flex/spark</span><span class="MXMLDefault_Text">" title="</span><span class="MXMLString">Database Access</span>&quot; viewActivate=&quot;view1_viewActivateHandler(event)&quot;<span class="MXMLComponent_Tag">&gt;</span>
    
    <span class="MXMLSpecial_Tag">&lt;fx:Script&gt;</span>
        &lt;![CDATA[
            <span class="ActionScriptReserved">import</span> <span class="ActionScriptDefault_Text">mx</span><span class="ActionScriptOperator">.</span><span class="ActionScriptDefault_Text">collections</span><span class="ActionScriptOperator">.</span><span class="ActionScriptDefault_Text">ArrayCollection</span>;
            <span class="ActionScriptReserved">import</span> spark.events.ViewNavigatorEvent;     
      
            <span class="ActionScriptReserved">protected</span> <span class="ActionScriptvar">var</span> sqlConnection:SQLConnection;
            
            <span class="ActionScriptReserved">protected</span> <span class="ActionScriptfunction">function</span> view1_viewActivateHandler(event:ViewNavigatorEvent):<span class="ActionScriptReserved">void</span>
            {
                sqlConnection = <span class="ActionScriptReserved">new</span> SQLConnection();
                sqlConnection.open(File.applicationStorageDirectory.resolvePath(<span class="MXMLString">"giberish.db"</span>));
                <span class="ActionScriptvar">var</span> stmt:SQLStatement = <span class="ActionScriptReserved">new</span> SQLStatement();
                stmt.sqlConnection = sqlConnection;
                stmt.text = <span class="MXMLString">"CREATE TABLE IF NOT EXISTS giberish (label TEXT)"</span>;
                stmt.execute();
                getAllGiberish();
            }</span>
            
            <span class="ActionScriptReserved">protected</span> <span class="ActionScriptfunction">function</span> getAllGiberish():<span class="ActionScriptReserved">void</span>
            {
                <span class="ActionScriptvar">var</span> stmt:SQLStatement = <span class="ActionScriptReserved">new</span> SQLStatement();
                stmt.sqlConnection = sqlConnection;
                stmt.text = <span class="MXMLString">"SELECT label FROM giberish"</span>;
                stmt.execute();
                l.dataProvider = <span class="ActionScriptReserved">new</span> ArrayCollection(stmt.getResult().data);
            }
            
            <span class="ActionScriptReserved">protected</span> <span class="ActionScriptfunction">function</span> onAdd():<span class="ActionScriptReserved">void</span>
            {
                <span class="ActionScriptvar">var</span> stmt:SQLStatement = <span class="ActionScriptReserved">new</span> SQLStatement();
                stmt.sqlConnection = sqlConnection;
                stmt.text = <span class="MXMLString">"INSERT into giberish values(:giberish)"</span>;
                stmt.parameters[<span class="MXMLString">":giberish"</span>] = g.text;
                stmt.execute();
                getAllGiberish();
                g.text = <span class="MXMLString">""</span>;
            }
        <span class="ActionScriptBracket/Brace">]</span><span class="ActionScriptBracket/Brace">]</span><span class="ActionScriptOperator">&gt;</span>
        
    <span class="MXMLSpecial_Tag">&lt;/fx:Script&gt;</span>
    
    <span class="MXMLComponent_Tag">&lt;s:layout&gt;</span>
        <span class="MXMLComponent_Tag">&lt;s:VerticalLayout</span><span class="MXMLDefault_Text"> paddingTop="</span><span class="MXMLString">5</span><span class="MXMLDefault_Text">" paddingBottom="</span><span class="MXMLString">5</span><span class="MXMLDefault_Text">" paddingLeft="</span><span class="MXMLString">5</span><span class="MXMLDefault_Text">" paddingRight="</span><span class="MXMLString">5</span><span class="MXMLDefault_Text">" gap="</span><span class="MXMLString">5</span><span class="MXMLDefault_Text">" 
                          horizontalAlign="</span><span class="MXMLString">left</span><span class="MXMLDefault_Text">" verticalAlign="</span><span class="MXMLString">top</span><span class="MXMLDefault_Text">"</span><span class="MXMLComponent_Tag">/&gt;</span>
    <span class="MXMLComponent_Tag">&lt;/s:layout&gt;</span>
    
    <span class="MXMLComponent_Tag">&lt;s:Form</span><span class="MXMLDefault_Text"> width="</span><span class="MXMLString">100%</span><span class="MXMLDefault_Text">"</span><span class="MXMLComponent_Tag">&gt;</span>
        <span class="MXMLComponent_Tag">&lt;s:FormItem</span><span class="MXMLDefault_Text"> label="</span><span class="MXMLString">Enter text</span><span class="MXMLDefault_Text">" skinClass="</span><span class="MXMLString">spark.skins.spark.StackedFormItemSkin</span><span class="MXMLDefault_Text">"</span><span class="MXMLComponent_Tag">&gt;</span>
            <span class="MXMLComponent_Tag">&lt;s:TextInput</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">g</span><span class="MXMLDefault_Text">"</span><span class="MXMLComponent_Tag">/&gt;</span>
        <span class="MXMLComponent_Tag">&lt;/s:FormItem&gt;</span>
        <span class="MXMLComponent_Tag">&lt;s:Button</span> label="<span class="MXMLString">Save text</span>" enabled="<span class="MXMLString">{</span>g.text.length != 0<span class="MXMLString">}</span>" click="onAdd()"<span class="MXMLComponent_Tag">/&gt;</span>
    <span class="MXMLComponent_Tag">&lt;/s:Form&gt;</span>
    
    <span class="MXMLComponent_Tag">&lt;s:List</span><span class="MXMLDefault_Text"> id="</span><span class="MXMLString">l</span><span class="MXMLDefault_Text">" width="</span><span class="MXMLString">100%</span><span class="MXMLDefault_Text">" height="</span><span class="MXMLString">100%</span><span class="MXMLDefault_Text">"</span><span class="MXMLComponent_Tag">/&gt;</span>
    
<span class="MXMLComponent_Tag">&lt;/s:View&gt;</span></pre></body>
</html>
