2012-07-04 66 views
0

首先,我來自西班牙,對我的語法感到抱歉。我正在寫一些數據到一個SQLite數據庫,這裏是我的代碼:Xcode寫入數據庫但仍爲空

我已allredy檢查數據庫,表和列名是好的,當我改變任何我得到的錯誤,所以代碼其工作正常。

@try { 

    NSFileManager *fileMgr=[NSFileManager defaultManager]; 

    NSString *dbPath=[self database]; 
    BOOL succes=[fileMgr fileExistsAtPath:dbPath]; 
    if(!succes) 
    { 
     NSLog(@"Cannot locate database '%@'.",dbPath); 
    } 
    if (!(sqlite3_open([dbPath UTF8String], &dbcapturas)==SQLITE_OK)) { 
     NSLog(@"An error has occured: %@",sqlite3_errmsg(dbcapturas)); 
    } 

    //sqlite3_stmt *sqlStatement; 
    NSString *asd=numero.text; 
    NSString *insertStatement=[NSString stringWithFormat:@"INSERT INTO captura(key,tecnico, fecha,provincia,municipio,latitud,longitud,altura,familia,especie,numero,comentario)Values(\"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\", \"%@\")",asd,tecnico,fechaHora,tecnico,municipio,latitud,longitud,altura,tecnico,animal,asd,coment]; 
    char *error; 
    if((sqlite3_exec(dbcapturas, [insertStatement UTF8String], NULL, NULL, &error))==SQLITE_OK) 
    { 
     NSLog(@"Person inserted."); 
    } 
    else 
    { 
     NSLog(@"Error: %s", error); 
    } 
} @catch (NSException *exception) { 
    NSLog(@"fail"); 
} 
@finally { 
     NSLog(@"cerrada"); 
    sqlite3_close(dbcapturas); 
} 

我第一次點擊保存按鈕,我得到:

2012-07-04 12:17:45.644 adasdasd[1783:f803] Person inserted.

和我第二次獲得:

2012-07-04 12:29:18.959 adasdasd[1840:f803] Error: column key is not unique

所以我的代碼應該沒問題,但是當我打開與Firefox的數據庫添加其完全空,任何想法?

編輯:我現在請

-(NSString *)database{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES); 
    NSString *documentsDir = [paths objectAtIndex:0]; 
    return [documentsDir stringByAppendingPathComponent:@"capturas.sqlite"]; 
} 

,但現在我得到一個錯誤說我:沒有這樣的表:capturas 我有一個表capturas在我的數據庫100%肯定

+0

你可能想要使用FMDB,這是標準SQL操作更好的包裝/代碼使用。 – Panagiotis

+0

對不起,我是noob,你可以更具體或給我一個例子plz?不知道FMDB是什麼意思 – BeaTX

+1

https://github.com/ccgus/fmdb –

回答

0

在設置您的表中,列key可能被索引或定義爲唯一或自動遞增。當你插入時,你傳遞一個特定的密鑰,即無論在變量asd。如果你第二次嘗試,你會得到sqlite錯誤,因爲key列必須是唯一的。如果是自動增量,則將其保留並自動填充。

如果正確關閉它,第一項應該在數據庫中。確保您使用Firefox檢查數據庫的正確副本(例如,通過在應用程序委託中插入虛擬記錄進行測試)。

+0

我做了porpouse檢查它正在寫數據到數據庫,我正在檢查正確的數據庫文件,我猜測它將數據保存到臨時文件,但沒有到達數據庫。 – BeaTX

+0

其中一種方法就是在沒有您的try-catch-finally的情況下執行此操作。看來終於不叫了。你可以簡單地調用'sqlite3_close'。 – Mundi