iPhone

2009-09-14 18 views
5
पर डालने पर SQLite व्यवहार

मैं वर्तमान में मेरे iPhone आवेदन के हिस्से के रूप में निम्नलिखित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); 

क्या मुझे भ्रमित कर रहा है कर रहा हूँ कि अगर मैं अनुभाग,

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

बाहर ले INSERT डेटाबेस में सहेजा नहीं गया है और खो जाता है। मुझे लगता है कि मैं यहाँ कुछ स्पष्ट याद कर रहा हूँ?

+0

मैं कोर डेटा का उपयोग नहीं कर के लिए अपने कारण (ओं) के उत्सुक हूँ। – nicerobot

+1

मैं आमतौर पर SQLite के आस-पास कुछ रैपर का उपयोग करता हूं, या अधिकतर इन दिनों, कोर डेटा से अधिक नहीं। हालांकि मैं जानना चाहता था कि पुस्तकालय का उपयोग कैसे करें, इसलिए ... –

उत्तर

7

बेशक यह डाला नहीं किया जाएगा। वास्तव में अपने कथन को निष्पादित करने के लिए आपको sqlite3_step पर कॉल करने की आवश्यकता है।

the documentation देखें।

यह एक SQLite चीज है, आईफोन विशिष्ट चीज़ नहीं।

प्रलेखन से:

एक तैयार बयान के बाद कर दिया गया है या तो sqlite3_prepare_v2() या sqlite3_prepare16_v2() या विरासत इंटरफेस sqlite3_prepare में से एक() या sqlite3_prepare16(), इस का उपयोग कर तैयार फ़ंक्शन को पर एक या अधिक बार कॉल किया जाना चाहिए कथन का मूल्यांकन करें।

+0

SQLite दस्तावेज आश्चर्यजनक रूप से अच्छी तरह से तैयार नहीं है। सूचक के लिए धन्यवाद। –

+0

... लेकिन हाँ, मुझे कुछ स्पष्ट याद आ रही थी। –

2

मैं करूंगा पूरी तरह से एक आवरण का उपयोग कर के बजाय खुद के संकलन बयानों से निपटने की सलाह देते हैं ... विकल्पों में से एक सभ्य सूची यहां उपलब्ध है: http://cocoaheads.byu.edu/resources/sqlite

2

आप केवल एक पंक्ति डाल रहे हैं इसलिए बहुत सारे बॉयलरप्लेट कोड हैं। सोचो क्या होगा अगर आप एक से अधिक पंक्तियां सम्मिलित करना चाहता था क्या होगा: आप के लिए एक कदम बयान आवश्यकता होगी

  • तुम अब भी एक भी बयान
  • तुम अब भी एक भी अंतिम रूप देने बयान
  • आवश्यकता होगी तैयार आवश्यकता होगी प्रत्येक पंक्ति जिसे आप जोड़ना चाहते हैं। यदि आप एक चयन कथन देख रहे हैं तो "चरण" (या "अगली पंक्ति प्राप्त करें" के रूप में "कदम" के बारे में सोच सकते हैं)

वैसे, आप शायद "कदम" नहीं करना चाहते "अगर तैयार कथन विफल हुआ।

0

उपयोग कोड

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

"डालने में"