2010-11-17 79 views
0

在我的Mac和iPhone上,使用objective-c,我可以將EURO字符保存到sqlite數據庫。在保存到sqlite數據庫之前(和之後)比較NSString

之前,我保存它,NSString的長度爲1(或應該說是2?)

後,我找回它從數據庫返回的,NSString的長度現在是2(或者應該說是1 ?)

如何比較這2個NSStrings? isEqualToString不起作用。

(讀/寫/只要細如我堅持0-127字符比較的作品。)

這是SQLite的READ碼的重簡裝樣本:

NSMutableString *s = [[[NSMutableString alloc] init] autorelease]; 
sqlite3_stmt *statement; 
int i, numberOfColumns=0, columnType, numberOfRecords=0; 
int anyInt; 
double anyDouble; 

char *anyText; 

int prepareErrorNumber = sqlite3_prepare_v2(g_Db, [sqlCmd UTF8String], -1, &statement, nil); 

if(prepareErrorNumber == SQLITE_OK) 
{ 
    while(sqlite3_step(statement) == SQLITE_ROW) 
    { 
     numberOfRecords++; 
     numberOfColumns = sqlite3_column_count(statement); 

     columnType = sqlite3_column_type(statement, i); 
      if(columnType == SQLITE_INTEGER) { anyInt = sqlite3_column_int(statement, i);   [s appendFormat:@"%d", anyInt ]; } 
      if(columnType == SQLITE_TEXT ) { anyText = (char *)sqlite3_column_text(statement, i); [s appendFormat:@"%s", anyText ]; } 
      if(columnType == SQLITE_FLOAT ) { anyDouble = sqlite3_column_double(statement, i);  [s appendFormat:@"%f", anyDouble]; } 
     } 

... etc... 
+0

示例代碼顯示了您確實要如何存儲和加載字符串,這將有所幫助。 – 2010-11-17 17:43:39

+1

你的代碼不正確地處理編碼。發佈相關信息,我們可以提供幫助。 :)特別是,我們對如何將字符串放入sqlite以及如何恢復它感興趣。 – 2010-11-17 17:44:55

+0

我會挖掘實際的代碼。 (這是在我的工作計算機上。)所以你說我應該永遠不會收回2個字節...如果我存儲1個? (我認爲sqlite * DID *這樣做,如果字符是在0-127範圍之外。不是?)這個事實,[dbResults長度]是2 ...絕對意味着我的sqlite讀/寫代碼是錯誤的?)我使用一些漂亮的標準sqlite代碼出現在整個網絡中......除了大於127個字符外,它總是適用於所有內容。 – Linda 2010-11-17 17:52:43

回答

0

很可能,您正在使用從讀取中收集的信息以錯誤的方式創建NSString。這裏是一個寫歐元符號到一個數據庫,然後回讀的一個完整的例子:

//clang -g so_sqlite3_nsstring.m -framework Foundation -lsqlite3 \ 
// -o so_sqlite3_nsstring 
#import <Foundation/Foundation.h> 
#import <sqlite3.h> 

#define DB_PATH "so_enc.db" 

enum { 
    ALL_OK, 
    CANT_OPEN, 
    CANT_CREATE, 
    CANT_INSERT, 
    CANT_FIND, 
}; 

struct ExecCBCtx { 
    NSString **out_string; 
}; 
int ExecCB(void *ctx, int col_count, char *col_text[], char *col_name[]); 

sqlite3 *DBCreate(void); 
void DBWrite(sqlite3 *db, NSString *text); 
NSString *DBRead(sqlite3 *db); 

int 
main(void) { 
    id pool = [[NSAutoreleasePool alloc] init]; 
    sqlite3 *db = DBCreate(); 

    // Use universal character name for U+20AC "EURO SIGN". 
    NSString *text = @"\u20AC"; 
    DBWrite(db, text); 

    NSString *text2 = DBRead(db); 
    (void)sqlite3_close(db); 

    BOOL eq = [text isEqualToString:text2]; 
    NSLog(@"%@ = %@? %s", text, text2, eq? "YES" : "NO"); 
    [pool drain]; 
    return ALL_OK; 
} 

