6

我想制作 Cookbook 应用程序来存储和阅读(和更新)食谱,或者其他任何东西来练习 OOP 编程和思考。但是,我不确定在 c# (Visual Studio Express) 中哪种存储数据的方式(在这种情况下为食谱)是最好的。我想在程序中优化保存和加载数据,但我没有经验。什么是最好的方法?是通过 XML、SQL 还是纯 TXT?还是其他方式?

4

6 回答 6

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);
}
于 2013-10-09T19:16:52.423 回答
7

我建议在 SqlExpress 中使用 localDB。

Microsoft® SQL Server® 2012 Express 是一个功能强大且可靠的免费数据管理系统,可为轻量级网站和桌面应用程序提供丰富且可靠的数据存储。

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

你也可以看看这个类似的问题

这里是一篇关于XML 与 DB的文章,它表明 XML 正在失地。

于 2013-10-09T19:16:55.473 回答
3

尝试使用 SQLite 它的轻量级便携式数据库 http://www.sqlite.org/

于 2013-10-09T19:13:42.323 回答
0

这取决于很多事情,主要是您计划拥有多少食谱,以及您是否希望能够搜索、排序或设置食谱样式。

文本文件是最简单的方法。您可以添加一些简单的搜索和订购功能。

如果它有数百个,您可以使用 xml 和序列化程序来解决。它将允许您稍后为食谱设置样式,并为数据提供一些结构。如果您的食谱进入数千个,这种方式可能会成为一场噩梦。

最好的方法是数据库。Sql Server Compact 是一个免费选项,它通过 Entity Framework 之类的东西与 c# 很好地连接起来。如果您还不熟悉数据库或 ado.net 或实体框架,则此选项将花费最长的时间。

于 2013-10-09T19:17:11.003 回答
0

您最好的选择是使用 Sql Server Compact ( http://www.microsoft.com/en-us/sqlserver/editions/2012-editions/compact.aspx 1 )。

那是因为它嵌入了您的应用程序,您不需要在部署等上安装额外的库。它也是简单表格数据的一个很好的存储点。

于 2013-10-09T19:12:14.057 回答
0

这在很大程度上取决于应用程序将保存多少数据以及您希望如何搜索该数据。

对于较少量的数据,可以使用包含 XML och JSON 的纯文本文件。对于大量数据,我推荐 SQL 服务器或 NOSQL 数据库(MongoDB 或 Raven)。

于 2013-10-09T19:14:45.933 回答