【问题标题】:Line breaks using FMDB and Obj-C使用 FMDB 和 Obj-C 的换行符
【发布时间】:2015-04-24 15:58:35
【问题描述】:

我对 iOS 编程比较陌生,所以请多多包涵。

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

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

0.5 oz. 1.0 oz. 1 jigger

而不是:0.5 oz., 1.0 oz., 1 jigger,这是我将其写入 Google 文档的方式。

我尝试在 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;

【问题讨论】:

  • 您的列表显示方式如何?用户标签?在 UITextView 中?

标签: ios objective-c sqlite fmdb


【解决方案1】:

我可以看到您正在尝试将所有成分存储为一根预先构建的长字符串,我认为这种方法不是最好的。

它会起作用,但它不适合未来,或者只是......通常。

我强烈建议使用一张新表,该表了解所有可能的成分,并附上 ID 和其他您的意愿信息(颜色、平均重量、图片* 等等)

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

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

例如,我会循环遍历它并在彼此下方创建标签,然后您就会拥有自己的线条。 我也可以简单地使用 NSMutableString 并用成分名称填充它(再次使用示例) 您可以在每个成分之间使用换行符填充 UITextView(通过使用 NSMutableString 并在每个对象名称之间添加换行符)。

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

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

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

要加载表格视图中的食谱和详细信息页面上的成分,您可以这样做:

  • 您将所有食谱加载到一个数组中并显示出来(我认为您已经在这方面取得了成功)。 请注意,所有食谱都有一个名为“Ingredients”的属性,它是一组成分键/ids/something

  • 在点击单元格时,您想要加载您只知道其 ID 的成分,您只需从存储在配方中的 ID 数组中获取它们,然后从您的数据库中选择它们。

在全球范围内,在用户点击 之前,您都不知道成分是什么:如果您不需要在表格视图中显示它们,那么您还不需要加载它们。但是您已经知道他们的 id(否则您将无法找到他们!)。

【讨论】:

  • 我最终创建了一个新表,其中包含一行成分以及我在第一个表中拥有的 recipeID。我使用 recipeID 作为两个表的主键(这是将表中的信息链接在一起的正确方法吗?它们在同一个数据库中)。然后我创建了一个新的 NSMutableArray 来保存这些成分。我在显示配料时遇到了麻烦,尽管 b/c 我不认为表格是通过 recipeID 连接的而不调用它。你知道我将如何调用 recipeID 以便配方名称显示在表格视图中并且配料将加载到详细信息中吗?
【解决方案2】:

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

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

    从 UI 角度来看,您将在多行 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,或者,如果你真的想,将它们连接在一起,用换行符分隔并将它们显示在单个多行控件中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多