2013-06-10 3 views
0

У меня есть представление, которое вставляет информацию в базу данных. Это представление отображает эту информацию внутри представления таблицы (верхняя половина представления используется для чего-то еще)Загрузка представления таблицы (внутри контроллера представления) с информацией SQLite

У меня есть класс контроллера вида, класс объекта и класс ячейки таблицы (это то, что меня отбрасывает) подумайте, потому что изображения и текстовые метки находятся здесь, тогда как фактическая информация о базе данных находится в контроллере представления).

Вот класс NSObject:

// car.h 
#import <Foundation/Foundation.h> 

@interface Car : NSObject { 
    NSString *displayedMake; 
    NSString *displayedModel; 
    NSString *displayedImage; 
} 

@property (nonatomic, strong) NSString *displayedMake; 
@property (nonatomic, strong) NSString *displayedModel; 
@property (nonatomic, strong) NSString *displayedImage; 

-(id)initWithName:(NSString *)n description:(NSString *)d url:(NSString *)u; 

@end 

//car.m 
#import "Car.h" 

@implementation Car 
@synthesize displayedMake, displayedModel, displayedImage; 

-(id)initWithName:(NSString *)n description:(NSString *)d url:(NSString *)u { 
    self.displayedMake = n; 
    self.displayedModel = d; 
    self.displayedImage = u; 
    return self; 
} 

@end 

Вот класс таблицы вид клеток:

//DisplayCarsCell.h 
#import <UIKit/UIKit.h> 

@interface DisplayCarsCell : UITableViewCell 
@property (nonatomic, strong) IBOutlet UIImageView *carImage; 
@property (nonatomic, strong) IBOutlet UILabel *makeLabel; 
@property (nonatomic, strong) IBOutlet UILabel *modelLabel; 
@end 

//DisplayCarsCell.m 
#import "DisplayCarsCell.h" 
#import "ViewController.h" 

@implementation DisplayCarsCell 

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier 
{ 
    self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; 
    if (self) { 
     // Initialization code   
    } 
    return self; 
}  
- (void)setSelected:(BOOL)selected animated:(BOOL)animated 
{  
    [super setSelected:selected animated:animated];  
    // Configure the view for the selected state 
}  
@end 

И, наконец, контроллер представления:

//ViewController.h 
#import <UIKit/UIKit.h> 
#import "/usr/include/sqlite3.h" 

@interface ViewController : UIViewController <UITableViewDelegate> { 
    //NSString *databasePath; 
    sqlite3  *carsDB; 
    NSArray  *carImages; 
    NSMutableArray *cars; 
} 
@property (nonatomic, retain) NSMutableArray *cars; 
@property (strong, nonatomic) IBOutlet UILabel *status;  
@end 


//ViewController.m 

#import "ViewController.h" 
#import "DisplayCarsCell.h" 
#import "Car.h" 

@interface ViewController() 
@end 

@implementation ViewController 
@synthesize cars; 

