Как вызывать разные таблицы в части «if и else» одной и той же базы данных в iPhone?

#objective-c

#objective-c

Вопрос:

У меня есть база данных. В нем есть две таблицы. Я хочу вызвать одну таблицу в if условии. Как мне вызвать вторую таблицу в else части, если if условия не выполняются?

Это код, который я использовал:

 {
    NSArray *Paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *DocumentsDirectory = [Paths objectAtIndex:0];
    NSString *Path = [DocumentsDirectory stringByAppendingPathComponent:@"StoreList.sqlite"];

    // Open the database from the users filessytem.
    if (sqlite3_open([Path UTF8String], amp;database) == SQLITE_OK) {
        // Setup the SQL Statement and compile it for faster access
        //*********const char *sqlStatement = "select * from Store where Zipcode ='%@'",inputTxt ;

        NSString *sqlStatement = [NSString stringWithFormat:@"select * from Store where Zipcode ='%@' or Address = '%@' or CityName = '%@'",inputTxt, inputTxt, inputTxt];
        NSLog(@" Query in if :%@",sqlStatement);
        sqlite3_stmt *compiledStatement;

        if (sqlite3_prepare_v2(database, [sqlStatement UTF8String], -1, amp;compiledStatement, NULL) == SQLITE_OK) {

            // Loop through the results and add them to the feeds array.

            if(sqlite3_step(compiledStatement) == SQLITE_ROW) {
                // Read the data from the result row

                NSString *latValue = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)];
                NSLog(@"Latitude:%@",latValue);
                NSString *longValue = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)];
                NSLog(@"Longitude:%@",longValue);
                //currentLocationLbl.text=[NSString stringWithFormat:@" %@ , %@" ,latValue,longValue];

                // delegate.latitudeVal=latValue;
                // delegate.longitudeVal=longValue;
                txtChangeLocation.text = @"";
                isFromChangeLoc=TRUE;

                //self.tabBarController.selectedIndex=3;
            }
            else {
                NSLog(@"ELSE PART");

                // Open the database from the user's filessytem.
                if (sqlite3_open([Path UTF8String], amp;database) == SQLITE_OK) {
                    // Setup the SQL Statement and compile it for faster access
                    //*********const char *sqlStatement = "select * from Store where Zipcode ='%@'",inputTxt ;

                    NSString *sqlStatement = [NSString stringWithFormat:@"select * from zipcodes where zip ='35004'"];
                    NSLog(@" Query in if :%@",sqlStatement);
                    sqlite3_stmt *compiledStatement;

                    if(sqlite3_prepare_v2(database, [sqlStatement UTF8String], -1, amp;compiledStatement, NULL) == SQLITE_OK) {
                        // Loop through the results and add them to the feeds array

                        if(sqlite3_step(compiledStatement) == SQLITE_ROW) {
                            // Read the data from the result row

                            NSString *latValue = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)];
                            NSLog(@"Latitude:%@",latValue);
                            NSString *longValue = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)];
                            NSLog(@"Longitude:%@",longValue);
                            //currentLocationLbl.text=[NSString stringWithFormat:@" %@ , %@" ,latValue,longValue];

                            // delegate.latitudeVal=latValue;
                            // delegate.longitudeVal=longValue;
                            txtChangeLocation.text = @"";
                            isFromChangeLoc=TRUE;
                        }
                    }
                }
            }
            sqlite3_finalize(compiledStatement);
            sqlite3_close(database);
        }
    }
  

Я получаю входные данные из текстового поля. Когда я даю правильное значение, которое есть в базе данных, оно работает нормально, выборка данных выполняется правильно. Если я ввожу неправильные данные в текстовое поле, это работает неправильно — else условие не выполняется.

Как можно устранить эту проблему?

Ответ №1:

При продолжении else вы снова открываете ту же базу данных, в этом нет необходимости (и это также может вызвать некоторые проблемы, не пробовал). Используйте BOOL при выполнении первого оператора (select) и установите для него значение YES or NO , если он завершается с ошибкой или нет. После завершения выполнения первого оператора проверьте BOOL значение и, если ==NO , запустите второй оператор.

     ...
BOOL success = NO;
NSString *sqlStatement = [NSString stringWithFormat:@"select * from Store where Zipcode '%@' or Address = '%@' or CityName = '%@'",inputTxt, inputTxt, inputTxt];
NSLog(@" Query in if :%@",sqlStatement);
sqlite3_stmt *compiledStatement;
if(sqlite3_prepare_v2(database, [sqlStatement UTF8String], -1, amp;compiledStatement, NULL) == SQLITE_OK){
    if(sqlite3_step(compiledStatement) == SQLITE_ROW) {
        // Read the data from the result row

        NSString *latValue = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)];
        NSLog(@"Latitude:%@",latValue);
        NSString *longValue = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)];
        NSLog(@"Longitude:%@",longValue);
        //currentLocationLbl.text=[NSString stringWithFormat:@" %@ , %@" ,latValue,longValue];

    //  delegate.latitudeVal=latValue;
    //  delegate.longitudeVal=longValue;
        txtChangeLocation.text = @"";
        isFromChangeLoc=TRUE;

        //self.tabBarController.selectedIndex=3;
        success=YES;
    }
}
sqlite3_finalize(compiledStatement);

if(success){
    //do the else from your code
    NSString *sqlStatement = [NSString stringWithFormat:@"select * from zipcodes where zip ='35004'"];
    NSLog(@" Query in if :%@",sqlStatement);

    if(sqlite3_prepare_v2(database, [sqlStatement UTF8String], -1, amp;compiledStatement, NULL) == SQLITE_OK){
         // Loop through the results and add them to the feeds array

         if(sqlite3_step(compiledStatement) == SQLITE_ROW) {
         // Read the data from the result row


              NSString *latValue = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 2)];
              NSLog(@"Latitude:%@",latValue);
              NSString *longValue = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)];
              NSLog(@"Longitude:%@",longValue);
              //currentLocationLbl.text=[NSString stringWithFormat:@" %@ , %@" ,latValue,longValue];

            // delegate.latitudeVal=latValue;
            // delegate.longitudeVal=longValue;
               txtChangeLocation.text = @"";
               isFromChangeLoc=TRUE;
        }
    }
    sqlite3_finalize(compiledStatement);
}
  

Я не запускал его, поэтому он может содержать некоторые ошибки.