Windows IoT下C#实现RichEditBox与SQLite3读写方法咨询
实现RichEditBox内容保存/加载至SQLite3的方案(Windows IoT + Sqlite3.PCL)
咱先直接回答你最关心的问题:能不能存入文本字段?
- 如果可以忽略格式,只存纯文本:完全没问题,直接把RichEditBox的纯文本内容存入SQLite的
TEXT字段就行。 - 如果要保留格式:不行,必须用
BLOB字段,因为RichEditBox的带格式内容(比如RTF)本质是带格式标记的结构化数据,文本字段存不下完整的格式信息,会导致格式丢失。
接下来分两种场景给你具体实现步骤:
一、优先保留格式(存入BLOB字段)
RichEditBox的带格式内容默认可以导出为RTF格式,我们可以把RTF字符串转成字节数组,再存入BLOB字段,这样就能完整保留所有格式。
1. 准备SQLite表结构
首先创建包含BLOB字段的表,比如:
CREATE TABLE IF NOT EXISTS FormattedDocument ( Id INTEGER PRIMARY KEY AUTOINCREMENT, ContentBlob BLOB NOT NULL );
2. 保存RichEditBox内容到SQLite
// 获取RichEditBox的RTF格式内容 string rtfContent = await richEditBox.Document.GetTextAsync(Windows.UI.Text.TextGetOptions.FormatRtf); // 把RTF字符串转成字节数组(用UTF-8编码保证兼容性) byte[] contentBytes = System.Text.Encoding.UTF8.GetBytes(rtfContent); // 用Sqlite3.PCL执行插入/更新操作 using (var connection = new SQLiteConnection(Path.Combine(ApplicationData.Current.LocalFolder.Path, "Documents.db"))) { connection.Execute("INSERT INTO FormattedDocument (ContentBlob) VALUES (?)", contentBytes); }
3. 从SQLite加载内容到RichEditBox
// 定义对应的数据模型类 public class FormattedDocumentModel { public int Id { get; set; } public byte[] ContentBlob { get; set; } } // 加载逻辑 using (var connection = new SQLiteConnection(Path.Combine(ApplicationData.Current.LocalFolder.Path, "Documents.db"))) { // 这里示例查询第一条文档,你可以根据需求调整查询条件 var targetDoc = connection.QueryFirstOrDefault<FormattedDocumentModel>("SELECT * FROM FormattedDocument LIMIT 1"); if (targetDoc != null && targetDoc.ContentBlob != null) { // 把字节数组转回RTF字符串 string rtfContent = System.Text.Encoding.UTF8.GetString(targetDoc.ContentBlob); // 加载到RichEditBox并保留格式 await richEditBox.Document.SetTextAsync(Windows.UI.Text.TextSetOptions.FormatRtf, rtfContent); } }
二、忽略格式(存入TEXT字段)
如果不需要保留格式,操作会更轻量化:
1. 调整表结构
CREATE TABLE IF NOT EXISTS PlainDocument ( Id INTEGER PRIMARY KEY AUTOINCREMENT, ContentText TEXT NOT NULL );
2. 保存纯文本
string plainText = await richEditBox.Document.GetTextAsync(Windows.UI.Text.TextGetOptions.None); using (var connection = new SQLiteConnection(Path.Combine(ApplicationData.Current.LocalFolder.Path, "Documents.db"))) { connection.Execute("INSERT INTO PlainDocument (ContentText) VALUES (?)", plainText); }
3. 加载纯文本
// 对应的数据模型类 public class PlainDocumentModel { public int Id { get; set; } public string ContentText { get; set; } } // 加载逻辑 using (var connection = new SQLiteConnection(Path.Combine(ApplicationData.Current.LocalFolder.Path, "Documents.db"))) { var targetDoc = connection.QueryFirstOrDefault<PlainDocumentModel>("SELECT * FROM PlainDocument LIMIT 1"); if (targetDoc != null) { await richEditBox.Document.SetTextAsync(Windows.UI.Text.TextSetOptions.None, targetDoc.ContentText); } }
注意事项(Windows IoT环境)
- 数据库文件路径:一定要用应用的本地存储路径(
ApplicationData.Current.LocalFolder.Path),避免权限不足的问题,Windows IoT对文件系统访问权限限制比较严格。 - Sqlite3.PCL版本:确保你安装的NuGet包是适配UWP/Windows IoT的版本,避免出现兼容性异常。
内容的提问来源于stack exchange,提问作者Fables Alive
相关产品推荐
相关产品推荐

