我正在开发一个可可应用程序,它将大量使用Web服务和标准的dbms(很可能是MySQL),我想知道是否有人对他们使用的数据库库或ORM解决方案有一个很好的选择。由于需要支持标准DBMS并且能够在正常应用程序操作之外修改数据,因此CoreData不是一个选项。
我从新的开源库中找到了许多可能的选项: http://github.com/aptiva/activerecord/tree/master
为C MySQL api编写自己的包装器。
欢迎任何建议,
谢谢!
保
答案 0 :(得分:5)
当我们第一次开始Checkout工作时,我们遇到了类似的问题,我们的解决方案是使用PyObjC在Python中编写整个应用程序。 Checkout 1有一个sqlite后端,Checkout 2有一个postgres后端。
在Pyton方面有一些非常成熟和强大的ORM,例如SQLObject,这很简单(我们用它来检查Checkout 1.0)和SQLAlchemy,这是更强大但更难以包裹你的大脑(我们将它用于Checkout 2.0)。
您可以评估的一种方法是在Objective-C中构建应用程序,但是在Python中编写数据模型和数据库连接/管理代码。您可以使用PyObjC从此代码创建一个插件包,然后将其加载到您的应用程序中这或多或少是我们为Checkout Server采用的方法,它使用Foundation命令行工具来管理postgres服务器及其中的数据库,这个CLI工具反过来加载一个包含所有实际数据库代码的Python插件包。最终用户主要通过“系统偏好设置”窗格与数据库进行交互,该窗格无法确定数据库的外观,而是使用命令行工具与其进行交互。
加载插件很简单:
NSBundle *pluginBundle = [NSBundle bundleWithPath:pluginPath];
[pluginBundle load];
您可能需要为您希望从Obj-C代码访问的捆绑包中的类创建.h文件。
答案 1 :(得分:3)
您可能还想查看BaseTen framework。它是一个类似Core Data的框架(事实上,它可以导入Core Data模型),但是与PostgreSQL一起使用(尽管不是MySQL,据我所知)。它包含一些非常好的功能,例如运行时的模式发现。它还包括一个NSArrayController子类,可自动处理多个用户的锁定和同步,因此您可以继续在UI中使用Apples键值绑定。
答案 2 :(得分:2)
我对这个特殊问题有个人经验。我甚至开始为C MySQL API编写自己的包装器。
最终的结论是:不要!
在我的案例中有效的解决方案是通过PHP与MySQL服务器通信。如果您熟悉Web服务,很可能您对PHP有所了解,因此我不会详细介绍这些内容。
从数据库中读取:
写入数据库:
这个解决方案的优点在于PHP非常适合使用MySQL,而cocoa有一些方便的内置类来处理XML数据。
编辑:还有一件事:
使用此方法需要弄清楚的一个关键事项是应该在服务器上完成多少处理,以及应用程序本身应该完成多少处理。让cocoa做可可擅长的事情,让PHP和MySQL做他们擅长的事情。
您可以编写一个通用的PHP脚本来处理所有查询:perform_query.php?querystring =“SELECT * FROM .....”,但这不是最佳解决方案。最好的办法是使用几个较小的PHP脚本来处理各个数据集。在我的例子中,有一个用于获取用户列表,一个用于获取事务列表等。再次,这完全取决于您的应用程序将要执行的操作。
答案 3 :(得分:1)
GDL2是一个很好的例子,基于EOF。
答案 4 :(得分:1)
不是通过编写自己的通信包装器来处理来自Cocoa的MySQL来重新发明轮子,而是可以尝试SMySQL框架(又名MCPKit),它是CocoaMySQL应用程序的一部分,演变为{{3项目。它适用于不同版本的MySQL,并且看起来非常强大。
如果您需要了解如何将其合并到您的应用程序中,那么文档并不多,但它有一个易于理解的界面,您可以通过查看Sequel Pro的来源看到它的工作原理,可以从Google下载代码。
还有CocoaMySQL项目的Sequel Pro分支,但这似乎已经过时了,我无法正确构建它。
答案 5 :(得分:0)
我还实现了一个基于sqlite的简单对象持久化框架,但这当然不是一件容易的事。我同意eJames的结论 - 如果你不需要,不要自己实施。
如果您不致力于使用Objective-C进行编程,您可能需要查看PyObjC,它允许您使用Python编写数据库部分。您可以使用MySQLdb模块进行数据库访问,并且有大量在线教程供其使用。将数据填充回Cocoa / CF类并将它们传回给您的应用程序并不难。
与PyObjC的主要警告是,目前它不适用于Tiger。