我(基本上)正在研究用Java编写的日历应用程序,我需要一种存储日历事件的方法。这是我编写的第一个“真正的”应用程序,而不是简单的项目(通常用于类),它们不在程序会话之间存储信息,或者将它作为text或.dat文件存储在与程序相同的目录中,所以我有一些关于数据存储的非常基本问题。
如果有某种教程(或多篇教程)涵盖了我的问题的答案,那些链接将是完全可以接受的答案。
(我知道已经提出了一些类似的问题,但我找不到任何一个可以解决完整初学者观点的问题。)
编辑:就像我在其中一条评论中所说的那样,总的来说,我有兴趣用它作为一个学习如何以“正确”(合理可扩展,合理标准)的方式做事的机会,即使有一些更简单的解决方案适用于这种基本情况。答案 0 :(得分:3)
对于快速解决方案,如果您的数据结构(当然还有访问它们的方式)非常简单,可以使用您自己的格式(例如二进制,XML,...)读取和写入数据到文件中,或者也许标准格式如iCalendar可能更适合您的问题。 iCal4J等图书馆可能会帮助您。
考虑到问题的更一般方面,这是一个更广泛的主题,但您可能想要阅读有关数据库(关系或非关系)。是否要使用它们取决于应用程序的整体复杂程度。
可以使用JBDC在Java中使用许多关系数据库。这应该允许您连接到您选择的关系数据库(SQL)。其中一些在他们自己的服务器应用程序中运行(例如MS SQL,Oracle,MySQL,PostgreSQL),但其中一些可以嵌入到您的Java应用程序中,例如:JavaDB(Apache Derby DB的变体), Apache Derby DB,HSQLDB,H2或SQLite。
这些可嵌入的SQL数据库实际上将数据存储在运行应用程序的同一台机器上的文件中(以特定于它们的格式),但允许您使用SQL查询来使用数据。 好处包括数据的某种结构(在设计表和可能的约束时构建)和(当引擎支持时)通过transactions处理并发访问的能力。即使在桌面应用程序中,这也许很有用。
如果您必须学习SQL,这可能意味着学习曲线,但它应该省去了处理定义自己的文件格式细节的麻烦。通过SQL(通常为其他开发人员所知)为您的数据提供结构可能比定义您自己的数据结构更好,无论如何您必须保存和读取自己的文件。
此外,如果您想直接处理对象,而不了解SQL,您可能会对Object-Relational Mapping框架感兴趣,例如Hibernate。他们的目的是通过直接存储/加载对象来隐藏SQL细节。不是每个人都喜欢它们,并且它们也有自己的学习曲线(这可能需要学习SQL如何工作的一些细节)。可以详细讨论它们的优缺点(在StackOverflow甚至是DBA.StackExchange上肯定存在这方面的问题。)
还有其他形式的数据库,例如XML数据库或Semantic-Web / RDF数据库,这些数据库可能适合您的需求,也可能不适合您。
答案 1 :(得分:1)
如何存储事件对象和其他数据? (.dat文件, 某种类型的数据库等)
这取决于要存储(和加载)的数据的大小,以及是否希望能够对数据执行查询。
它们应该存放在哪里?
用户目录(或用户目录的子目录)中的文件是一个不错的选择。使用System.getProperty("user.home")
获取它。
我猜测将所有对象加载到内存中并不好 程序启动,而不是在硬盘驱动器上更新它们,直到 程序结束。那我该怎么做呢?
这可能是完全有效的事情,除非数据量太大以至于会占用太多内存。我不认为这对简单的日历应用程序来说是个问题。如果您不想这样做,则将事件存储在数据库中并执行查询以仅加载必须显示的事件。
答案 2 :(得分:1)
一个简单的顺序文件就足够了。基本上,文件中的每一行代表一条记录,或者在您的情况下代表一个事件。使用字段分隔符分隔记录中的每个字段,类似管道(|
)符号的效果很好。请记住以相同的格式存储每条记录,例如:
date|description|etc
这样,您可以将文件中的每一行作为记录读回,通过在分隔符(|
)符号上拆分字符串来提取字段,然后使用数据。
将数据存储在与应用程序相同的文件夹中应该没问题。
我发现处理对象(大多数情况下)的最佳方法是确定您存储的数据量是否足够大,从而对用户的内存产生影响。根据你的描述,这个程序应该没问题。
答案 3 :(得分:0)
正确的答案取决于细节,但您可能希望将事件写入数据库。有几个很好的免费数据库,比如MySQL和Postgres,所以你可以(相对)轻松地抓住它并玩它。
学习如何使用数据库是一个很大的主题,比我在论坛帖子中回答的要大。 (我可以建议你阅读我的书“数据库设计的Sane方法”,但在论坛上制作这样一个无耻的插件会很俗气!)
但是,基本上,您希望在需要时从数据库中读取数据,并在更改时更新数据。不要在启动时读取所有内容,并在关机时将其全部写回。
如果数据量很小且很少更改,将其全部保存在内存中并将其写入平面文件会更简单,更快捷。但大多数应用程序都不适合这种描述。