我正在构建一个应用程序 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 中手动运行代码时,它可以工作。有什么想法吗?我只是不明白为什么它适用于一组数据,而不适用于另一组数据。
数据库的表名正确。
干杯!
您正在使用
==
来比较 'chars'
,应该避免这种情况,因为它将它们作为数组按元素进行比较。
您可以将
==
与 "strings"
一起使用,但对于字符,您需要使用 strcmp( 'abc', 'def' )
因此将您的支票修改为类似的内容
if strcmp( tableName, 'Deployment_Table' )
我无法运行您的应用程序,但对于某些回调情况来说,这可能不会出错,因为某些应用程序设计器回调默认将
tableName
设置为字符串,这令人困惑(例如 "abc" == 'abc'
将比较就好像两者都是字符串)。
请注意,我还将变量名称从
table
更改为 tableName
,因为 table
是 table
数据类型的相当完整的内置函数;通过隐藏名称,您将来可能会导致意外错误。