2012-06-18 85 views
1

我想讀取/寫入SQLite數據庫,但我不斷收到錯誤。我已經驗證數據庫存在... iPhone模擬器/應用程序/ 5.1 /應用程序#/ Documents/kipSQLDB.dbiOS SQLite插入並選擇不工作?

我已經完成INSERT並從終端選擇它。

但從應用程序它只是錯誤了。 (附加的問題 - 是否有使用SQLite一種方式來獲得像MySQL的mysql_error信息的錯誤消息當我錯誤的應用程序,我什麼也沒得到,但是一些符號

這裏是我的代碼:

.H

#import <Foundation/Foundation.h> 
#import <sqlite3.h> 

@interface SQLiteController : NSObject { 

//file management 
NSFileManager *fileManager; 
NSString *documentsDirectory; 

//sqlite data 
sqlite3* databaseHandle; 

} 

- (void) initSQLiteDB; 

- (void) insertData : (NSString*) fName : (NSString*) lName : (NSString*) companyName; 

- (NSArray*) getData; 

@end 

.M

- (void) insertData : (NSString*) fName : (NSString*) lName : (NSString*) companyName { 

NSString* insertStatement = [NSString stringWithFormat:@"INSERT INTO nameList (userFName, userLName, userCompany) VALUES (\"%@\", \"%@\", \"%@\")", fName, lName, companyName]; 
NSLog(@"%@", insertStatement); 

char *error; 
if (sqlite3_exec(databaseHandle, [insertStatement UTF8String], NULL, NULL, &error) == SQLITE_OK) { 

    int recordID = sqlite3_last_insert_rowid(databaseHandle); 
    NSLog(@"A record was inserted into the database %@ with the id of %i", databaseHandle, recordID); 
} else { 
    NSLog(@"Error: %s", error); 
} 
} 

- (NSArray*) getData { 

NSMutableArray* dataArray = [[NSMutableArray alloc] init]; 

NSString* getStatement = @"SELECT * FROM nameList"; 

sqlite3_stmt *statement; 
if (sqlite3_prepare_v2(databaseHandle, [getStatement UTF8String], -1, &statement, NULL) == SQLITE_OK){ 

    // Iterate over all returned rows 
    while (sqlite3_step(statement) == SQLITE_ROW) { 

     int recordID = sqlite3_column_int(statement, 0); 
     NSString* fNameFromDB = [NSString stringWithUTF8String:(char*)sqlite3_column_text(statement, 1)]; 
     NSLog(@"%@", fNameFromDB); 
    } 
} else { 
    NSLog(@"No soup for you!"); 
} 

return 0; 

} 
@end 

回答

1

使用嘗試捕捉格式和捕獲SQL的錯誤類型

1

試試這個,我認爲這將有助於你一些什麼

- (void) insertData : (NSString*) fName : (NSString*) lName : (NSString*) companyName { 

    if(insertStatement == nil) 
    { 

    NSString* insertStatement = [NSString stringWithFormat:@"INSERT INTO nameList (userFName, userLName, userCompany) VALUES (\"%@\", \"%@\", \"%@\")", fName, lName, companyName]; 
    NSLog(@"%@", insertStatement); 
    if(sqlite3_prepare_v2(database, insertSql, -1, &insertStmt, NULL) != SQLITE_OK) 
      NSAssert1(0, @"Error while creating insert statement. '%s'", sqlite3_errmsg(database)); 
    } 


    sqlite3_bind_text(insertStatement, 1, [Gunameq UTF8String], -1, SQLITE_TRANSIENT); 
    sqlite3_bind_text(insertStatement, 2, [Gpassq UTF8String], -1, SQLITE_TRANSIENT); 
    if(SQLITE_DONE != sqlite3_step(insertStmt)) 
     NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database)); 
    else 
     NSLog("Inserted"); 
    //Reset the add statement. 
    sqlite3_reset(insertStatement); 
    insertStatement= nil;  

    - (NSArray*) getData { 

    NSMutableArray* dataArray = [[NSMutableArray alloc] init]; 

    NSString* getStatement = @"SELECT * FROM nameList"; 

    sqlite3_stmt *statement; 
    if (sqlite3_prepare_v2(databaseHandle, [getStatement UTF8String], -1, &statement, NULL) == SQLITE_OK){ 

     // Iterate over all returned rows 
     while (sqlite3_step(statement) == SQLITE_ROW) { 

      int recordID = sqlite3_column_int(statement, 0); 
      NSString* fNameFromDB = [NSString stringWithUTF8String:(char*)sqlite3_column_text(statement, 1)]; 
      NSLog(@"%@", fNameFromDB); 
     } 
    } else { 
     NSLog(@"No soup for you!"); 
    } 

    return 0; 

    } 
    @end 
-1

SQLite的可有點棘手。所有對它的訪問都必須來自同一個線程。對於每個準備聲明,都必須有一個最終聲明。

沒有爲使用SQLite這裏,你可以參考的例子項目:https://github.com/AaronBratcher/ABSQLite

它有一個更傳統的數據庫的方式,我覺得更容易訪問SQLite的類。