2011-10-25 10 views
6

Estoy sacando una lista de resultados de una base de datos SQLite3 en un UITableView. El código donde me tire de texto de la base de datos es de esta manera:Forma correcta de convertir char * a NSString sin initWithCString?

char *menuNameChars = (char *) sqlite3_column_text(statement, 1); 
NSString *menuName = [[NSString alloc] initWithUTF8String:menuNameChars]; 
NSLog(@"Retrieved %s,%@ from DB.", menuNameChars, menuName); 

Cuando uso initWithUTF8String, a veces la información se copia correctamente a partir de la base de datos. A veces, sin embargo, la información se visualiza correctamente desde el char*, pero no desde el NSString:

2011-10-24 22:26:54.325 [23974:207] Retrieved Cravin Chicken Sandwich – Crispy, (null) from DB. 
2011-10-24 22:26:54.327 [23974:207] Retrieved Cravin Chicken Sandwich – Roast, (null) from DB. 
2011-10-24 22:26:54.331 [23974:207] Retrieved Jr Chicken Sandwich, Jr Chicken Sandwich from DB. 
2011-10-24 22:26:54.337 [23974:207] Retrieved Prime-Cut Chicken Tenders - 3 Piece, Prime-Cut Chicken Tenders - 3 Piece from DB. 

Ahora, si reemplazo initWithUTF8String con initWithCString, el código funciona perfectamente. Sin embargo, XCode 4.2 me dice que initWithCString ha quedado obsoleto. Sé lo suficiente como para entender que no quiero usar el código en desuso, pero si initWithUTF8String no funciona, ¿qué debo usar?

+1

¿Ha intentado '[NSString stringWithFormat: @ "% s", menuNameChars]'? –

+0

¿Por qué no usar un contenedor alrededor de sqlite como FMDB https://github.com/ccgus/fmdb? – Dani

+0

@Dani, ¿por qué no utilizar Core Data? Aún más fácil. –

Respuesta

4

(editado)

puedo ver que el guión en su primera línea de registro (Retrieved Cravin Chicken Sandwich ...) no es un simple ASCII HYPHEN-MINUS (U + 002D, UTF-8 2D). Es un carácter Unicode EN DASH (U + 2013, UTF-8 E2 80 93). Lo mismo para la segunda línea. Supongo que están codificados incorrectamente en su base de datos. Si le da -[NSString initWithUTF8String:] una C-string que no es válida UTF-8, devuelve nil.

Intenta imprimir un volcado hexadecimal de menuNameChars. Puede hacerlo estableciendo un punto de interrupción en la línea después de la llamada al sqlite3_column_text. Cuando se alcanza el punto de interrupción, haga clic con el botón derecho/control-clic en menuNameChars en su ventana de marco de pila y elija View memory of "*menuNameChars" (observe *).

+0

Dado que está imprimiendo "(nulo)", esto parecería ser un error cometido en el desbordamiento de la pila, no el problema real. – Chuck

+0

Eso es un error de mi parte. He vuelto a escribir el código en lugar de C & P. Es% s,% @ en el código. – DrHogie

+1

La sugerencia de @DanielRHicks anterior soluciona mi problema, pero tu respuesta me da la causa. Estoy usando Excel para ordenar/editar la información en mi base de datos, y cuando hago dos guiones, se corrige automáticamente al carácter "EN DASH" como dijiste. Esta es la razón por la cual mi código no funciona. – DrHogie

2

Parece que los datos no están codificados como UTF-8. Debería averiguar qué codificación se está utilizando y luego usar initWithCString:encoding: y pasar la codificación correcta.

+1

Si uso ** initWithCString **, se transfiere correctamente a NSString; sin embargo, ** initWithCString ** está en desuso. Por lo que puedo decir en los documentos de Apple, ** initWithUTF8String ** es la función que lo reemplazó, pero me da la respuesta anterior (nula). ¿Habría alguna manera de encontrar la codificación del código? – DrHogie

2

probar el poder de stringWithFormat:

+2

+1 [NSString stringWithFormat: @ "% s", property_getName (propiedad)] –