Matlab App Designer 中的辅助函数出错

问题描述 投票:0回答:1

我正在构建一个应用程序 DUNA,它引用数据并将数据写入 sqlite 数据库。我的功能之一是检查表中的 UID 是否已存在。我使用以下公共辅助函数对多个表执行此操作:

 methods (Access = public)
    
    function results = checkUID(app,UID,table)
        conn = sqlite(app.database);  % This is defined as a Property
        if table == 'Deployment_Table'
            cat = 'Deployment_ID';
        elseif table == 'Logger_Table'
            cat = 'loggerUID';
        elseif table == 'Releaser_Table'
            cat = 'releaserUID';
        elseif table == 'Satellite_Table'
            cat = 'satUID';
        else
            cat = 'unitID';
        end

        sqlq = ['SELECT ' cat ' FROM ' table ' WHERE ' cat ' = "' UID '"'];

        results =fetch(conn, sqlq);
        close(conn)
        return

        
    end
end

总的来说,这是可行的,它允许我确定 UID 是否已存在于多个表中。

我创建了一个面板,在其中构建了一个表单供用户填写。表单底部有一个按钮功能('app.SubmitDataButtonPushed'),它可以访问手动输入到表单中的数据并对其进行组织。对于这篇文章,它做了两件事:它生成一个需要唯一的部署 ID(例如不在数据库中),并引用数据库以确保我们拥有每台设备的记录(例如它应该在数据库)。这都是通过上面的 checkUID 函数完成的。

对于 Deployment_ID,检查函数是否按预期工作。代码是:

        function SubmitDataButtonPushed(app, event)
            station = app.StationIDDropDown.Value;
            depDate = app.DeploymentDateDatePicker.Value;
            depDst= datetime(depDate, 'Format','yyyyMMdd');
            Deployment_ID = [station '_' char(depDst)];

            % Is this deployment already in the database?
            dbP =checkUID(app,Deployment_ID, 'Deployment_Table');

            if ~isempty(dbP) 
               uialert(fig, ['Error: Deployment ID ' Deployment_ID ' already exists.'], 'Database Error', "Icon","error");
            end
            ...  % More code here

太棒了。当 dbP 为空和不为空时,这都有效。如果有数据,它就会按预期触发 uialert。但是,当我尝试修改此代码以查看releaserUID是否存在时,我收到以下错误:

           ...  % Continue code here.
           % Releaser Check
           releaserTypes = app.ModelDropDown_2.Value  ;  %There are fixed values here.

           if releaserTypes == 'LRT (Sonardyne)'
              prefix='SD_';
           elseif releaserTypes == 'AR-60 (Sub Sea Sonic)'
              prefix = 'SSS_';
           elseif releaserTypes == 'R500 (Teledyne)'
              prefix = 'TD_';
           end

           releaserID = [prefix, char(app.ReleaseCodeEditField.Value)];

           dbR =checkUID(app,releaserID, 'Releaser_Table');

           if isempty(dbR) 
              uialert(fig, ['Error: releaser ID ' releaserID ' is not in database. Add information on releaser to database before adding deployment.'], 'Database Error', "Icon","error");
           end

这是行不通的。它挂在 dbR... 线上。当我运行这个程序时,特别是在 dbR 行上停止以确保所有变量都处于应有的状态,我看不到任何不合适的地方。正如预期的那样,“releaserID”变量作为字符串生成。然而,这是我得到的错误:

    Arrays have incompatible sizes for this operation.

Error in DUNA/checkUID (line 101)
            if table == 'Deployment_Table'

Error in DUNA/SubmitDataButtonPushed (line 206)
            dbR =checkUID(app,releaserID, 'Releaser_Table');

Error in matlab.apps.AppBase>@(source,event)executeCallback(ams,app,callback,requiresEventData,event) (line 62)
            newCallback = @(source, event)executeCallback(ams, ...

Related documentation
 
Error while evaluating Button PrivateButtonPushedFcn.

我尝试了很多不同的方法。提供不同的变量(LRT 与 AR60 等)。当我在 Matlab 中手动运行代码时,它可以工作。有什么想法吗?我只是不明白为什么它适用于一组数据,而不适用于另一组数据。

数据库的表名正确。

干杯!

matlab sqlite matlab-app-designer
1个回答
0
投票

您正在使用

==
来比较
'chars'
,应该避免这种情况,因为它将它们作为数组按元素进行比较。

您可以将

==
"strings"
一起使用,但对于字符,您需要使用
strcmp( 'abc', 'def' )

因此将您的支票修改为类似的内容

if strcmp( tableName, 'Deployment_Table' )

我无法运行您的应用程序,但对于某些回调情况来说,这可能不会出错,因为某些应用程序设计器回调默认将

tableName
设置为字符串,这令人困惑(例如
"abc" == 'abc'
将比较就好像两者都是字符串)。

请注意,我还将变量名称从

table
更改为
tableName
,因为
table
table
数据类型的相当完整的内置函数;通过隐藏名称,您将来可能会导致意外错误。

© www.soinside.com 2019 - 2024. All rights reserved.