2009-01-06 12 views
12

मैं आईफोन विकास के लिए SQLite3 का उपयोग कर रहा हूं और मैं कुछ डालने वाले बयान को लेनदेन में लपेटने का प्रयास कर रहा हूं। वर्तमान में मेरे पास नीचे दिया गया कोड है जो ठीक से काम कर रहा है हालांकि एसओ पर एक और प्रश्न पढ़ने के बाद मुझे एहसास हुआ कि इन दोनों को एक के बजाय एक लेनदेन में रखना बेहतर होगा। मुझे लेनदेन शुरू करने और प्रतिबद्ध करने के लिए सी एपीआई कॉल नहीं मिला। कुछ कोड उद्देश्य-सी में हैं लेकिन मुझे नहीं लगता कि यह वास्तव में प्रश्न के लिए जारी है।SQLite 3 सी एपीआई लेनदेन

- (void)saveAnimals { 
    //Insert all the animals into the zoo database 
    int i; 

    const char *sql = "insert into Animal(Zoo_ID, Animal_Num, Animal_Text) Values(?, ?, ?)"; 
    for (i = 0; i < ([[self animalArray] count] - 1); i++) { 

     if(addStmt == nil) { 
      if(sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) != SQLITE_OK) 
       NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database)); 
     } 
     int animalNum = [[[self animalArray] objectAtIndex:i] animal_Number]; 
     NSString *animalText = [[NSString alloc] initWithString:[[[self animalArray] objectAtIndex:i] animal_Text]]; 
     sqlite3_bind_int(addStmt, 1, zoo_ID); 
     sqlite3_bind_int(addStmt, 2, animalNum);  
     sqlite3_bind_text(addStmt, 3, [animalText UTF8String], -1, SQLITE_TRANSIENT); 
     [animalText release]; 
     if(SQLITE_DONE != sqlite3_step(addStmt)) { 
      NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database)); 
     } 

     //Reset the add statement. 
     sqlite3_reset(addStmt);  
    } 
} 

मैं क्या लगता है कि जरूरतों के लिए किया जाना पाश के लिए से बाहर sqlite3_prepare_v2 आदेश लेना हो सकता है, लेन-देन शुरू के माध्यम से जाने के लिए पाश, लेन-देन के लिए प्रतिबद्ध। हालांकि, मुझे यकीन नहीं है कि "लेनदेन शुरू करने" और "लेनदेन करने" के लिए क्या कॉल हैं। और क्या मैं अभी भी sqlite3_step का उपयोग करूंगा? आपकी सहायता के लिए धन्यवाद. sqlite3_exec(db, "BEGIN", 0, 0, 0);

के साथ एक सौदे प्रतिबद्ध:

उत्तर

32

के साथ एक सौदे शुरू sqlite3_exec(db, "COMMIT", 0, 0, 0);

+6

आप इस के लिए एक क्लीनर एपीआई होगा लगता होगा ... क्यों वे सिर्फ एक sqlite3_exec_trans_begin (डाटाबेस) कॉल शामिल नहीं हैं ... – klynch

+0

'sqlite3_exec (डीबी," BEGIN ", 0, 0, 0) करता है; यदि डेटाबेस फ़ाइल को समवर्ती रूप से एक्सेस किया जाता है तो कभी विफल हो जाता है? –

+2

@afriza, BEGIN एक स्थगित ऑपरेशन है। डिफरर्ड का मतलब है कि डाटाबेस पर डेटाबेस तक कोई लॉक अधिग्रहित नहीं होता है जब तक डेटाबेस को पहले एक्सेस नहीं किया जाता है। इस प्रकार एक स्थगित लेनदेन के साथ, BEGIN कथन स्वयं फाइल सिस्टम के लिए कुछ भी नहीं करता है। लॉक को पहले पढ़ने या लिखने के ऑपरेशन तक हासिल नहीं किया जाता है। BEGIN पर अन्य विविधताओं के लिए http://www.sqlite.org/lang_transaction.html देखें जो ताले प्राप्त करने का प्रयास करते हैं। –

संबंधित मुद्दे