【问题标题】:flex 1061: Call to a possibly undefined method findbytermflex 1061:调用可能未定义的方法 findbyterm
【发布时间】:2013-11-20 19:57:58
【问题描述】:

已编辑:我正在使用 sqlite 数据库开发移动应用程序,但我没有成功执行搜索功能

当我在调试器上运行程序时,它给了我这个错误:

1061: 通过 a 调用可能未定义的方法 findByTerm 引用静态类型 mx.collections:ArrayCollection。

这是我的主视图:

  <?xml version="1.0" encoding="utf-8"?>
  <s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
    xmlns:s="library://ns.adobe.com/flex/spark" 
    title="Notes">
<fx:Script>
    <![CDATA[
        import model.Words;
        import model.WordsDatabase;
    ]]>
</fx:Script>

<s:actionContent>
    <s:Button label="Button" />
    <s:Button label="Add" click="onAddButtonClicked(event)"/>
    <s:Button click="WordsDatabase.words().findbyTerm(searchKey.text)"/>

</s:actionContent>

<s:List dataProvider="{WordsDatabase.words()}" change="onWordsSelected(event)"
        left="0" right="0" top="0" bottom="0">
    <s:itemRenderer>
        <fx:Component>
            <s:IconItemRenderer labelField="term" />
        </fx:Component>
    </s:itemRenderer>
</s:List>
<s:TextInput id="searchKey" x="0" y="0" width="480"/>
    </s:View>

具有我使用 WordsDatabase.as 的 2 种方法的模型包

    public static function findbyTerm(searchKey:String):ArrayCollection
    {
        var sql:String = "SELECT * FROM words WHERE term LIKE ?";
        var stmt:SQLStatement = new SQLStatement();
        stmt.sqlConnection = sqlConnection;
        stmt.text = sql;
        stmt.parameters[0] = '%' + searchKey + '%';
        stmt.execute();
        var result:Array = stmt.getResult().data;
        if (result)
        {
            var wordsList:ArrayCollection = new ArrayCollection();
            for (var i:int=0; i<result.length; i++)
            {
                wordsList.addItem(processRow(result[i]));   
            }
            return wordsList;
        }
        else
        {
            return null;
        }
    }


    public static function words():ArrayCollection
    {
        var wordsList:ArrayCollection = new ArrayCollection();

        var sql:String = "SELECT id, term, defin, term1, defin1 FROM words";
        var stmt:SQLStatement = new SQLStatement();
        stmt.sqlConnection = sqlConnection;
        stmt.text = sql;
        stmt.execute();
        var sqlResult:SQLResult = stmt.getResult();
        if (sqlResult) {
            var result:Array = sqlResult.data;
            if (result) {
     for (var index:Number = 0; index < result.length; index++)                 {wordsList.addItem(processRow(result[index]));                 
                }
            }
        }
        return wordsList;
    }


    protected static function processRow(o:Object):Words
    {
        var words:Words = new Words();
        words.id = o.id;
        words.term = o.term == null ? "" : o.term;
        words.defin = o.defin == null ? "" : o.defin;
        words.term1 = o.term1 == null ? "" : o.term1;
        words.defin1 = o.defin1 == null ? "" : o.defin1;
        return words;
    }

    public static function openDatabase(file:File):void
    {
        var newDB:Boolean = true;
        if (file.exists)
            newDB = false;
        _sqlConnection = new SQLConnection();
        _sqlConnection.open(file);
        if (newDB)
        {
            createDatabase();
            populateDatabase();
        }
    }

    protected static function createDatabase():void
    {
        var sql:String = 
            "CREATE TABLE IF NOT EXISTS words ( "+
            "id INTEGER PRIMARY KEY AUTOINCREMENT, " +
            "term VARCHAR(50), " +
            "defin VARCHAR(250), " +
            "term1 VARCHAR(50), " +
            "defin1 VARCHAR(200))";
        var stmt:SQLStatement = new SQLStatement();
        stmt.sqlConnection = sqlConnection;
        stmt.text = sql;
        stmt.execute();         
    }

    protected static function populateDatabase():void
    {
        var file:File = File.applicationDirectory.resolvePath("assets/words.xml");
        if (!file.exists) return;
        var stream:FileStream = new FileStream();
        stream.open(file, FileMode.READ);
        var xml:XML = XML(stream.readUTFBytes(stream.bytesAvailable));
        stream.close();
        for each (var n:XML in xml.words)
        {
            var words:Words = new Words();
            words.id = n.id;
            words.term = n.term;
            words.defin = n.defin;
            words.term1 = n.term1;
            words.defin1 = n.defin1;
            addWords(words);
        }
    }

}
    }

【问题讨论】:

  • 我看不到您在代码中的何处使用“findbyTerm”方法。你提供了很多代码来筛选。你能整理一个简单的例子来解释这个问题吗?根据您在 ArrayCollection 类上使用 findByTerm() 方法的错误,而 ArrayCollection 类没有该方法。
  • 好的,现在可以很容易地看到了,我只是不想删除这么多以使其足够清晰
  • 主视图中的“数据”是什么?
  • 我不知道应该放什么,所以我尝试了 data.findbyterm 和 WordsDatabase.words().findbyterm 但到目前为止没有任何效果
  • 您必须使用 pushView() 方法将数据显式发送到视图中。你在哪里调用 pushView 方法来创建这个视图?基于错误; Flex 认为数据是一个 ArrayCollection;所以很可能你传入了错误的值。

标签: actionscript-3 sqlite apache-flex search flash-builder


【解决方案1】:

您是否尝试从 ArrayCollection 的“words”访问方法“findbyTerm”。

WordsDatabase.words() //返回一个ArrayCollection

|ArrayCollection|.findbyTerm(searchKey.text) //错误 WordsDatabase.words().findbyTerm(searchKey.text) //错误

你应该改变你的搜索方式

【讨论】:

  • 没有尝试具体做,但您可以尝试将“dataprovider”列表作为参数传递并将其加载到函数“findbyTerm”中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-24
  • 1970-01-01
相关资源
最近更新 更多