【问题标题】:Cannot insert json string to sqlite in App无法在 App 中将 json 字符串插入到 sqlite
【发布时间】:2014-07-07 21:34:45
【问题描述】:

我正在尝试在我的应用程序中向 sqlite 插入一个 json 字符串。但它没有完成插入查询。我认为json字符串的格式可能有问题?因为当我插入一个常规字符串时它可以工作。请让我知道您是否可以看到我没有错的地方。代码如下:

    NSData *imageData = UIImageJPEGRepresentation(self.chosenPhoto, 0.5f);
    NSString *base64StringOfImage = [imageData base64EncodedStringWithOptions:0];
    MCYProduct *newProduct = [[MCYProduct alloc] initWithProductName:self.textFieldName.text ProductDescription:self.textViewDescription.text ProductPrice:@([self.textFieldPrice.text integerValue]) ProductSalePrice:@([self.textFieldSalePrice.text integerValue]) ProductColors:self.chosenColors ProductStores:dictionaryStores ProductPhoto:self.chosenPhoto];
    NSDictionary *dictionaryProduct = @{@"name": newProduct.name, @"description:": newProduct.description, @"price": newProduct.price, @"salePrice:": newProduct.salePrice, @"colors": newProduct.colors, @"stores:": newProduct.stores, @"photo": base64StringOfImage};

    NSError *writeError = nil;
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dictionaryProduct options:NSJSONWritingPrettyPrinted error:&writeError];
    NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    NSLog(@"JSON Output: %@", jsonString);

    sqlite3 *sqlite;
    NSString *directoryDocuments;
    NSArray *directoryPath;
    NSString *databasePath;
    directoryPath = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    directoryDocuments = [directoryPath objectAtIndex:0];
    databasePath = [[NSString alloc] initWithString: [directoryDocuments stringByAppendingPathComponent:@"products.db"]];
    const char *dbPath = [databasePath UTF8String];
    sqlite3_stmt *statement;

    if (sqlite3_open(dbPath, &sqlite) == SQLITE_OK)
    {
        NSMutableString *mutableJsonString = [[NSMutableString alloc]initWithData:jsonData encoding:NSUTF8StringEncoding];
        [mutableJsonString replaceOccurrencesOfString:@"\""  withString:@"\\\"" options:NSCaseInsensitiveSearch range:NSMakeRange(0, [mutableJsonString length])];

        jsonString = mutableJsonString;

        NSString *insertSQL = [NSString stringWithFormat:@"INSERT INTO PRODUCTS (JSON) VALUES ('%@')",jsonString];
        const char *insert_stmt = [insertSQL UTF8String];
        sqlite3_prepare_v2(sqlite, insert_stmt, -1, &statement, NULL);
        if (sqlite3_step(statement) == SQLITE_DONE)
        {
            NSLog(@"Product added");
        } else {
            NSLog(@"Failed to add Product");
        }
        sqlite3_finalize(statement);
        sqlite3_close(sqlite);
    }

【问题讨论】:

  • 永远不要使用stringWithFormat 将值绑定到查询中。使用sqlite3_bind_xxx 函数正确完成。
  • 它是这样工作的: sqlite3_stmt *statement; if (sqlite3_open(dbPath, &sqlite) == SQLITE_OK) { NSString *insertSQL = [NSString stringWithFormat:@"INSERT INTO PRODUCTS (JSON) VALUES (?)"]; const char *insert_stmt = [insertSQL UTF8String]; sqlite3_prepare_v2(sqlite, insert_stmt, -1, &statement, NULL); sqlite3_bind_text(语句,1,[jsonString UTF8String],-1,SQLITE_TRANSIENT);谢谢rmaddy!
  • 请注意,您上面的评论中的 stringWithFormat 没有任何意义——这只是浪费动作。将字符串文字直接分配给insertSQL
  • 明白了,谢谢你的收获。

标签: ios objective-c json sqlite


【解决方案1】:

答案是像这样使用绑定:

sqlite3_stmt *statement;
if (sqlite3_open(dbPath, &sqlite) == SQLITE_OK) { 
    NSString *insertSQL = @"INSERT INTO PRODUCTS (JSON) VALUES (?)"; 
    const char *insert_stmt = [insertSQL UTF8String]; 
    sqlite3_prepare_v2(sqlite, insert_stmt, -1, &statement, NULL); 
    sqlite3_bind_text(statement, 1, [jsonString UTF8String], -1, SQLITE_TRANSIENT);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-02
    • 1970-01-01
    • 1970-01-01
    • 2018-05-11
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多