-(NSString *) filePath { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    return [[paths objectAtIndex:0] stringByAppendingPathComponent:@"cars.db"]; 
}  
-(void) openDB { 
    if (sqlite3_open([[self filePath]UTF8String],&carsDB) != SQLITE_OK){ 
     sqlite3_close(carsDB); 
     NSAssert(0, @"Database failed to open"); 
    } 
    else{ 
     NSLog(@"database opened"); 
    } 
}   
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    // Do any additional setup after loading the view, typically from a nib. 
    // Opens the database and creates the table if its the first time  
    [self readCarsFromDatabase];    
}   
- (void)readCarsFromDatabase 
{ 
    // Setup the database object 
    //sqlite3 *database;   
    // Init the animals Array 
    cars = [[NSMutableArray alloc] init];  
    // Open the database from the users filessytem 
    [self openDB]; 
    const char *sql_stmt = "CREATE TABLE IF NOT EXISTS apps (name text, id text, image text)";    
     if (sqlite3_exec(carsDB, sql_stmt, NULL, NULL, NULL) == SQLITE_OK) 
     { 
      NSLog(@"create db"); 
     } 
     //Setup the SQL Statement and compile it for faster access   
     const char *sqlStatement = "select * from apps"; 
     sqlite3_stmt *compiledStatement;   
     if(sqlite3_prepare_v2(carsDB, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {     
     // Loop through the results and add them to the feeds array 
     while(sqlite3_step(compiledStatement) == SQLITE_ROW) { 
     // Read the data from the result row    
     //image, or first column in table 
     NSString *displayedImage=[NSString stringWithFormat: @"%s",(const char *)sqlite3_column_text(compiledStatement, 0)];       
     //name, or second column in table 
     NSString *displayedMake=[NSString stringWithFormat: @"%s",(const char *)sqlite3_column_text(compiledStatement, 1)];      
     //model, or third column in table 
     NSString *displayedModel=[NSString stringWithFormat: @"%s",(const char *)sqlite3_column_text(compiledStatement, 2)];      
     NSLog(@"%@, %@, %@",displayedImage, displayedMake, displayedModel); 
       _status.text = displayedMake;     
     NSLog(@"here"); 
     // Create a new animal object with the data from the database 
     Car *carObject = [Car alloc]; 
     carObject.displayedImage = [NSString stringWithFormat: @"%s",(const char *)sqlite3_column_text(compiledStatement, 0)];     
     // Add the animal object to the animals Array 
     [cars addObject:carObject]; 
     //NSLog(@"%@",displayedImage); 
      }        
     } 
     else 
     { 
      printf("could not prepare statement: %s\n", sqlite3_errmsg(carsDB)); 
     }    
     // Release the compiled statement from memory 
      sqlite3_finalize(compiledStatement);      
      sqlite3_close(carsDB);  
} 
- (void)didReceiveMemoryWarning 
{ 
    [super didReceiveMemoryWarning]; 
    // Dispose of any resources that can be recreated. 
}  
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 
{ 
    // Return the number of sections. 
    return 1; 
} 
#pragma mark Table view data source 
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section 
{   
    // Return the number of rows in the section. 
    return carImages.count; 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"DisplayCarsCell";   
    DisplayCarsCell *cell = [tableView 
          dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[DisplayCarsCell alloc] 
       initWithStyle:UITableViewCellStyleDefault 
       reuseIdentifier:CellIdentifier]; 
    }   
    // Configure the cell...   
    //UIImage *displayedImage = [UIImage imageNamed: 
    //[carImage objectAtIndex: [indexPath row]]];   
    // Car *carObj = [cars objectAtIndex:indexPath.row];    
    ViewController *viewController = (ViewController *)[[UIApplication sharedApplication] delegate]; 
    Car *car = (Car *)[viewController.cars objectAtIndex:indexPath.row];   
    //[cell setImage:car.displayedImage];   
    return cell;   
}   
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    // TODO: Select Item 
    NSLog(@"Selected");}  
@end 

Контроллер вид сам по себе становится массив данных, очевидно, из readCarsFromDatabase и правильно регистрирует каждую строку базы данных на viewDidLoad (сделал это, чтобы убедиться, что эта часть не была неправильной), но мне нужно, чтобы обновить строки табличного представления внутри.

ответ

0

Вы должны позвонить reloadData для своего стола, как только вы закончите добавлять записи к cars, например, в конце readCarsFromDatabase. Я не вижу IBOutlet для UITableView, но если бы это было просто tableView, то вы бы добавить строку после sqlite3_close, который говорит:

[self.tableView reloadData]; 

Очевидно, убедитесь, что делегат вид таблицы имеет значение, чтобы быть вашим просмотрите контроллер.


Кроме того, я бы подумал, что следующие строки из вашего контроллера представления cellForRowAtIndexPath, что в настоящее время говорят:

ViewController *viewController = (ViewController *)[[UIApplication sharedApplication] delegate]; 
Car *car = (Car *)[viewController.cars objectAtIndex:indexPath.row];   

должен быть изменен, чтобы просто сказать:

Car *car = self.cars[indexPath.row];   
+0

Я изменил эти вещи , но я все еще что-то упускаю. Ячейки прототипа имеют изображение и две метки (в классе ячеек таблицы), которые не подтверждаются в контроллере представления с помощью отображаемого изображения, отображаемогоМодель или отображаемогоМодели. – user2471957

+0

@ user2471957 Вы указали 'DisplayCarsCell' как класс для вашей ячейки в прототипе вашей ячейки? Профит в представлении таблицы также указывает ваш идентификатор ячейки, 'DisplayCarsCell'? Вы 'cellForRowAtIndexPath' никогда не должны возвращать' nil' из 'dequeueReusableCellWithIdentifier', если используете прототип ячейки. При использовании прототипов ячеек ваш код не должен создавать вручную 'DisplayCarsCell' вручную, и если это произойдет, это не сработает, потому что ссылки' IBOutlet' не будут подключены. – Rob

+0

DisplayCarsCell - это класс для ячеек, также он устанавливается как идентификатор ячейки. Я удаляю ячейку == ноль, но все равно ничего. – user2471957

Смежные вопросы

 Смежные вопросы