2010-12-02 5 views
2

J'ai créé une base de données SQLite pour iPhone pour stocker mes données (chaînes de caractères). J'ai des données qui contiennent des guillemets simples (c'est-à-dire ne soyez pas tendus). Cela a été inséré dans la base de données en utilisant l'échappement normal pour SQLite.Problème d'encodage de citation unique de sqlite pour iPhone

INSERT INTO todo(test) VALUES('don''t be tense');

Quand je fais une sélection sur les données dans le terminal que je peux voir la citation unique dans le dossier.

don't be tense

Mon problème est quand je lis le record, la citation unique n'est pas là dans le NSLog:

dont be tense

Ceci est l'appel à lire dans le champ:

self.text = [NSString stringWIthUTF8String:(char *)sqlite3_column_text(init_statement, 1)]; NSLog(@"%@",self.translation);

J'apprécierais grandement l'aide sur la façon d'assurer la citation est lu dans

est Ci-dessous le code complet, si elle aide.

static sqlite3_stmt *init_statement = nil; 

@implementation Todo 
@synthesize primaryKey,text; 

- (id)initWithPrimaryKey:(NSInteger)pk database:(sqlite3 *)db { 

    if (self = [super init]) { 
     primaryKey = pk; 
     database = db; 
     // Compile the query for retrieving book data. See insertNewBookIntoDatabase: for more detail. 
     if (init_statement == nil) { 
      // Note the '?' at the end of the query. This is a parameter which can be replaced by a bound variable. 
      // This is a great way to optimize because frequently used queries can be compiled once, then with each 
      // use new variable values can be bound to placeholders. 
      const char *sql = "SELECT text FROM todo WHERE pk=?"; 
      if (sqlite3_prepare_v2(database, sql, -1, &init_statement, NULL) != SQLITE_OK) { 
       NSAssert1(0, @"Error: failed to prepare statement with message '%s'.", sqlite3_errmsg(database)); 
      } 
     } 
     // For this query, we bind the primary key to the first (and only) placeholder in the statement. 
     // Note that the parameters are numbered from 1, not from 0. 
     sqlite3_bind_int(init_statement, 1, primaryKey); 
     if (sqlite3_step(init_statement) == SQLITE_ROW) { 
      self.text = [NSString stringWithUTF8String:(char *)sqlite3_column_text(init_statement, 0)]; 
      NSLog(@"%@",self.text); 
     } else { 
      self.text = @"Nothing"; 
     } 
     // Reset the statement for future reuse. 
     sqlite3_reset(init_statement); 
    } 
    return self; 
} 
+0

Bon montage, la question a beaucoup plus de sens maintenant. J'étais vraiment confus par l'ancien "je peux voir la citation unique dans le dossier, ne soyez pas tendu". :) –

+0

Pourriez-vous fournir un script sqlite3 pour créer votre base de données et tester votre entrée? Votre code a bien fonctionné avec ma base de données de test, que j'ai créée comme suit: 'sqlite3 so_squot.db create table TODO (pk entier clé primaire asc, texte texte non nul); insérer dans les valeurs TODO (1, «ne soyez pas tendu»); .quit' –

+0

Salut Jeremy, Merci d'avoir essayé. – Brian

Répondre

0

Je l'ai fixé. Il semble que lorsque j'ai mis à jour la base de données, je n'ai pas supprimé l'ancien du simulateur, donc il testait avec les anciennes données tout le temps. Erreur stupide! Il n'y a donc aucun problème à lire dans des guillemets simples de SQLite (probablement pourquoi je n'ai jamais pu trouver d'informations à ce sujet). Merci à ceux qui ont lu et essayé d'aider!