2009-09-14 12 views
5

Jestem obecnie w następujący sposób jako część mojej aplikacji iPhoneSQLite zachowania na INSERT na iPhone

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsPath = [paths objectAtIndex:0]; 
NSString *filePath = [documentsPath stringByAppendingPathComponent:@"cities.sqlite"]; 

sqlite3 *database; 

if(sqlite3_open([filePath UTF8String], &database) == SQLITE_OK) { 
    const char *sqlStatement = "insert into table (name, description, image) VALUES (?, ?, ?)"; 
    sqlite3_stmt *compiledStatement; 
    if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) { 
     sqlite3_bind_text(compiledStatement, 1, [name UTF8String], -1, SQLITE_TRANSIENT); 
     sqlite3_bind_text(compiledStatement, 2, [description UTF8String], -1, SQLITE_TRANSIENT); 
     NSData *dataForImage = UIImagePNGRepresentation(image); 
     sqlite3_bind_blob(compiledStatement, 3, [dataForImage bytes], [dataForImage length], SQLITE_TRANSIENT); 

    } 
    if(sqlite3_step(compiledStatement) != SQLITE_DONE) { 
     NSLog(@"Error: %s", sqlite3_errmsg(database)); 
    } else { 
     NSLog(@"Insert into row id = %d", sqlite3_last_insert_rowid(database)); 
    } 
    sqlite3_finalize(compiledStatement); 
} 
sqlite3_close(database); 

Co mnie mylące jest to, że jeśli wezmę sekcję,

if(sqlite3_step(compiledStatement) != SQLITE_DONE) { 
     NSLog(@"Error: %s", sqlite3_errmsg(database)); 
    } else { 
     NSLog(@"Insert into row id = %d", sqlite3_last_insert_rowid(database)); 
    } 

The INSERT nie jest zapisywany w bazie danych i ginie. Przypuszczam, że brakuje tu czegoś oczywistego?

+0

Jestem ciekaw waszego rozumu (y) nie używając danych Core. – nicerobot

+1

Zwykle używam obwolut wokół SQLite lub, częściej niż obecnie, z Core Data. Jednak chciałem wiedzieć, jak korzystać z biblioteki bezpośrednio, więc ... –

Odpowiedz

7

Oczywiście, że nie zostanie włożona. Aby wykonać polecenie, należy zadzwonić pod numer sqlite3_step.

Sprawdź, czy na zewnątrz nie ma the documentation.

Jest to rzecz SQLITE, a nie specyficzna dla iPhone'a.

Z dokumentacji:

po przygotowanym oświadczeniu został przygotowane przy użyciu sqlite3_prepare_v2() lub sqlite3_prepare16_v2() lub jedno z starszych interfejsów sqlite3_prepare() lub sqlite3_prepare16(), to funkcja musi być wywołana jeden lub więcej razy, aby ocenić oświadczenie.

+0

Dokumentacja SQLite nie jest niezwykle dobrze rozplanowana. Dzięki za wskaźnik. –

+0

... ale tak, brakowało mi czegoś oczywistego. –

2

Wstawiasz tutaj tylko jeden wiersz, więc jest dużo kodu standardowego. Pomyśl, co by się stało, gdybyś chciał wstawić wiele wierszy:

  • nadal należałoby pojedynczy przygotować komunikat
  • nadal należałoby pojedynczą instrukcję sfinalizować
  • należałoby jedną instrukcję krok dla każdy wiersz, który chcesz dodać. Możesz myśleć o "kroku" jako "wykonaj" (lub "uzyskaj następny wiersz", jeśli patrzysz na instrukcję SELECT).

Przy okazji, pewnie nie chcesz "krokować" "jeśli przygotowane oświadczenie nie powiodło się.

0

użyć kodu

const char *sqlStatement = "REPLACE INTO table (name, description, image) VALUES (?, ?, ?)"; 

zamiast „wstawić”