После тестирования FMDB и SQLiteManager4iOS и неудачного доступа к таблице я решил не использовать обертки и поэтому создал базу данных sqlite AnimalDatabase.sql (в терминале) с таблицей под названием «animals» с двумя полями id, name .
Таблица в настоящее время выглядит следующим образом.
+----------+
|1|Elephant|
|2|Giraffe |
+----------+
Я хочу отобразить эти данные на симуляторе, поэтому я создаю простой ViewController с кнопкой и меткой. При нажатии на кнопку на слое отобразится Слон или Жираф.
Интерфейс - DatabaseTestViewController.h
#import <UIKit/UIKit.h>
#import <sqlite3.h>
@interface DatabaseTestViewController : UIViewController {
IBOutlet UILabel* result;
NSString *databasePath;
NSMutableArray *animals;
}
@property(nonatomic,retain) NSString *databasePath;
@property(nonatomic,retain) NSMutableArray *animals;
@property(nonatomic,retain) IBOutlet UILabel *result;
-(IBAction) findResult;
@end
Реализация - DatabaseTestViewController.m
#import "DatabaseTestViewController.h"
@implementation DatabaseTestViewController
@synthesize databasePath,result,animals;
-(IBAction)findResult {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *docDir = [paths objectAtIndex:0];
databasePath = [docDir stringByAppendingPathComponent:@"AnimalDatabase.sql"];
NSFileManager *fileManager = [NSFileManager defaultManager];
BOOL success = [fileManager fileExistsAtPath:databasePath];
if(!success) {
NSLog(@"File has to be copied");
NSString *databasePathFromApp = [[[NSBundle mainBundle]resourcePath]stringByAppendingPathComponent:@"AnimalDatabase.sql"];
[fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];
[fileManager release];
}
sqlite3 *database;
animals = [[NSMutableArray alloc]init];
if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK)
{
const char *sqlStatement = "select name from animals where id=2";
sqlite3_stmt *compiledStatement;
if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL)==SQLITE_OK)
{
while(sqlite3_step(compiledStatement)==SQLITE_ROW)
{
NSLog(@"Name:%@",(char*)sqlite3_column_text(compiledStatement, 1));
//[result setText:[NSString stringWithUTF8String:(char*)sqlite3_column_text(compiledStatement,1)]];
}
}
sqlite3_finalize(compiledStatement);
}
sqlite3_close(database);
}
- (void)didReceiveMemoryWarning {[super didReceiveMemoryWarning];}
- (void)viewDidLoad {[super viewDidLoad];}
- (void)viewDidUnload {[super viewDidUnload];}
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
return (interfaceOrientation == UIInterfaceOrientationPortrait);
}
@end
В NSLog я получаю
Name: (null)
Пожалуйста, помогите мне, объяснив, какую ошибку я допустил. Кроме того, я использую Xcode 4.1.1 на Lion. Я добавил AnimalDatabase.sql рядом с файлами .h и .m в дереве проекта.