sqlite айфон sdk помогите? - PullRequest
0 голосов
/ 12 мая 2011

Это код, который я написал для доступа к базе данных SQLite на iPhone.Приложение по какой-то причине падает.Может ли кто-нибудь помочь мне с этим?

-(void)openDB{
    //create database 
    if (sqlite3_open([[self filPath] UTF8String],&db) != SQLITE_OK) {
        sqlite3_close(db);
        NSAssert(0, @"database failed to open");
    }
}


-(void)insertRecordIntoTableNamed:(NSString *)tableName withField1:(NSString *)field1 field1Value:(NSString*)field1Value andField2:(NSString *)field2 field2Value:(NSString *)field2Value {

    // [self insertRecordIntoTableNamed:@"Contacts" withFiled1:@"email" field1Value:email andField2:@"name" field2Value:name];
    NSString *sql = [NSString stringWithFormat:@"INSERT OR REPLACE INTO '%@' ('%@' , '%@') VALUES ('%@','%@')",tableName,field1,field2, field1Value,field2Value];
    char *err;
    if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err)!=SQLITE_OK) {
        sqlite3_close(db);
        NSAssert(0,@"error updating table.");
    }
}

-(void)createTableNamed:(NSString *) tableName withField1:(NSString *)field1 withField2:(NSString *)field2 {
    char *err;
    NSString *sql = [NSString stringWithFormat:@"Creat table if not exist '%@' ('%@' text prmaru key,  '%@' TEXT",tableName,field1,field2];
    if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err) != SQLITE_OK) {
        sqlite3_close(db);
        NSAssert (0,@"tabel failed to create");
    }
}       

-(void)getAllRowsFromTableNamed:(NSString *)tableName{
    NSString *qsql = [NSString stringWithFormat:@"select * from %@",tableName];
    sqlite3_stmt *statment;

    if (sqlite3_prepare_v2(db, [qsql UTF8String], -1, &statment, nil) == SQLITE_OK) {
        while (sqlite3_step(statment) == SQLITE_ROW) {
            char *field1 = (char *)sqlite3_column_text(statment, 0); 
            NSString *field1Str = [[NSString alloc] initWithUTF8String: field1];
            char *field2 = (char *)sqlite3_column_text(statment, 1);
            NSString *field2Str = [[NSString alloc] initWithUTF8String: field2]; 
            NSString *str = [[NSString alloc] initWithFormat:@"%@ - %@", field1Str, field2Str];
            NSLog(@"%@", str);
            //      [field1Str release];
            //      [field2Str release];
            //      [str release];
        }       
        sqlite3_finalize(statment);
    }
}

- (void)viewDidLoad {
    [self openDB];
    NSLog(@"%@",[self filPath]);
    [self createTableNamed:@"Contacts" withField1:@"email" withField2:@"name"];

    for (int i = 0; i<= 2;i++) {
        NSString *email = [[NSString alloc]initWithFormat:@"user%i@yahoo.com",i];       
        NSString *name = [[NSString alloc]initWithFormat:@"user %i",i];
        [self insertRecordIntoTableNamed:@"Contacts" withField1:@"email" field1Value:email andField2:@"name" field2Value:name];
        [email release];
        [name release];
    }

    [self getAllRowsFromTableNamed:@"Contacts"];
    sqlite3_close(db);
    [super viewDidLoad];
}

1 Ответ

3 голосов
/ 12 мая 2011

Проблемы, которые я вижу:

  • [NSString stringWithFormat:@"Creat table if not exist '%@' ('%@' text prmaru key, '%@' TEXT",tableName,field1,field2];

    должно быть

    [NSString stringWithFormat:@"Create table if not exists %@ ('%@' text primary key, '%@' TEXT)",tableName,field1,field2];

    Как и вына самом деле читать документацию по синтаксису SQLite ?Орфография имеет значение.

  • NSString *sql = [NSString stringWithFormat:@"INSERT OR REPLACE INTO '%@' ('%@' , '%@') VALUES ('%@','%@')",tableName,field1,field2, field1Value,field2Value];

    должно быть

    NSString *sql = [NSString stringWithFormat:@"INSERT OR REPLACE INTO %@ (%@ , %@) VALUES ('%@','%@')",tableName,field1,field2, field1Value,field2Value];

    Вы не ставите одинарные кавычки вокруг материалаесли вы не собираетесь интерпретировать его как строковый литерал.

  • Вы закомментировали эти строки:

    //      [field1Str release];
    //      [field2Str release];
    //      [str release];
    

    Они не должны быть.

Я не знаю, исправит ли это эти вещи на самом деле ваш сбой, но они определенно ошибочны.


Помимо этого, используя SQLite API напрямуюв Objective-C совершенно глупо.Нет причин, потому что есть намного более простых способов сделать это.

  1. CoreData .Это инфраструктура графов объектов, которую Apple создала, чтобы вам было действительно легко создавать и сохранять объекты.Это не база данных per-say, но часто ведет себя как единое целое.Если вы можете использовать это, я настоятельно рекомендую это.Это определенно непростая вещь для понимания, но она усложняет некоторые вещи с преимуществом упрощения многих вещей.

  2. Если по какой-то причине вам приходится взаимодействовать с существующей базой данных SQLite, выдолжен сделать это через FMDB .Это оболочка для SQLite C API.Другими словами, Гас приложил все усилия для изучения API SQLite, чтобы вам не нужно было .Вы бы сделали что-то вроде:

    FMDatabase *db = [[FMDatabase alloc] initWithPath:[self filePath]];
    if (![db open]) {
      [db release];
      db = nil;
    }
    
    //create a table:
    [db executeUpdate:@"create table if not exists Customers (email text primary key, name text)"];
    
    //insert into a table:
    [db executeUpdate:@"insert into Customers (email, name) values (?, ?)", @"test@example.com", @"user1"];
    
    //select from a table:
    FMResultSet *results = [db executeQuery:@"select * from Customers"];
    while ([results next]) {
      NSLog(@"%@ - %@", [results stringForColumn:@"email"], [results stringForColumn:@"name"]);
    }
    
    //close the database:
    [db close];
    [db release];
    

Разве это не в несколько раз легче, чем то, что вы делаете?

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