我想制作Cookbook应用程序来存储和阅读(和更新)食谱,或其他任何东西来练习OOP编程和思考。但是,我不确定,在这种情况下,存储数据的方式是c#(Visual Studio Express)中最好的方式。 我想在程序中优化保存和加载数据,但我没有经验。什么是最好的方法?是通过XML,SQL还是普通的TXT?或者其他一些方式?
答案 0 :(得分:9)
如果你还没有这样做,最好先从XML文件输入/输出开始,然后再进入任何太高级的。
通常,您可以使用以下方法读取和写入文件来获取路径:
string appDataPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
因此,如果您想将数据存储在名为“Cookbook”的文件夹和名为“recipes.xml”的文件中,您可以执行以下操作:
string dataPath = Path.Combine(appDataPath, "Cookbook");
string recipesFileFullPath = Path.Combine(dataPath, "recipes.xml");
这为您提供了类似C:\Users\John\AppData\Local\Cookbook\recipes.xml
或类似的路径,您可以将其传递给文件输入和输出函数。
然后,您可以开始使用System.IO
命名空间类,例如File
和FileStream
,以了解如何正确打开和读取/写入文件。
然后,下一个更高级别的步骤是将这些文件流传递给用于读取和写入XML的对象,例如Linq to XML(XDocument
类),这是首选方法。或者较早的XmlSerializer
。
修改强>
以下是创建对象并将其保存到XML文件的示例代码:
public class RecipeBook
{
public List<Recipe> Recipes { get; set; }
public RecipeBook()
{
Recipes = new List<Recipe>();
}
}
public class Recipe
{
public DateTime LastModified { get; set; }
public DateTime Created { get; set; }
public string Instructions { get; set; }
}
public void SomeFunction()
{
RecipeBook recipeBook = new RecipeBook();
var myRecipe = new Recipe()
{
Created = DateTime.Now,
LastModified = DateTime.Now,
Instructions = "This is how you make a cake."
};
recipeBook.Recipes.Add(myRecipe);
var doc = new XDocument();
using (var writer = doc.CreateWriter())
{
var serializer = new XmlSerializer(typeof(RecipeBook));
serializer.Serialize(writer, recipeBook);
}
doc.Save(recipesFileFullPath);
}
您只需要将此代码分解为适合您的结构。例如,如果您正在制作Windows窗体应用程序,则RecipeBook
将是主窗体的私有成员变量。在构造函数中,您可以构造recipesFileFullPath
字符串并将其存储为私有成员变量。在Form.Loaded事件上,您可以检查XML文件是否已存在,如果是,则加载它。如果不是,您将创建一个空的新RecipeBook
类。您也可能只在用户单击保存按钮或引发Form.Closing事件时序列化并保存。
修改强>:
要反序列化和读取文件,您可以执行以下操作:
var serializer = new XmlSerializer(typeof(RecipeBook));
using (var fs = new FileStream(recipesFileFullPath))
{
RecipeBook book = (RecipeBook)serializer.Deserialize(fs);
}
答案 1 :(得分:7)
我建议在SqlExpress中使用localDB。
Microsoft®SQLServer®2012Express是一款功能强大且可靠的免费软件 数据管理系统,提供丰富可靠的数据存储 用于轻量级网站和桌面应用程序。
http://blogs.msdn.com/b/sqlexpress/archive/2011/07/12/introducing-localdb-a-better-sql-express.aspx
http://technet.microsoft.com/en-us/library/hh510202.aspx
您还可以查看类似的question。
这里有一篇关于XML vs. DB的文章,其中显示XML正在失势。
答案 2 :(得分:2)
尝试使用SQLite它的轻量级便携式数据库 http://www.sqlite.org/
答案 3 :(得分:0)
您最好的选择是使用Sql Server Compact(http://www.microsoft.com/en-us/sqlserver/editions/2012-editions/compact.aspx 1)。
这是因为它嵌入了您的应用程序,您不需要在部署等上安装额外的库。此外,它是简单表格数据的良好存储点。
答案 4 :(得分:0)
这取决于应用程序将拥有多少数据以及您希望如何搜索该数据。
对于少量数据,包含XML och JSON的纯文本文件可以。对于大量数据,我推荐SQL服务器或NOSQL数据库(MongoDB或Raven)。
答案 5 :(得分:0)
这取决于很多事情,主要是你计划使用多少食谱,以及你是否希望能够对食谱进行搜索,分类或样式化。
文本文件是最简单的方法。您可以添加一些简单的搜索和排序功能。
如果它是数百个,你可以使用xml和序列化器。它允许您稍后对配方进行样式设置,并为数据提供一些结构。如果你的食谱输入成千上万,这种方式可能会成为一场噩梦。
最好的方法是数据库。 Sql Server Compact是一个免费的选项,可以通过像Entity Framework这样的东西与c#很好地连接。如果您还不熟悉数据库或ado.net或实体框架,此选项将花费最长时间。