将数据从(设计时未知)SQLite db 动态显示到表视图

Posted

技术标签:

【中文标题】将数据从(设计时未知)SQLite db 动态显示到表视图【英文标题】:Dynamically display data from (design-time unknown) SQLite db to a table view 【发布时间】:2011-05-16 09:15:27 【问题描述】:

我正在尝试让一个表视图显示通用 SQLite 表的内容。 用户在运行时选择一个 SQLite 文件(我在设计时不知道它的结构)。然后,我可以提取数据库中所有可用表的列表,以及它们的结构(每个表中的字段和字段类型)和数据。 现在……如何在表格视图中显示它们?

我非常感谢 Core Data,所以我正在尝试使用这个框架。 我可以在“静态”通用核心数据模型中导入所有 SQLite 数据库。它具有三个实体:表、字段和值。

每个表对象与其字段具有一对多关系。 每个字段都与表中每一行的值存在一对多关系。

我知道这看起来很奇怪(我很乐意接受完全替代的建议),但它确实有效:我可以在 Core Data 模型中导入所有 SQLite 数据库数据,无论数据库的结构如何。

但是,为了将表中的数据呈现给用户,我应该在单个表视图中“重新压缩”与表相关的字段和值的所有数据,其中每个字段都需要一列(更不用说现在格式化,但如果这可行,我应该能够将所有格式化问题传递给 NSFormatter)。 我怎样才能做到这一点? 换句话说:如何以编程方式在表视图中创建列并将它们绑定到动态创建的数组控制器?

【问题讨论】:

【参考方案1】:

看起来 CoreData 对你来说不是特别有用。有趣的是,您有一个代表任意 DB 的通用 CD 模型,但您似乎没有使用或不需要 CoreData 的最重要功能,例如持久性、撤消管理等。也就是说,鉴于您当前的设置,您通过为 tableView 实现 dataSource 方法/协议,而不是使用绑定或 NSArrayController ,可以很容易地将 tableView 关闭。

可以为此使用绑定,但您必须在动态实例化自己的列上调用 bind: 方法。然后,您需要创建一个覆盖 valueForKey: 方法并动态查找所需字段值的对象。

【讨论】:

【参考方案2】:

我在当前的项目中做了很多。 我实际上构建了一个模型/对象来保存我的 SQLite 数据。然后我通过运行查询来提取数据,在循环中实例化我的模型对象并将不同的列提取到正确的变量中。

然后我将创建的每个对象添加到 NSMutableArray。我使用这个 Mutable 数组在 NSTableView 中工作。 它非常简单而且超级快。我什至用这种方法做了一个自动完成系统。

如果您需要/想要,我可以分享代码。

【讨论】:

嗨 Dimillian77。谢谢,我很想看看你的代码!您可以将其发送给我或将其放在保管箱或类似设备上并在此处分享链接吗? 你可以在这里找到它 :) 告诉我你的想法:pastie.org/1965009【参考方案3】:

如果你想知道一个SQLite数据库中所有表的列表,可以执行:

select tbl_name from sqlite_master where type='table';

如果您知道表的名称,则可以通过以下操作获取有关其架构的信息:

pragma table_info(theTableName);

与往常一样,我建议使用Flying Meat Database wrapper 与 SQLite 数据库进行交互。这是一种从 SQLite 文件中操作信息的非常简单易用的方法。

至于在NSTableView 中显示信息,从 tableView 中删除所有列并添加新列非常容易,当前表中的每个字段都有一个。这是我自己做的,非常简单。

【讨论】:

以上是关于将数据从(设计时未知)SQLite db 动态显示到表视图的主要内容,如果未能解决你的问题,请参考以下文章

从 SQLite DB 动态创建 ListView 行

Django入门问题解决01

AngularJS / Sqlite / Electron - 未知提供者:$dbServiceProvider

FMDB 出错 - 列名未知

如何在QTableView Qt C ++中将sqlite db数据显示为多列视图?

从 SQLite 读取坐标并创建一个 MKPolygon