UWP如何实现仅显示一次MessageDialog?附数据库插入代码咨询
嘿,我来帮你搞定这两个问题——UWP里让MessageDialog只弹一次,还有你那串数据库插入代码的优化~
一、实现UWP仅显示一次MessageDialog
要让对话框只弹一次,最靠谱的方式是用UWP自带的本地设置来记录“是否已经显示过”的状态,步骤很简单:
- 弹出对话框前先检查本地标记:
var localSettings = ApplicationData.Current.LocalSettings; // 先判断有没有存过标记,默认是没显示过 bool hasShownDialog = localSettings.Values.ContainsKey("HasShownUpdateDialog") && (bool)localSettings.Values["HasShownUpdateDialog"]; if (!hasShownDialog) { var dialog = new MessageDialog("这里放你的提示内容"); await dialog.ShowAsync(); // 标记为已显示,下次就不会再弹了 localSettings.Values["HasShownUpdateDialog"] = true; }
- 额外小技巧:如果想在APP更新后重新弹这个对话框,可以把标记和APP版本绑定,比如用
"HasShownDialog_V" + Package.Current.Id.Version.Major作为键,这样每次大版本更新,标记就会重置~
二、优化你的数据库插入代码
先说说你原来代码的两个小问题:一是直接拼接字符串会有SQL注入风险,二是NOT EXISTS的写法不对,会导致判断逻辑出错。优化后的代码如下:
if (jumlahiddb < jumlahbuku) { DownloadBukuKomik(url); // 用参数化SQL,既安全又避免语法错误 string komikUpdate = @"INSERT INTO books (id, title, folder_id, identifier) SELECT @id, @title, @folderId, @identifier WHERE NOT EXISTS ( SELECT 1 FROM books WHERE id = @id AND title = @title AND folder_id = @folderId AND identifier = @identifier )"; Debug.WriteLine(komikUpdate); var komikQuery = objConnUpdate.Prepare(komikUpdate); // 绑定参数,代替字符串拼接 komikQuery.Bind("@id", intID); komikQuery.Bind("@title", $"{namaFile}.pdf"); komikQuery.Bind("@folderId", 67); komikQuery.Bind("@identifier", $"{namaFile}.pdf"); // 执行插入操作 komikQuery.Step(); }
给你解释下优化点:
- 参数化查询:用
@参数名代替直接拼变量,彻底避免SQL注入,还能解决文件名里有单引号这类特殊字符导致的SQL语法错误。 - 正确的NOT EXISTS写法:子查询里用
SELECT 1就够了,我们只需要判断有没有匹配的记录,原来写的select id AND title AND ...是错误的,会把字段值当作布尔值计算,根本起不到判断记录存在的作用。
内容的提问来源于stack exchange,提问作者Rose
相关产品推荐
相关产品推荐

