2015-04-22 67 views
0

我对iOS编程相对比较陌生,所以请耐心等待。使用FMDB和Obj-C的换行符

我创建了一个应用程序,从表视图中调用食谱,然后将详细信息视图中的度量和成分作为标签列出。我在Google Sheets中编制了我的食谱,并将其下载为.csv文件,并使用SQLiteStudio填充表格。然后我导出了数据库,并使用FMDB将其放入我的应用程序中。一切工作正常,我可以检索各种领域。

我试图做的是名单出了测量和成分,使其显示与换行符:

0.5 oz. 1.0 oz. 1 jigger

而不是:0.5 oz., 1.0 oz., 1 jigger这是我写的到谷歌文档。

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

我一直在寻找解决方案一段时间,但没有运气。任何帮助在正确的方向转向我将不胜感激。谢谢!

CocktailListTableViewController.m

- (NSMutableArray *)recipeCocktails { 
recipeCocktails = [[NSMutableArray alloc] init]; 

NSString *databasePath = [(AppDelegate *) [[UIApplication sharedApplication] delegate] databasePath]; 

FMDatabase *fmDB = [FMDatabase databaseWithPath:databasePath]; 

if(![fmDB open]) 
{ 
    NSLog(@"Could not open DB, try again"); 
    return nil; 
} 

FMResultSet *results = nil; 
results = [fmDB executeQuery:@"SELECT * FROM recipesCocktails"]; 
NSLog(@"result %@ ",results); 
if ([fmDB hadError]) { 
    NSLog(@"DB Error %d: %@", [fmDB lastErrorCode], [fmDB lastErrorMessage]); 
} 
while ([results next]) { 
    Cocktails *cocktails = [[Cocktails alloc] init]; 
    cocktails.recipeName = [results stringForColumn:@"recipeName"]; 
    cocktails.recipeMeasure = [results stringForColumn:@"recipeMeasure"]; 
    cocktails.recipeIngred = [results stringForColumn:@"recipeIngred"]; 
    cocktails.recipeGlass = [results stringForColumn:@"recipeGlass"]; 
    cocktails.recipeShaker = [results stringForColumn:@"recipeShaker"]; 
    cocktails.recipeDirections = [results stringForColumn:@"recipeDirections"]; 

    [recipeCocktails addObject:cocktails]; 
} 

[fmDB close]; 

return recipeCocktails; 

CocktailsDetailTableViewController.m

- (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; 
+0

你是如何显示你的列表? UILabels?在UITextView? – 2015-04-23 02:48:00

回答

0

我可以看到你想要的所有成分存储为一个长,预建的字符串,我认为这种做法是不是最好的。

这是要去工作,但它不是未来友好的或简单地......平常

我强烈建议有一个新的表k请注意,建议不要将图像存储在SQL数据库中,而且您宁愿将图像存储在SQL数据库中,也不想将图像存储在SQL数据库中将参考文件保存为文件或URL的地址)*

一旦你有了这张表,你就是金。您只需在您的配方表中引用一系列配料。例如[1,27,133],你可以做你想做的。你有一系列的配料对象,你可以看待你的看法。

例如,我会循环它并在彼此之下创建标签,并且您将拥有您的线条。 我也可以简单地使用的NSMutableString,并与ingredients.name填充它(再次使用的例子) 你可以填补各成分之间的换行(使用的NSMutableString和每个对象名称之间添加新行)一个UITextView。

而且更重要的是,你可以修改一切,而不必重新工作,你的布局或标签,或者因为你对每个配方静态换行符成分重新写你的整个数据库。

这是我想要做的最重要的一点。使用这种方法,您可以从任何配方中移除任何配料,而无需考虑真正的远或忘记某些东西。您也可以通过从配料台中取出任何配方来永久销毁任何配料。添加新的一样。或者说你想改变成分X的名称,你不必在每个配方中都这样做,等等。

编辑:在评论

回答你的问题要加载的详细信息页面上的实现代码如下配方和成分,你可以像这样:

  • 您加载所有你的食谱一个数组和显示(我认为你已经成功了)。 请注意,所有的食谱都有一个名为“成分”的属性,这是一个成分键/ ID的东西

  • 单元格水龙头,你想加载的成分,你只知道的ID,你只是得到他们来自您存储在您的配方中的Id的数组,并从您的数据库中选择它们。

在全球范围内,你根本不知道什么配料,直到用户点击:如果你并不需要在表格视图中显示它们,那么你不需要LAOD他们没有。但你已经知道他们的身份证(否则你将无法找到他们!)。

+0

我最终创建了一个新的表格,其中有一行成分以及我在第一个表格中的recipeID。我使用recipeID作为两个表的主键(这是将表中的信息链接在一起的正确方法?它们在同一个数据库中)。 然后我创建了一个新的NSMutableArray来保存配料。我很难通过b/c显示成分,但我不认为这些表格是通过recipeID连接的,不需要调用它。你知道我怎么称呼recipeID,以便食谱名称出现在表格视图中,并且成分会在细节中加载吗? – underriterd

+0

我根据你的问题编辑了我的答案:) –

0

有两种方法可以解决这个问题。

  1. 一种方法是将成分列表作为单个文本字段存储,并在字符串中包含换行符。 SQLite(和FMDB)处理这个罚款。

    从用户界面的角度来看,您将在多行UITextFieldUILabel中显示此文本字段。如果您使用UILabel,请确保将行数设置为1以外的值(即零或实际行数)。

    这里的诀窍是把这个换行字符串放到数据库中。这取决于你如何做到这一点。但是如果你使用的是SQLite工具,你不能使用\n序列,因为这是不可接受的SQL语法。您可以使用x'0a'char(10)

    insert into foo (bar) values ('baz' || x'0a' || 'qux'); 
    

    或:

    insert into foo (bar) values ('baz' || char(10) || 'qux'); 
    

    ,或者,如果使用SQLite的命令行工具,你可以插入新行:

    insert into foo (bar) values ('baz 
    qux'); 
    

    但你不能使用\n序列。你可以从你的Objective-C代码中完成,但不能从第三方SQLite工具中完成。

  2. 另一种方法是将配方列表和配方列表存储在两个不同的表中(例如recipesingredients)。然后你可以在ingredients表格中将每个成分存储在一个单独的行中。

    这让我感觉更合乎逻辑。如果你这样做了,你可以选择想要如何显示成分列表(单独使用UILabel控件,UITableView或者如果你真的想将它们连接在一起,用换行符分隔并显示它们一个多控制。