Comment afficher datatables de SQlite dans les vues Tableau vers l'application iPhone

Je travaille sur un projet iPhone en Xcode 4.3 avec SQlite3, la connection entre le SQlite et Xcode est terminée, maintenant je veux afficher mes données dans une vue de table (trois vues) et en lecture seule! donc j'ai la vue de la table principale, select raw -> prendre en vue 2e et charger d'autres données de la BD select raw -> prendre à la vue des détails pour afficher le text et l'image longs!

Toute aide appréciée.

AppDelegate.h

#import "AppDelegate.h" #import "MasterViewController.h" @implementation AppDelegate @synthesize window = _window; @synthesize navigationController = _navigationController; - (void)dealloc { [_window release]; [_navigationController release]; [super dealloc]; } - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; // Override point for customization after application launch. NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSSsortingng *documentsDir = [paths objectAtIndex:0]; NSSsortingng *dbPath = [documentsDir ssortingngByAppendingPathComponent:@"cities.sqlite"]; NSFileManager *fileManager = [NSFileManager defaultManager]; BOOL success = [fileManager fileExistsAtPath:dbPath]; if (success) { NSLog(@"we have the database"); } else { NSLog(@"we have no database"); NSSsortingng *defaultDBPath = [[[NSBundle mainBundle] resourcePath] ssortingngByAppendingPathComponent:@"cities.sqlite"]; BOOL moved = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:nil]; if (moved) { NSLog(@"database copyd"); } } MasterViewController *masterViewController = [[[MasterViewController alloc] initWithNibName:@"MasterViewController" bundle:nil] autorelease]; self.navigationController = [[[UINavigationController alloc] initWithRootViewController:masterViewController] autorelease]; self.window.rootViewController = self.navigationController; [self.window makeKeyAndVisible]; return YES; } 

MasterViewController.h

 #import <UIKit/UIKit.h> #import <sqlite3.h> @class DetailViewController; @interface MasterViewController : UITableViewController { NSMutableArray *cities; } @property (strong, nonatomic) DetailViewController *detailViewController; @end 

MasterViewController.m

 - (void)viewDidLoad { [super viewDidLoad]; students = [[NSMutableArray alloc] init]; counsortinges = [[NSMutableArray alloc] init]; // Do any additional setup after loading the view, typically from a nib. self.navigationItem.leftBarButtonItem = self.editButtonItem; UIBarButtonItem *addButton = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemAdd target:self action:@selector(insertNewObject:)] autorelease]; self.navigationItem.rightBarButtonItem = addButton; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSSsortingng *documentsDir = [paths objectAtIndex:0]; NSSsortingng *dbPath = [documentsDir ssortingngByAppendingPathComponent:@"cities.sqlite"]; sqlite3 *database; if (sqlite3_open([dbPath UTF8Ssortingng], &database) == SQLITE_OK) { const char *sqlStatement = "select * from cities_info"; sqlite3_stmt *comstackStatement; if (sqlite3_prepare_v2(database, sqlStatement, -1, &comstackStatement, NULL) == SQLITE_OK) { while (sqlite3_step(comstackStatement) == SQLITE_ROW) { NSLog(@"one record"); NSSsortingng *cityName = [NSSsortingng ssortingngWithUTF8Ssortingng:(char *)sqlite3_column_text(comstackStatement, 1)]; [cities addObject:cityName]; } NSLog(@"cities: %@",cities); } } else { NSLog(@"error in database"); } } 

Blockquote

Je suggère un léger emballage sur SQLite – voir https://github.com/JohnGoodstadt/EasySQLite

Cela permettra:

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return _personTable.rows.count; } 

ET

  - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { ... NSArray* row= _personTable.rows[indexPath.row]; cell.textLabel.text = row[[_personTable colIndex:@"lastname"]]; ... 

Configurez ceci en utilisant un iVar représentant une table SQL:

 self.personTable = [_db ExecuteQuery:@"SELECT firstname , lastname , age , salary FROM person"]; 

Et un iVar de connection DB transmettant votre nom de file SQL:

 self.db = [DBController sharedDatabaseController:@"DataTable.sqlite"]; 

Tout d'abord, je suggère d'utiliser FMDB , qui est un wrapper Objective-C autour de sqlite3. Deuxièmement, je créerais un object d'access aux données personnalisé avec une instance partagée, comme ceci:

 @interface MyDatabaseDAO : NSObject @property (nonatomic, strong) FMDatabase *database; @end @implementation MyDatabaseDAO @synthesize database = _database; + (MyDatabaseDAO *)instance { static MyDatabaseDAO *_instance = nil; @synchronized (self) { if (_instance == nil) { _instance = [[self alloc] init]; } } return _instance; } - (id)init { self.database = [FMDatabase databaseWithPath:myDatabasePath]; [self.database open]; } - (void)dealloc { [self.database close]; } @end 

Ce DAO doit avoir 3 methods d'access: une pour chaque object de données dans la database. Parce que vous n'étiez pas spécifique, j'ai fait ces objects sans propriétés spécifiques.

 - (NSArray *)resortingeveAllFirstViewItems { NSMutableArray *items = [NSMutableArray array]; FMResultSet *resultSet = [FMDBDatabase.database executeQuery:@"SELECT * FROM myFirstViewItemTable"]; while ([resultSet next]) { // extract whatever data you want from the resultset NSSsortingng *name = [resultSet ssortingngForColumn:@"name"] [items addObject:name]; } [resultSet close]; return items; } - (MySecondViewItem *)resortingeveSecondViewItemFromIndexPath:(NSIndexPath *)indexPath { FMResultSet *resultSet = [FMDBDatabase.database executeQuery:@"SELECT * FROM mySecondViewItemTable WHERE pid = ?", [indexPath indexAtPosition:0]]; if ([resultSet next]) { // extract whatever data you want from the resultset NSSsortingng *name = [resultSet ssortingngForColumn:@"name"] MySecondViewItem *mySecondViewItem = [[MySecondViewItem alloc] initWithName:name withPID:[indexPath indexAtPosition:0]]; [resultSet close]; return mySecondViewItem; } else { return nil; } } - (MyThirdViewItem *)resortingeveThirdViewItemFromIndexPath:(NSIndexPath *)indexPath { FMResultSet *resultSet = [FMDBDatabase.database executeQuery:@"SELECT * FROM mySecondViewItemTable WHERE pid = ?", [indexPath indexAtPosition:1]]; if ([resultSet next]) { // extract whatever data you want from the resultset NSSsortingng *name = [resultSet ssortingngForColumn:@"name"] MyThirdViewItem *myThirdViewItem = [[MyThirdViewItem alloc] initWithName:name withPID:[indexPath indexAtPosition:1]]; [resultSet close]; return myThirdViewItem; } else { return nil; } } 

Comme il est en lecture seule, ce sont toutes les methods requirejses. Dans votre premier UITableView, il suffit d'implémenter la méthode:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { MySecondViewItem *mySecondViewItem = [[MyDatabaseDAO instance] resortingeveSecondViewItemFromIndexPath:indexPath]; //instantiate a view from this item and use [UINavigationController pushViewController:animated:] to navigate to it } 

Tout ce qui rest est juste pour montrer vos objects de données dans les vues en quelque sorte. Je suggère de faire autant de récupération de données que possible dans l'object d'access aux données afin que les controllers de vue puissent lire les propriétés des objects de données sans avoir à s'inquiéter du backend.

C'est tout ce qu'on peut en dire! J'espère que cela a aidé