【问题标题】:Good database library/ORM for cocoa development可可开发的良好数据库库/ORM
【发布时间】:2010-09-23 13:17:31
【问题描述】:

我正在开发一个 cocoa 应用程序,它将大量使用 Web 服务和标准 dbms(很可能是 MySQL),我想知道是否有人对他们使用的数据库库或 ORM 解决方案有一个好的选择。由于需要支持标准 DBMS 并能够在正常应用程序操作之外修改数据,因此不能选择 CoreData。

我从新的开源库中找到了许多可能的选项: http://github.com/aptiva/activerecord/tree/master

为 C MySQL api 编写我自己的包装器。

欢迎任何建议,

谢谢!

保罗

【问题讨论】:

  • 嘿,非常感谢大家的建议,我将检查几个选项 - 我没有以任何方式与 MYSQL 结婚,它恰好是我们在服务器上使用的我们的网络应用程序,所以我试图在未来的维护中保持一致:)

标签: objective-c database cocoa


【解决方案1】:

当我们第一次开始在Checkout 上工作时,我们遇到了类似的问题,我们的解决方案是使用 PyObjC 用 Python 编写整个应用程序。 Checkout 1 有一个 sqlite 后端,Checkout 2 有一个 postgres 后端。

在 Pyton 方面有几个非常成熟和强大的 ORM,例如 SQLObject,它使用起来非常简单(我们在 Checkout 1.0 中使用它)和 SQLAlchemy,它更强大但有点难以绕开你的大脑(我们在 Checkout 2.0 中使用它)。

您可以评估的一种方法是使用 Objective-C 构建应用程序,但使用 Python 编写数据模型和数据库连接/管理代码。您可以使用 PyObjC 从此代码创建一个插件包,然后将其加载到您的应用程序中,这个 CLI 工具依次加载到一个 Python 插件包中,其中包含所有实际的数据库代码。最终用户大多通过 System Preferences 窗格与数据库交互,该窗格不知道数据库是什么样子,而是使用命令行工具与之交互。

加载插件很简单:

NSBundle *pluginBundle = [NSBundle bundleWithPath:pluginPath];
[pluginBundle load];

您可能需要为您希望从 Obj-C 代码访问的包中的类创建 .h 文件。

【讨论】:

    【解决方案2】:

    您可能还想查看BaseTen framework。它是一个类似 Core Data 的框架(实际上,它可以导入 Core Data 模型),但可以与 PostgreSQL 一起使用(据我所知,虽然不是 MySQL)。它包括一些非常好的功能,例如运行时的模式发现。它还包括一个 NSArrayController 子类,可以自动处理多个用户之间的锁定和同步,因此您可以继续在您的 UI 中使用 Apple 的键值绑定。

    【讨论】:

      【解决方案3】:

      我对这个特殊问题有个人经验。我什至开始为 C MySQL API 编写自己的包装器。

      最终的结论是:不要!

      适用于我的解决方案是通过 PHP 与 MySQL 服务器通信。如果您熟悉 Web 服务,那么您很可能对 PHP 有所了解,因此我不会对此进行详细介绍。

      从数据库中读取:

      1. cocoa 应用程序向服务器发送一个 URL 请求:http://theserver.com/app/get_values.php
      2. get_values.php 脚本处理数据库查询,并以 xml 格式返回数据
      3. cocoa 应用程序加载并解析 xml

      写入数据库:

      1. cocoa 应用向服务器发送更复杂的请求:http://theserver.com/app/put_values.php?name="john doe"&age=21&address=...
      2. put_values.php 脚本解析输入并写入数据库

      这个解决方案的美妙之处在于 PHP 非常适合与 MySQL 一起使用,而 cocoa 有一些方便的内置类用于处理 XML 数据。

      编辑:还有一件事:

      使用这种方法必须弄清楚的关键问题之一是应该在服务器上完成多少处理,以及应该在应用程序本身中完成多少。让可可做可可擅长的事情,让PHP和MySQL做自己擅长的事情。

      您可以编写一个通用的 PHP 脚本来处理 所有 查询:perform_query.php?querystring="SELECT * FROM .....",但这并不是最佳解决方案。您最好的选择是几个较小的 PHP 脚本,它们可以为您处理单个数据集。在我的例子中,有一个用于获取用户列表,一个用于获取交易列表等。同样,这完全取决于您的应用要做什么。

      【讨论】:

        【解决方案4】:

        GDL2 是一个很好的例子,基于 EOF。

        【讨论】:

          【解决方案5】:

          您可以尝试SMySQL 框架(又名MCPKit),而不是通过编写自己的通信包装器来处理来自Cocoa 的MySQL 来重新发明轮子,它是演变成Sequel Pro 项目的CocoaMySQL 应用程序的一部分。它适用于不同版本的 MySQL,并且看起来非常健壮。

          如果您需要了解如何将其整合到您的应用程序中,没有太多的文档,但它有一个易于理解的界面,您可以通过查看 Sequel Pro 的源代码来了解它的工作原理,该源代码可从 Google 下载代码。

          还有 CocoaMySQL 项目的 CocoaMySQL-SBG 分支,但这似乎已经过时,我无法正确构建它。

          【讨论】:

            【解决方案6】:

            我还实现了一个基于 sqlite 的简单对象持久化框架,但它确实不是一件容易的事。我同意 eJames 的结论——如果没有必要,不要自己实现。

            如果您不致力于使用 Objective-C 进行编程,您可能想看看 PyObjC,它允许您使用 Python 对数据库部分进行编程。您可以使用 MySQLdb 模块进行数据库访问,并且有大量在线教程供您使用。将数据填充回 Cocoa/CF 类并将它们传回您的应用并不难。

            PyObjC 的主要警告是目前它不适用于 Tiger。

            【讨论】:

            • PyObjC 1 在 Tiger 中运行良好。与 Leopard 一起提供的 PyObjC 2 尚未与 Tiger 一起使用,尽管这可能很快就会改变。
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-03-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多