sql - UITableView 中来自 SQLite 的 iOS NSArray 的 NSDictionaries

标签 sql ios sqlite uitableview nsarray

这两天我一直在为这个问题苦苦挣扎,但我似乎不太明白。我有一个具有以下结构的 SQlite 数据库。

enter image description here

List 和 List_Items 之间是一对多关系

我访问数据库并创建一个对象,然后将其添加到 NSDictionary 中,然后再将其添加到 NSArray 中。我执行此操作两次,一次针对 List 表,一次针对 List_Items。 然后我使用列表数组来计算 TableView 行的列表数量,然后将它们添加到 TableView 中。

当我到达方法时问题就出现了

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 

我似乎无法弄清楚如何匹配列表和 List_Items 中的记录,以在向下钻取表格 View 中显示属于该列表的列表项。

具体的代码示例会很有帮助,因为我此时头脑很困惑:(

这是我当前 Writersblock 的相关代码。

 //#******************************************************#

//               *******Start Database*******

//#******************************************************#

-(void)checkAndCreateDatabase
{
    // Check if the SQL database has already been saved to the users phone, if not then copy it over
    BOOL success;

    // Create a FileManager object, we will use this to check the status
    // of the database and to copy it over if required
    NSFileManager *fileManager = [NSFileManager defaultManager];

    // Check if the database has already been created in the users filesystem
    success = [fileManager fileExistsAtPath:databasePath];

    // If the database already exists then return without doing anything
    if(success) return;

    // If not then proceed to copy the database from the application to the users filesystem

    // Get the path to the database in the application package
    NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:databaseName];

    // Copy the database from the package to the users filesystem
    [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];
}

-(void)readItemsFromDatabase 
{
    // Setup the database object
    sqlite3 *database;

    // Init the Items Array
    items = [[NSMutableArray alloc] init];
    lists = [[NSMutableArray alloc] init];

    //---------------### SELECT THE LISTS #####---------------//

    // Open the database from the users filessytem
    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) 
    {
        NSLog(@"SQL Opened");
        // Setup the SQL Statement and compile it for faster access
        const char *sqlStatement = "SELECT * from List";
        sqlite3_stmt *compiledStatement;
        if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
            // Loop through the results and add them to the array
            while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
                // Read the data from the result row
                NSString *aListName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];
                NSString *aUserID = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)];
                NSString *aListID = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)];

                NSLog(@"SQL Compiled");

                // Create a new list object with the data from the database
                List *list = [[List alloc] initWithlistName:(NSString *)aListName userID:(NSString *)aUserID listID:(NSString *)aListID];

                listNames = [NSDictionary dictionaryWithObjectsAndKeys:list.listName,@"listName",list.listID,@"listID",list.listID,@"listID",nil];

                // Add the Shopping object to the list Array
                [lists addObject:listNames];

            }
        }

        else { NSLog(@"Database Not Found");}

        // Release the compiled statement from memory
        sqlite3_finalize(compiledStatement);
    }
    sqlite3_close(database);

        //---------------### SELECT THE LIST_ITEMS #####---------------//

        if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) 
        {
            NSLog(@"SQL Opened");
            // Setup the SQL Statement and compile it for faster access
            const char *sqlStatement = "SELECT * from List_Items";
            sqlite3_stmt *compiledStatement;
            if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
                // Loop through the results and add them to the array
                while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
                    // Read the data from the result row

                    NSString *aBrandName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 1)];
                    NSString *aItemName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)];
                    NSString *aItemQuantity = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 4)];
                    NSString *aImageUrl = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 5)];
                    NSString *aListID = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 6)];

                    NSLog(@"SQL Compiled");

                    // Create a new items object with the data from the database
                    Shopping *shopping = [[Shopping alloc] initWithlistID:(NSString *)aListID brandName:(NSString *)aBrandName itemName:(NSString *)aItemName itemQuantity:(NSString *)aItemQuantity imageURL:(NSString *)aImageUrl];                    

                    itemList = [NSDictionary dictionaryWithObjectsAndKeys:shopping.listID,@"listID",shopping.brandName,@"brandName",shopping.itemName,@"itemName",shopping.itemQuantity,@"itemQuantity",shopping.imageURL,@"imageURL",nil];

                    // Add the Shopping object to the items Array
                    [items addObject:itemList];
                }
            }

            else { NSLog(@"Database Not Found");}

            // Release the compiled statement from memory
            sqlite3_finalize(compiledStatement);

        NSLog(@"%@",items);
        NSLog(@"%@",lists);

    }
    sqlite3_close(database);

}

//#******************************************************#

//                *******END Database*******

//#******************************************************#

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    int rowcount;
    rowcount = [lists count];
    return rowcount;
}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                      reuseIdentifier:CellIdentifier];    
    }

    // Set up the cell...

    NSString *cellValue = [[lists objectAtIndex:indexPath.row] objectForKey:@"listName"];

    cell.textLabel.text = cellValue;

    return cell;
}

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{

    if ([[lists objectAtIndex:indexPath.row] objectForKey:@"listID"] != NULL) 
    {        
        NSString *listIndex = [[lists objectAtIndex:indexPath.row] objectForKey:@"listID"];
        int i = [listIndex intValue];
        NSLog(@"indexPath: %d",i);
    }

}

编辑*********

单个 Sql 语句返回多个 Listname。这是一个问题,因为我只需要每个列表名称中的一个。

enter image description here

最佳答案

首先,您要创建一个 List 对象,然后创建一个与 List 对象几乎相同的 NSDictionary 对象。为什么?为什么不直接将 List 对象添加到 Array 中。如果您不对 List 项中的属性执行任何函数,则根本不要使用 List 对象,只需将字段直接放入 NSDictionary 中即可。

其次,不要执行两个不同的 SQL 调用来获取信息,仅使用一个 SQL 调用同时获取该列表的 List 和 list_items。然后,如果您使用 List 对象,请添加 NSMutableArray 属性调用项目,并将 listItems 添加到该数组。您可以在 NSDictionary 中执行相同的操作,只需为关键项添加一个 NSMutableArray 对象,然后将 list_items 添加到该数组中。

现在您将能够设置表格 View 来执行您想要的操作。

针对以下评论修改了答案

从列表、List_Items 中选择 *,其中 List.list_id = List.list_id

关于sql - UITableView 中来自 SQLite 的 iOS NSArray 的 NSDictionaries,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9628950/

相关文章:

iphone - 将印地文转换为JSON_UNESCAPED_UNICODE + iphone

php - 我使用 mysql_real_escape_string 对吗?

java - 如何处理大型结果集中的数据而不将它们全部加载到内存中?

iphone - 实现 MKPinAnnotationView 拖动功能?

git - 使用 git push 保存 .sqlite

javascript - 使用 jquery 在 sqlite 中验证数据库时出错

MySQL SELECT 具有最大相似度的行

mysql - 仅从 SQL 转储文件导入一列

iOS 两个 View 恰好覆盖父 View 的一半

iOS - 如何在多线程中正确执行sqlite3写入操作?