我有一个名为Budgets的表,用于存储其设置,值和购买nsarray的对象购买。
我不确定我的方法在这里做错了什么,但它不会在现有条目上更新数据库。它可以节省新的预算。
- (BOOL) saveBudget:(Budget *)budget
{
BOOL success = false;
sqlite3_stmt *statement = NULL;
const char *dbpath = [databasePath UTF8String];
if (sqlite3_open(dbpath, &database) == SQLITE_OK)
{
if (budget.budgetID > 0) {
NSLog(@"Existing data, Update Please");
NSString *updateSQL = [NSString stringWithFormat:@"UPDATE BUDGETS set name = '%@', budget = '%@', customdate = '%d', customday = '%d', rolloverp = '%d', rollovern = '%d', purchases = ?8 WHERE id = ?", budget.name, budget.budget, budget.customDate, budget.customDay, budget.rolloverP, budget.rolloverN];
const char *update_stmt = [updateSQL UTF8String];
sqlite3_prepare_v2(database, update_stmt, -1, &statement, NULL);
sqlite3_bind_int(statement, 1, budget.budgetID);
sqlite3_bind_blob(statement, 8, [budget.purchases bytes], [budget.purchases length], SQLITE_TRANSIENT);
if (sqlite3_step(statement) == SQLITE_DONE)
{
success = true;
}
}
else
{
NSLog(@"New data, Insert Please");
NSString *insertSQL = [NSString stringWithFormat:@"INSERT INTO BUDGETS (name, budget, customdate, customday, rolloverp, rollovern, purchases) VALUES (\"%@\", \"%@\", \"%d\", \"%d\", \"%d\", \"%d\", ?8)", budget.name, budget.budget, budget.customDate, budget.customDay, budget.rolloverP, budget.rolloverN];
const char *insert_stmt = [insertSQL UTF8String];
sqlite3_prepare_v2(database, insert_stmt, -1, &statement, NULL);
sqlite3_bind_blob(statement, 8, [budget.purchases bytes], [budget.purchases length], SQLITE_TRANSIENT);
if (sqlite3_step(statement) == SQLITE_DONE)
{
success = true;
}
}
sqlite3_finalize(statement);
sqlite3_close(database);
NSLog(@"Save Success");
}
return success;
}
我假设查询不正确,但我可能错了。
编辑: 这是我添加数据库的方式。同样,添加新条目并从数据库中检索就好了。检索旧条目但不会更新。
- (void) initDatabase
{
NSString *docsDir;
NSArray *dirPaths;
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = [dirPaths objectAtIndex:0];
databasePath = [[NSString alloc] initWithString:
[docsDir stringByAppendingPathComponent:@"budget.db"]];
NSFileManager *filemgr = [NSFileManager defaultManager];
if([filemgr fileExistsAtPath:databasePath] == NO)
{
const char *dbpath = [databasePath UTF8String];
if (sqlite3_open(dbpath, &database) == SQLITE_OK)
{
NSString sql_stmt = @"CREATE TABLE IF NOT EXISTS BUDGETS (";
sql_stmt = [sql_stmt stringByAppendingString:@"id INTEGER PRIMARY KEY AUTOINCREMENT, "];
sql_stmt = [sql_stmt stringByAppendingString:@"name TEXT, "];
sql_stmt = [sql_stmt stringByAppendingString:@"budget DOUBLE, "];
sql_stmt = [sql_stmt stringByAppendingString:@"customdate INTEGER, "];
sql_stmt = [sql_stmt stringByAppendingString:@"customday INTEGER, "];
sql_stmt = [sql_stmt stringByAppendingString:@"rolloverp INTEGER, "];
sql_stmt = [sql_stmt stringByAppendingString:@"rollovern INTEGER, "];
sql_stmt = [sql_stmt stringByAppendingString:@"purchases BLOB)"];
if (sqlite3_exec(database, [sql_stmt UTF8String], NULL, NULL, &errMsg) != SQLITE_OK)
{
NSLog(@"Failed to create table BUDGETS");
}
else
{
NSLog(@"BUDGETS table created successfully");
}
sqlite3_close(database);
}
else
{
NSLog(@"Failed to open/create database");
}
}
}
另一个问题: 我还有一个问题是我是否正确保存购买NSArray。我认为这会奏效。
答案 0 :(得分:0)
确保指向SQlite数据库的位置正确。在执行查询之前,请确保表处于打开状态并准备好进行操作。请参阅此代码:
sqlite3_stmt *statement;
sqlite3 *cPDB;
NSString *docsDir;
NSArray *dirPaths;
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
docsDir = [dirPaths objectAtIndex:0];
// Data base path
databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent: @"cPDB.db"]];
const char *dbpath = [databasePath UTF8String];
if (sqlite3_open(dbpath, &cPDB) == SQLITE_OK)
{
NSString *querySQL = [NSString stringWithFormat: @"UPDATE USER_SESSION_INFO SET \"%@\" = \"%@\", synState = 'false' WHERE sessionName=\"%@\"",categoryTy,state,sessionName];
const char *query_stmt = [querySQL UTF8String];
if (sqlite3_prepare_v2(cPDB, query_stmt, -1, &statement, NULL) == SQLITE_OK)
{
if((sqlite3_step(statement)) != SQLITE_DONE)
NSLog(@"Not Updated");
else
{
NSLog(@"Succesfully updated row !");
return YES;
}
}
}
答案 1 :(得分:0)
发现问题。更新语句中没有单引号?8。好吧,它总是小问题。谢谢大家!