【问题标题】:Search function throwing error #1009 - null object reference搜索函数抛出错误 #1009 - 空对象引用
【发布时间】:2011-08-25 18:58:40
【问题描述】:

简单易懂的问题,希望有同样简单的解决方案:

当我输入搜索查询时,有时会在 dataField = new ArrayCollection(result.data); 行中收到“错误 #1009 无法访问空对象引用的属性或方法”。

AS3:

        private function getSearch():void
        {
            //status = "Loading data";
            selectStmt = new SQLStatement();
            selectStmt.sqlConnection = conn;
            var sql:String = "SELECT [Index], Title, CAST(Picture AS ByteArray) AS Picture FROM Data WHERE Title LIKE @searchTarget";
            selectStmt.parameters["@searchTarget"] = "%" + searchTarget + "%";  
            selectStmt.text = sql;
            selectStmt.addEventListener(SQLEvent.RESULT, selectResult2);
            selectStmt.addEventListener(SQLErrorEvent.ERROR, selectError);
            selectStmt.execute();
            targetRecordId = pngIndex;
        }

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

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

            var result:SQLResult = selectStmt.getResult(); 

            dataField = new ArrayCollection(result.data);

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

mxml:

<s:List id="myList" 
        x="0" y="40" 
        width="100%" height="100%" 
        labelField="Title" 
        dataProvider="{dataField}"
        change="myList_changeHandler(event)"
        >   
</s:List>

我尝试过的事情(包括这些解决方案的排列):

1) 在 SelectResult2 方法中移动错误代码

2) 添加if (result.data == null) 方法

3) 使用 Array 而不是 ArrayCollection(我发现有人在某个论坛上的某个论坛上发现这对他们的项目有用)

4) 添加一个计时器函数来尝试限制搜索数据库的频率。 (虽然我认为这是最好的解决方案,但我想我必须再试一次)

请注意,据我所知,错误的发生主要是由于输入搜索字符太快

感谢您的帮助。

【问题讨论】:

    标签: apache-flex sqlite


    【解决方案1】:

    1.使用响应器

    您对数据库的每次调用都使用相同的事件处理函数。因此,当函数被执行时,它可能会丢失对其原始语句的引用(因为同时启动了一个新调用)。这就是为什么你会在结果对象上获得那些空指针。

    所以放弃事件侦听器并改用Responder,如下所示:

            var stmt:SQLStatement = new SQLStatement();
            stmt.sqlConnection = connection;
            stmt.text = query;
    
            var resp:Responder = new Responder(onResult, onFail);
            stmt.execute(-1, resp);
    

    'onResult' 函数将 SQLResult 对象作为单个参数,您不必再引用原始语句来获得该结果。

    2。延迟

    使用计时器,是的。但不要使用它来进行间隔时间的数据库调用。你不知道什么时候停止打这些电话,对吗?使用它来检测用户是否仍在打字:当它花费的时间超过 - 比如 - 300ms。让一个 KeyboardEvent.KEY_UP 接踵而至,然后触发对数据库的调用。一次。

    3.使用阈值

    不要从一个字母开始查询。使用至少 2-3 个字符的阈值。无论如何,你不会得到任何与一个角色相关的建议。阈值应该有多高,取决于要搜索的集合的大小。

    4.过滤一个 ArrayCollection

    忽略以上所有。一个更简单的解决方案可能是将要搜索的所有记录加载到 ArrayCollection 中并使用filterFunction 仅显示与某个字符串匹配的记录。只要集合不是很大(如数万条记录)并且实施起来更快,这种方法就可以了。

    【讨论】:

    • 感谢您的信息 - 很高兴知道正确的解决方案。
    【解决方案2】:

    首先,怎么样

    if(result == null)
         return;
    

    另外,计时器是个好主意,通常大约半秒,这样您的数据库就不会在用户打字时被敲打。

    private var timer:Timer = new Timer(500, 1);
    protected function textChangeHandler():void{
         timer.reset();
         timer.addEventListener(TimerEvent.Timer, getSearch);//Could be moved to a creation complete
         timer.start();
    }
    

    根据需要处理错误并删除/添加事件。您还可以在最后一个搜索完成之前禁用搜索,这与计时器结合使用不会干扰用户。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多