2012-05-25 4 views
3

Я довольно новичок в iPhone dev.запрос SQLite3 (iOs) не выполняется

У меня возникли проблемы с тем, чтобы это работало.

Это код, я хочу, чтобы выполнить:

[self openDB]; 
sqlite3_stmt *statement; 
NSString *sql2 = [NSString stringWithFormat:@"INSERT INTO CheckList (CLName, DateAdd, Active, Costum, Percentage, UserId) VALUES ('ola232332332324', '2012-02-03', 1, 1, NULL, 1)"]; 
    if(sqlite3_prepare_v2(db, [sql2 UTF8String], -1, &statement, NULL) == SQLITE_OK) 
    { 
    alert1 = [[UIAlertView alloc] 
       initWithTitle:@"Grats" message:@"The query was executed!" delegate:self cancelButtonTitle:@"Continue" otherButtonTitles: nil]; 
    [alert1 show]; 
    [alert1 release]; 


} 

    else { 
     NSAssert(0, @"Failed to execute"); 
    } 
sqlite3_finalize(statement); 

И это код, я использую для вызова дб:

-(NSString *) filePath { 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDir = [paths objectAtIndex:0]; 

return [documentsDir stringByAppendingPathComponent:@"prosegur.sqlite"]; 
} 


-(void) openDB { 
sqlite3_open([[self filePath] UTF8String], &db); 
if (sqlite3_open([[self filePath] UTF8String], &db) != SQLITE_OK){ 
    NSAssert(0, @"Failed to open db"); 
} 
} 

Спасибо заранее,

Родольфо Матос

Редактировать: Пытается использовать FMDB, здесь код:

FMDatabase *database = [FMDatabase databaseWithPath:@"prosegur.sqlite"]; 
if([database open]){ 
    NSLog(@"yes"); 
    [database executeUpdate:@"INSERT INTO CheckList (CLName, DateAdd, Active, Costum, UserId) VALUES ('cenas', '2012-02-0', 1, 1, 1)"];} 
else 
{ 
    NSLog(@"not"); 
} 

Проходит при [открытие базы данных], но не выполняет запрос. Любое предложение? Спасибо!

EDIT 2: Уже сделал то, что было предложено, я начинаю думать, что он создает базу данных и выполняет внутри нее запрос, но поскольку он не существует ни одной таблицы, он игнорирует этот факт.

Вот обновленный код: NSArray * paths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES); NSString * docsPath = [[paths objectAtIndex: 0] сохранить]; NSString * path = [[docsPath stringByAppendingPathComponent: @ "prosegur.sqlite"] сохранить];

FMDatabase *database = [FMDatabase databaseWithPath:path]; 
[database open]; 
if([database open]) 
{ 
    NSLog(@"yes"); 
    [database executeUpdate:@"INSERT INTO CheckList (CLName) VALUES (?)", @"cenas"]; 
} 
else 
{ 
    NSLog(@"no"); 
} 
[database close]; 

Еще раз спасибо! :)

ответ

0

Я узнал ответ, если кто-то имеет проблемы, как это, проверить по следующей ссылке: IPhone Development - Failed to use SQLite

Спасибо всем вам за поддержку!

2

Может быть глупый вопрос, но вы знаете, что sqlite3_prepare_v2 только готовит заявление и фактически не выполнить это? Вам также необходимо позвонить sqlite3_step, чтобы на самом деле сделать вставку,

Вместо этого вы можете использовать sqlite3_exec, который просто выполняет инструкцию без выполнения двухэтапного процесса подготовки/выполнения.

+0

Ну, моя проблема в том, что он не получил правильную проверку sqlite3_prepare_v2 (..) == SQLITE_OK, он всегда переходит к другому.Я ничего не вижу с этим предложением. Спасибо –

+0

Какой код ошибки _does_ он возвращается? –

2

У меня было много головной боли при использовании стандартного sqlite3 api в iOS. Отъезд FMDB рамки. Он очень прост в использовании, и вы можете найти множество учебников в Интернете.

Если вы не хотите эту фреймворк, попробуйте использовать NSError для обнаружения ошибки при выполнении запроса.

+0

Я попробую, если я не смогу заставить это работать im действительно думать, чтобы пойти с приложением coredata. Спасибо msj! :) –

+0

Вы не можете использовать 'NSError', поскольку SQLite - это API уровня C, а' NSError' - Objective C. –

+0

Да. Моя вина. О FMDB - это оболочка вокруг SQLite. Таким образом, он поддерживает реальные SQL-запросы и действительно проще в использовании, чем Core Data. –

1

Пример примера.

+(BOOL)InsertDataInPin:(NSString *)pin 
    { 
     NSString *databasePath =Your DatabasePath; 

     NSString *[email protected]"INSERT INTO pincode Values(?)"; 
     sqlite3_stmt *dataset; 


     if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) { 

      if (sqlite3_prepare_v2(database, [SQL UTF8String], -1, &dataset, NULL) == SQLITE_OK) 
      { 

       sqlite3_bind_text(dataset, 1, [pin UTF8String], -1, SQLITE_TRANSIENT); 
       sqlite3_step(dataset); 

      }  

      sqlite3_close(database); 
     } 


    } 
Смежные вопросы