【发布时间】: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