2013-07-11 53 views
-4

sqlite3我試圖創建數據庫使用sqlite manager.But值不存儲在數據庫中。如果我點擊保存按鈕警報消息將顯示在這樣的「數據插入失敗「。我試圖糾正這些問題。在這種情況下,我訪問了很多教程。但我無法糾正我的問題。昨天起,我完全阻止了這個問題。請給我任何想法或建議如何保存數據。感謝所有參觀這個問題在SQL語句中如何將數據保存在iphone

DataBase.m

//創建數據庫

-(BOOL)createDB 

{ 

NSString *docsDir; 

NSArray *dirPaths; 


// Get the document directory 


dirPaths=NSSearchPathForDirectoriesInDomains(NSCachesDirectory, NSUserDomainMask, YES); 


docsDir=dirPaths[0]; 


// Build the path to the database file 


databasePath=[[NSString alloc]initWithString:[docsDir stringByAppendingPathComponent:@"Feedback.db"]]; 


BOOL isSuccess=YES; 


NSFileManager *fileManager=[NSFileManager defaultManager]; 


if([fileManager fileExistsAtPath:databasePath]==0) 


{ 


const char *dbpath=[databasePath UTF8String]; 


if(sqlite3_open(dbpath, &database)==SQLITE_OK) 


{ 


char *errMsg; 


const char *sql_stmt= "create table if not exists Feeback details (Traineeid integer, Trainername text,Traineename text,Rating float)"; 


if(sqlite3_exec(database, sql_stmt, NULL, NULL, &errMsg)!=SQLITE_OK) 


{ 


isSuccess=NO; 


NSLog(@"Failed to create table"); 


} 


sqlite3_close(database); 


return isSuccess; 


} 


else 


{ 


isSuccess=NO; 


NSLog(@"Failed to open/Create database"); 


} 


} 

return isSuccess; 

} 

// save data in the Database 

-(BOOL) saveData:(NSString *)Traineeid Trainername:(NSString *)Trainername Traineename:(NSString *)Traineename Rating:(NSString *)Rating; 


{ 

const char *dbpath=[databasePath UTF8String]; 


if(sqlite3_open(dbpath, &database)==SQLITE_OK) 


{ 


NSString *insertSQL=[NSString stringWithFormat:@"insert into Feedbackdetails(Traineeid,Trainername,Traineename,Rating) values(\"%d\",\"%@\", \"%@\", \"%@\")",[Traineeid integerValue],Trainername,Traineename,Rating]; 


const char *insert_stmt=[insertSQL UTF8String]; 


sqlite3_prepare_v2(database, insert_stmt, -1, &statement, NULL); 


if(sqlite3_step(statement)==SQLITE_DONE) 


{ 

return YES; 

} 

else 

{ 

return NO; 

} 

sqlite3_reset(statement); 


} 

return NO; 

} 


FeebBackForm.m 

-(IBAction)saveData:(id)sender 

{ 

BOOL success=NO; 

NSString *alertString = @"Data Insertion failed"; 

if (Traineeid.text.length>0 &&Trainername.text.length>0 &&Traineename.text.length>0 &&Rating.text.length>0) 

{ 

success=[[DBManager getSharedInstance]saveData:Traineeid.text Trainername:Trainername.text Traineename:Traineename.text Rating:Rating.text]; 

} 

else 

{ 

alertString = @"Enter all fields"; 

} 

if (success == NO) 

{ 

UIAlertView *alert = [[UIAlertView alloc]initWithTitle:alertString message:nil 
delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 


[alert show]; 


} 

} 
+0

你爲什麼不使用核心數據 –

+0

看一看這個問題http://stackoverflow.com/questions/17080018/use-and-access-existing-sqlite -database-on-ios/17268032#17268032 – Ayush

+0

@ShashankKulshrestha我想也把星級rating.I要存儲這些內容also.using核心數據是可能的? – user2563884

回答

0

在你的INT PARAMS你把字符串引號。

這可能不是你唯一的問題,但你應該綁定params。它看起來像你在SQL插入語句中的整數值引號,它們被定義爲表中的整數。

"create table if not exists Feeback details (Traineeid integer, Trainername text,Traineename text,Rating float)" 

"insert into Feedbackdetails(Traineeid,Trainername,Traineename,Rating) values(\"%d\",\"%@\", \"%@\", \"%@\")" 

請注意您的雙引號整數。

另外,註銷數據庫的路徑(即使在模擬器中運行)。轉到sqlite命令行並確保數據庫存在,並且空表在那裏。這有助於解決問題。

最後,看看@fmdb sqlite包裝 - 它有助於使用sqlite,但它的代碼也顯示了使用sqlite raw的良好模式,如果這是您的偏好。

下面是一個類似的函數,它顯示瞭如何綁定params。你也應該完成你準備什麼:

- (void)updateContact: (Contact*)contact error:(NSError**)error 
{ 
    if (![self ensureDatabaseOpen:error]) 
    { 
     return; 
    } 

    NSLog(@">> ContactManager::updateContact"); 

    // prep statement 
    sqlite3_stmt *statement; 
    NSString *querySQL = @"update contacts set name=?,address=?,phone=? where id=?"; 
    NSLog(@"query: %@", querySQL); 
    const char *query_stmt = [querySQL UTF8String]; 

    // preparing a query compiles the query so it can be re-used. 
    sqlite3_prepare_v2(_contactDb, query_stmt, -1, &statement, NULL);  
    sqlite3_bind_text(statement, 1, [[contact name] UTF8String], -1, SQLITE_STATIC); 
    sqlite3_bind_text(statement, 2, [[contact address] UTF8String], -1, SQLITE_STATIC); 
    sqlite3_bind_text(statement, 3, [[contact phone] UTF8String], -1, SQLITE_STATIC); 
    sqlite3_bind_int64(statement, 4, [[contact id] longLongValue]); 

    NSLog(@"bind name: %@", [contact name]); 
    NSLog(@"bind address: %@", [contact address]); 
    NSLog(@"bind phone: %@", [contact phone]); 
    NSLog(@"bind int64: %qi", [[contact id] longLongValue]); 

    // process result 
    if (sqlite3_step(statement) != SQLITE_DONE) 
    { 
     NSLog(@"error: %@", sqlite3_errmsg(_contactDb)); 
    } 

    sqlite3_finalize(statement); 
}