void 
DBOpen(sqlite3 **out_db) 
{ 
    sqlite3 *db = NULL; 
    int rc = sqlite3_open(DB_PATH, out_db); 
    if (rc) { 
    fprintf(stderr, "sqlite3_open: %s\n", sqlite3_errmsg(*out_db)); 
    (void)sqlite3_close(*out_db); 
    exit(CANT_OPEN); 
    } 
} 

sqlite3 * 
DBCreate(void) 
{ 
    sqlite3 *db = NULL; 
    DBOpen(&db); 

    static const char CREATE_TABLE[] = 
     "CREATE TABLE IF NOT EXISTS \"TEST\" (\"STRING\" char(9))"; 
    char *errmsg = NULL; 
    int rc = sqlite3_exec(db, CREATE_TABLE, ExecCB, NULL, &errmsg); 
    if (rc) { 
    fprintf(stderr, "%s: %s\n", __func__, errmsg); 
    sqlite3_free(errmsg); 
    (void)sqlite3_close(db); 
    exit(CANT_CREATE); 
    } 
    return db; 
} 

void 
DBWrite(sqlite3 *db, NSString *text) 
{ 
    static NSString *const WRITE_TABLE_FMT = 
     @"INSERT INTO \"TEST\" VALUES (\"%@\")"; 
    NSString *writeText = [NSString stringWithFormat:WRITE_TABLE_FMT, text]; 
    const char *cmd = [writeText UTF8String]; 

    char *errmsg = NULL; 
    int rc = sqlite3_exec(db, cmd, ExecCB, NULL, &errmsg); 
    if (rc) { 
    fprintf(stderr, "%s: %s\n", __func__, errmsg); 
    sqlite3_free(errmsg); 
    (void)sqlite3_close(db); 
    exit(CANT_INSERT); 
    } 
} 

NSString * 
DBRead(sqlite3 *db) 
{ 
    static const char READ_TABLE[] = 
     "SELECT * FROM \"TEST\""; 

    NSString *text = nil; 
    struct ExecCBCtx ctx = {&text}; 

    char *errmsg = NULL; 
    int rc = sqlite3_exec(db, READ_TABLE, ExecCB, &ctx, &errmsg); 
    if (rc && rc != SQLITE_ABORT) { 
    fprintf(stderr, "%s: %s\n", __func__, errmsg); 
    sqlite3_free(errmsg); 
    (void)sqlite3_close(db); 
    exit(CANT_FIND); 
    } 
    sqlite3_free(errmsg); 
    return text; 
} 

int 
ExecCB(void *ctx, int col_count, char *col_text[], char *col_name[]) 
{ 
    //fprintf(stderr, "%s: %p - %d cols - %s - %s\n", 
    //  __func__, ctx, col_count, col_text[0], col_name[0]); 
    if (!ctx) return 0; 

    struct ExecCBCtx *out = ctx; 
    NSString **text = out->out_string; 
    if (*text) return 1; 

    *text = [NSString stringWithUTF8String:col_text[0]]; 
    return 0; 
} 

下面是從一個樣品運行的輸出:

2010-11-17 14:34:05.436 so_sqlite3_nsstring[23536:903] € = €? YES 
0

=>使用實例方法UTF8String寫入時

完成。 (我沒有顯示該代碼,但它已經完成。)

=>和類方法stringFromUTF8String:讀取時。

我認爲這是我需要解決的問題。
但它會是什麼樣子?
無論如何重寫它,我都無法使stringFromUTF8String工作。

if(columnType == SQLITE_TEXT ) 
{ 
    anyText = (char *)sqlite3_column_text(statement, i); 
    [s appendFormat:@"%s", anyText]; 
} 
相關問題