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