¿Cómo abrimos una database fmdb ya existente y dónde includela?

Estoy usando fmdb pero no sé dónde agregar el file db. Encontré esta vieja respuesta que creo que no encaja con xcode 4.2 (ya no tenemos la carpeta 'Recursos' más).

Creé una database en 'Lita', agregué la extensión .sqlite y agregué el file db de la siguiente manera:

dbsqlite

luego trató de usar lo siguiente

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *docsPath = [paths objectAtIndex:0]; NSString *path = [docsPath stringByAppendingPathComponent:@"db.sqlite"]; FMDatabase *database = [FMDatabase databaseWithPath:path]; [database open]; FMResultSet *results = [database executeQuery:@"select * from tbl"]; printf("hi"); while([results next]) { printf("hi2"); NSString *name = [results stringForColumn:@"clm1"]; NSString *text = [results stringForColumn:@"clm2"]; NSLog(@"test: %@ - %@",name, text); } printf("done"); 

Estoy recibiendo el 'hola' 'hecho' pero nunca 'hi2' …

cualquiera puede ayudar

Desea agregar la database (comstackda) al proyecto como recurso y luego copyrla en la carpeta de documentos de la aplicación en la primera puesta en marcha.

Aquí hay un método de ejemplo que hace el trabajo, llámelo desde el applicationDidFinishLaunching y use la database de FM resultante * para todas sus consultas.

 - (FMDatabase *)openDatabase { NSFileManager *fm = [NSFileManager defaultManager]; NSString *documents_dir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0]; NSString *db_path = [documents_dir stringByAppendingPathComponent:[NSString stringWithFormat:@"database.s3db"]]; NSString *template_path = [[NSBundle mainBundle] pathForResource:@"template_db" ofType:@"s3db"]; if (![fm fileExistsAtPath:db_path]) [fm copyItemAtPath:template_path toPath:db_path error:nil]; FMDatabase *db = [FMDatabase databaseWithPath:db_path]; if (![db open]) NSLog(@"Failed to open database!"); return db; } 

Estoy trabajando con los mismos problemas en este momento. Pero para responder a su pregunta: la carpeta de documentos es la carpeta que se usará en el dispositivo.

Coloque la database en la carpeta de files de soporte.

Esto es lo que funciona para mí:

 //hide status bar for full screen view [[UIApplication shanetworkingApplication]setStatusBarHidden:YES withAnimation:UIStatusBarAnimationNone]; //set reference to database here NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentDir = [documentPaths objectAtIndex:0]; self.databasePath = [documentDir stringByAppendingPathComponent:@"RPRA.sqlite"]; [self createAndCheckDatabase]; // Override point for customization after application launch. return YES; } //method used to create database and check if it exists -(void) createAndCheckDatabase { BOOL success; NSFileManager *fileManager = [NSFileManager defaultManager]; success = [fileManager fileExistsAtPath:self.databasePath]; if(success) return; //else move database into documents folder NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"RPRA.db"]; [fileManager copyItemAtPath:databasePathFromApp toPath:self.databasePath error:nil]; } 
 - (void)ensureDBFile { NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *dbFilePath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"retails.sqlite"]]; NSLog(@"Database Filepath Delgate = %@", dbFilePath); NSFileManager *fileManager = [NSFileManager defaultManager]; BOOL dbFileExists = [fileManager fileExistsAtPath:dbFilePath]; if(!dbFileExists){ //Copy the db file if it didn't exist NSString *bundledDbPath = [[NSBundle mainBundle] pathForResource:@"retails" ofType:@"sqlite"]; if (bundledDbPath != nil) { BOOL copiedDbFile = [fileManager copyItemAtPath:bundledDbPath toPath:dbFilePath error:nil]; if (!copiedDbFile) { NSLog(@"Error: Couldn't copy the db file from the bundle"); } } else { NSLog(@"Error: Couldn't find the db file in the bundle"); } } self.db = [FMDatabase databaseWithPath:dbFilePath]; [self.db setShouldCacheStatements:NO]; [self.db open]; if([self.db hadError]) { NSLog(@"Database Error %d: %@", [self.db lastErrorCode], [self.db lastErrorMessage]); } }