2011-08-05 4 views
0

플렉스에서 렌더링하는 SQLite의 anytihng를 얻으려고하고 있는데, 플렉스에서 텍스트 나 텍스트를 표시하는 방법을 알 수 없습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?플렉스에서의 SQLite

<fx:Script> 
    <![CDATA[ 
     import flash.data.SQLConnection; 
     import flash.data.SQLResult; 
     import flash.data.SQLStatement; 
     import flash.filesystem.File; 

     import mx.collections.ArrayCollection; 

     private var conn:SQLConnection; 
     private var createStmt:SQLStatement; 
     private var selectStmt:SQLStatement; 
     [bindable] public var dataField:ArrayCollection; 
     [bindable] private var row:Object; 
     [bindable] private var pngIndex:int; 
     [bindable] public var pngTitle:String; 
     [bindable] private var pngByteArray:ByteArray; 
     [Bindable] private var dp:ArrayCollection = new ArrayCollection(); 

     private function init():void 
     { 
      conn = new SQLConnection(); 
      conn.addEventListener (SQLEvent.OPEN, openSuccess); 
      conn.addEventListener (SQLErrorEvent.ERROR, openFailure); 

      var dbFile:File = File.applicationDirectory.resolvePath("assets/NM.sqlite"); 
      conn.openAsync(dbFile); 
     } 

     private function openSuccess(event:SQLEvent):void 
     { 
      conn.removeEventListener(SQLEvent.OPEN, openSuccess); 
      conn.removeEventListener(SQLErrorEvent.ERROR, openFailure); 

      getData(); 
     } 


     private function getData():void 
     { 
      //status = "Loading data"; 

      selectStmt = new SQLStatement(); 
      selectStmt.sqlConnection = conn; 
      var sql:String = "SELECT Title FROM Data WHERE 'Index' = 0"; 
      selectStmt.text = sql; 

      selectStmt.addEventListener(SQLEvent.RESULT, selectResult); 
      selectStmt.addEventListener(SQLErrorEvent.ERROR, selectError); 

      selectStmt.execute(); 
     } 

     private function selectResult(event:SQLEvent):void 
     { 
      //status = "Data loaded"; 

      selectStmt.removeEventListener(SQLEvent.RESULT, selectResult); 
      selectStmt.removeEventListener(SQLErrorEvent.ERROR, selectError); 

      [bindable] var result:SQLResult = selectStmt.getResult(); 
      dataField = new ArrayCollection(result.data); 
      dp = ArrayCollection(dataField); 

      if (dataField != null) { 
       pngIndex = result.data.Index; 
       pngTitle = result.data.Title; 
       pngByteArray = result.data.Picture; 

       /* Pic.source = pngByteArray; */ 

      } 

     } 

    ]]> 
</fx:Script> 
<s:List x="31" y="44" width="511" height="415" dataProvider="{dp}"></s:List> 

나는 다른 구성 요소의 수를 시도했습니다, 나는이 코드는 마지막으로 감지 할 수 없습니다 바인딩 무서워 "데이터를 가지고 있지 않지만 (제대로 바인딩 할 데이터를 얻을 수없는 것 assignments to ... "메시지 또는 다른 두드러진"Property undefined "메시지).

도와주세요!

+0

''DataProvider'를'dp' 대신에'list'의'dataProvider'에 바인딩하십시오. – NoobsArePeople2

+0

"데이터 바인딩은 '데이터 필드'에 대한 할당을 감지 할 수 없으므로 오류가 발생합니다. 또 다른 공통점은 1067입니다. 암시 적 변환. 아하. – SQLiteNoob

+0

'[bindable]'의 모든 인스턴스는'[Bindable]'이어야합니다. – NoobsArePeople2

답변

1

수정 됨.

<fx:Script> 
    <![CDATA[ 
     import flash.data.SQLConnection; 
     import flash.data.SQLResult; 
     import flash.data.SQLStatement; 
     import flash.filesystem.File; 

     import mx.collections.ArrayCollection; 

     private var conn:SQLConnection; 

     private function init():void 
     { 
      conn = new SQLConnection(); 
      conn.addEventListener(SQLEvent.OPEN, openSuccess); 
      conn.addEventListener(SQLErrorEvent.ERROR, openFailure); 
      var dbFile:File = File.applicationDirectory.resolvePath("assets/NM.sqlite"); 
      conn.openAsync(dbFile); 
     } 

     private function openSuccess(event:SQLEvent):void 
     { 
      conn.removeEventListener(SQLEvent.OPEN, openSuccess); 
      conn.removeEventListener(SQLErrorEvent.ERROR, openFailure); 
      getData(); 
     } 

     private function getData():void 
     { 
      var select:SQLStatement = new SQLStatement(); 
      select.sqlConnection = conn; 
      select.text = "SELECT Title FROM Data WHERE 'Index' = 0"; 
      select.addEventListener(SQLEvent.RESULT, selectResult); 
      select.addEventListener(SQLErrorEvent.ERROR, selectError); 
      select.execute(); 
     } 

     private function selectResult(event:SQLEvent):void 
     { 
      var result:SQLResult = event.currentTarget.getResult(); 
      if(result.data) 
      { 
       list.dataProvider = new ArrayCollection(result.data); 
      } 
     } 

    ]]> 
</fx:Script> 
<s:List id="list" x="31" y="44" width="511" height="415" labelField="Title" /> 

목록 및 항목 렌더러에서 Flex가 작동하는 방식에 대해 자세히 읽어 보는 것이 좋습니다. 이 코드에는 많은 문제가있었습니다 (data이 배열이기 때문에 result.data.Index;이 잘못되었습니다). 내가 수집 할 수있는 것부터 사용자 지정 항목 렌더러가 필요합니다. 게다가 여분의 리소스가 발생하기 때문에 Binding을 사용하지 않는 것이 좋습니다 (이 예제와 같이).

+0

그래, 내가 게시 한 코드는 단지 워크 시트 일 뿐이었다. 나는 result.data를 알고있다. 인덱스는 내가 원한 것에 대한 적절한 구문이지만 모든 것이 잘 보였기 때문에 내 머리카락을 꺼내고 있었다. 처음에 내가 놓친 방법을 찾았습니다. 그리고 바인딩에 대해 듣습니다. – SQLiteNoob