在运行时向对象添加属性,并保存到数据库

Posted

技术标签:

【中文标题】在运行时向对象添加属性,并保存到数据库【英文标题】:Adding properties to object at runtime, and saving to a database 【发布时间】:2013-05-11 17:46:28 【问题描述】:

我有一组模型类定义,每个都有一些属性和方法。

每个新的模型类定义都映射到它自己的数据库表,这些属性构成了表列。然后可以将每个新创建的对象充分保存以备不时之需。

我的问题是,我怎样才能优雅地允许在运行时添加其他属性,并在不重新迁移数据库中的所有表的情况下保存它。

例如,假设我有一个“文章”对象,其中包含名称、创建日期和文章正文作为属性(最初),但在运行时,用户决定为特定文章添加概要作为属性,如何将新实体保存到数据库中?

我想我正在尝试(除其他外)模仿在 Drupal 中添加字段或在 Wordpress 中添加自定义字段。

由于在创建或更新表时必须指定每一列的数据类型,我能想到的唯一方法是创建一个以数组作为数据类型的列。这个解决方案感觉有点尴尬,只是想知道其他人是如何做到的。

非常感谢您的帮助。

【问题讨论】:

你为什么用 php 和 Django 来标记这个?到目前为止它实现了什么? 到目前为止是 php,但是我在使用其 Reflection API 时遇到了一些困难,因此考虑切换到 Python 和 Django 【参考方案1】:

作为最低公分母,您可以将对象保存为一系列键值对,但这听起来既笨拙又缓慢。当您拥有包含对象等的对象时,我还可以设想噩梦。

或者,您可以在存储之前对它们进行序列化(也许是 xml 文档?)但这放弃了数据库级别的任何类型的结构,并且如果您希望根据特定列值查询数据库,事情就会变得复杂。

但如果我是你,我会阅读一些“休眠”实用程序,例如休眠(!)以了解它们如何持久化事物。这些实用程序已经在解决您的确切问题,并且您可以保证他们会对此进行大量思考。

如果你幸运的话,甚至可能有这样的实用程序,你可以开箱即用,无需了解细节。

【讨论】:

感谢您将我的鼻子指向正确的方向。尽管我正在按照您的建议深入研究休眠,但您有什么好的资源可以与我分享吗?非常感谢。 我不是这方面的专家,但我知道 Hibernate 是一个开源项目:http://www.hibernate.org/。快速浏览这里会显示大量文档以及源代码,即使您需要进入该级别

以上是关于在运行时向对象添加属性,并保存到数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何在运行时向转发器项目添加属性?

我可以使用类别和运行时向 UIScrollView 添加 BOOL 类型属性“isScrolling”吗?

在运行时向 Gridview 动态添加行

是否可以在处理时向Go频道添加项目?

在运行时向 Enum 添加值

在 AsyncTask 运行时向 TextView 添加文本