Ios 使用FMDB和Obj-C的线路中断

Ios 使用FMDB和Obj-C的线路中断,ios,objective-c,sqlite,fmdb,Ios,Objective C,Sqlite,Fmdb,我对iOS编程比较陌生,所以请耐心听我说 我正在创建一个从表视图调用配方的应用程序,然后在详细视图中将测量值和成分作为标签列出。我将我的食谱编入谷歌表格,下载成.csv文件,并使用SQLiteStudio填充表格。然后,我导出了数据库,并使用FMDB在我的应用程序中对其进行了加载。那里一切都很好,我可以检索各个字段 我想做的是列出测量值和成分,以便显示换行符: 0.5盎司。 1.0盎司。 1号跳汰机 而不是:0.5盎司,1.0盎司,1个jigger,这是我写进谷歌文档的方式 我尝试在SQLite

我对iOS编程比较陌生,所以请耐心听我说

我正在创建一个从表视图调用配方的应用程序,然后在详细视图中将测量值和成分作为标签列出。我将我的食谱编入谷歌表格,下载成.csv文件,并使用SQLiteStudio填充表格。然后,我导出了数据库,并使用FMDB在我的应用程序中对其进行了加载。那里一切都很好,我可以检索各个字段

我想做的是列出测量值和成分,以便显示换行符:

0.5盎司。 1.0盎司。 1号跳汰机

而不是:0.5盎司,1.0盎司,1个jigger,这是我写进谷歌文档的方式

我尝试在SQLite查看器中使用\n,但它将其输出为字符串,而不是将其编码为新行。但是,当我查看附带的.sql文件时,TextMate2将其作为新行读取。我不确定是否必须在调用FMDB的tableviewcontroller实现文件或其他地方应用一些代码

我已经寻找了一段时间的解决方案,但没有运气。如果能帮我指引正确的方向,我将不胜感激。谢谢

CocktailListTableViewController.m

CocktailsDetailTableViewController.m


解决这个问题有两种方法

一种方法是将成分列表存储为单个文本字段,在字符串中使用新行字符。SQLite和FMDB处理得很好

从UI透视图来看,您将在多行UIExtField或UILabel中显示此文本字段。如果使用UILabel,请确保将行数设置为1以外的值,即零或实际行数

这里的技巧是将这个换行符字符串放入数据库。这取决于你是怎么做的。但如果您使用的是某些SQLite工具,则不能使用\n序列,因为这是不可接受的SQL语法。您可以使用x'0a'或char10:

或:

或者,如果使用SQLite命令行工具,您可以只插入换行符:

insert into foo (bar) values ('baz
qux');
但不能使用\n序列。您可以从Objective-C代码中执行此操作,但不能从第三方SQLite工具中执行

另一种方法是将配方列表和每个配方的成分列表存储在两个不同的表格中,例如配方和成分。然后,您可以在配料表中将每种配料单独存储在一行中

我觉得这是一个更符合逻辑的实现。如果您这样做了,那么您就可以选择如何显示成分列表—单独的UILabel控件、UITableView,或者,如果您确实想,将它们连接在一起,用换行符分隔,并在单个多行控件中显示它们


我可以看出你试图把所有的原料储存成一根长的、预先制作好的绳子,我认为这种方法不是最好的

它会起作用的,但它不是未来友好型的,也不是简单的。。。平常的

我强烈建议你有一张新的桌子,它知道所有可能的成分,包括你的ID和其他信息,比如颜色、平均体重、图片等等

请注意,不建议将图像存储在SQL数据库中,您更希望将图像保存为文件或URL的位置的引用存储起来*

一旦你有了那张桌子,你就是黄金。您只需在配方表中引用一组配料。例如[1,27133],有了它,你可以做你想做的事。你有一系列的成分对象,你可以根据自己的喜好来处理

例如,我会在它上面循环,并在彼此下面创建标签,这样你就有了自己的线条。 我也可以简单地使用一个NSMutableString,并使用示例再次用components.name填充它 通过使用NSMutableString并在每个对象名称之间添加换行符,可以在UITextView的每个成分之间填充换行符

更重要的是,您可以修改所有内容,而无需重新修改布局或标签,也无需重新编写整个数据库,因为每个配方都有静态换行符成分

这是我想说的最重要的一点。通过这种方法,你可以从任何配方中去除任何成分,而不必想得太远,也不必冒忘记某些东西的风险。您还可以通过从配料表中删除任何配方中的配料来永久销毁它。添加新的也一样。或者说你想改变配料X的名称,你不必在每个食谱中都这么做,等等

编辑:在评论中回答您的问题

要在tableview中加载配方并在详细信息页面上加载配料,您可以这样做:

你把你所有的食谱都放在一个数组中,然后显示我认为你已经成功了。 请注意,所有配方都有一个名为“配料”的属性,它是配料键/ID/某物的数组

在手机上点击,你想加载你需要的成分 只有知道的ID,您只需从存储在配方中的ID数组中获取它们,然后从数据库中选择它们


从全局来看,直到用户点击,您才知道成分是什么:如果您不需要在表视图中显示它们,那么您还不需要对它们进行加载。但是你已经知道他们的身份了,否则你就找不到他们了

你的名单是怎么显示的?UILabels?在UITextView中,我最终创建了一个新表,其中包含一行配料以及我第一张表中的recipeID。我使用recipeID作为两个表的主键,这是将表中的信息链接在一起的正确方法吗?他们在同一个数据库里。然后我创建了一个新的NSMutableArray来保存配料。我在显示配料时遇到了问题,尽管b/c我不认为这些表格是通过recipeID连接的,而没有调用它。你知道我将如何调用recipeID,以便配方名称显示在表视图中,配料将加载到详细信息中吗?
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view.
self.title = cocktails.recipeName;
self.recipeIngred.text = cocktails.recipeIngred;
self.recipeMeasure.text = cocktails.recipeMeasure;
insert into foo (bar) values ('baz' || x'0a' || 'qux');
insert into foo (bar) values ('baz' || char(10) || 'qux');
insert into foo (bar) values ('baz
qux');