Программирование на iOS с использованием SQLite - Невозможно прочитать таблицу - Не использовать никакой оболочки - PullRequest
0 голосов
/ 21 сентября 2011

После тестирования 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 в дереве проекта.

1 Ответ

1 голос
/ 21 сентября 2011

Мне неясно, является ли это единственной проблемой, но это, безусловно, проблема:

NSLog(@"Name:%@",(char*)sqlite3_column_text(compiledStatement, 1)); 

Вы получаете значение столбца и сообщаете компилятору, что это char* (т.е.тип данных C).Но затем вы говорите Objective C, что это объект (%@).

Вы можете либо преобразовать строку в NSString ([NSString stringWithCString:encoding:]), либо сказать NSLog, что вы используете нульзавершенная строка (%s).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...