我有一張名爲Budgets的表格,它存儲了其設置,值和購買完整對象購買的購買nsarray。SQLite3沒有在iOS應用程序中更新
我不知道我在做什麼我的方法錯了,但它不會更新現有條目上的數據庫。它可以節省一個新的預算。
- (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的正確與否節省了購買的問題。我認爲這會起作用。
數據庫文件位於何處?它必須在文檔目錄中,因爲應用程序包ins只讀 – rckoenes
您可以共享日誌輸出嗎?你確定你的數據庫存儲在一個可寫的位置嗎?如果您將其與應用程序捆綁在一起,它將是隻讀的,除非您將其複製到應用程序的主文件夾或其他可寫位置。 –
通常情況下,此症狀是由於試圖從數據包中訪問數據庫,而將其複製到首先讀取/寫入存儲。 –