ios - 无法在 App 中将 json 字符串插入到 sqlite

标签 ios objective-c json sqlite

我试图在我的应用程序中向 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);
    }

最佳答案

答案是像这样使用绑定(bind):

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);
}

关于ios - 无法在 App 中将 json 字符串插入到 sqlite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23745976/

相关文章:

ios - 网络 iOS : Background/MainThread?

objective-c - 在 if 条件下 self 赋值 - Objective-C

iphone - 文本滚动到 UITextView 框边界之外

ios - 使用 SwiftyJSONAccelerator 进行 Swift JSON 解析

json - PostgreSQL引入JSONB的解释

ios - JSON 解析错误 - 类型 'RecentTvListData' 没有下标成员

ios - 在 mkMapview 中显示注释的不同图像

ios - 使用 Twitter API 时烦人的 TableView

ios - 自定义 UITableViewCell 不符合 UITableViewDataSource 协议(protocol)?

iphone - 更改 View 大小后 tableview 消失