在Xcode上使用SQLite数据库的问题

时间:2011-08-14 02:49:47

标签: iphone database xcode sqlite

我对Xcode很陌生,我正在研究的教程存在很大问题。

我正在尝试使用sql数据库编写一个简单的购物清单。

实际上我完成了这个项目。我对每一行代码进行了三重检查,但出于某种原因,它不想向我展示数据库的内容,也不想在内部写一些内容。

真的我不知道代码有什么问题...... 在DB中写作:

-(IBAction)addShoppingListItem:(id)sender {
//apriamo il database
if (([itemNameField.text length] == 0) || ([priceField.text length] == 0) || ([priceField.text doubleValue] == 0.0)) {
    return;
}
sqlite3 *db;
int dbrc; //Codice di ritorno del database (database return code)
DatabaseShoppingListAppDelegate *appDelegate = (DatabaseShoppingListAppDelegate*) [UIApplication sharedApplication].delegate;
const char *dbFilePathUTF8 = [appDelegate.dbFilePath UTF8String];
dbrc = sqlite3_open(dbFilePathUTF8, &db);
if (dbrc) {
    NSLog(@"Impossibile aprire il Database!");
    return;
}
//database aperto! Inseriamo valori nel database.
sqlite3_stmt *dbps; //Istruzione di preparazione del database
NSString *insertStatementsNS = [NSString stringWithFormat: @"insert into \"shoppinglist\" (item, price, groupid, dateadded) values (\"%@\", %@, %d, DATETIME('NOW'))", name_field, price_field, [groupPicker selectedRowInComponent:0]];
const char *insertStatement = [insertStatementsNS UTF8String];
dbrc = sqlite3_prepare_v2(db, insertStatement, -1, &dbps, NULL);
dbrc = sqlite3_step(dbps);
//faccio pulizia rilasciando i database
sqlite3_finalize(dbps);
sqlite3_close(db);

// Pulisci i campi e indica successo nello status
statusLabel.text = [[NSString alloc] initWithFormat: @"Aggiunto %@", itemNameField.text];
statusLabel.hidden = NO;
itemNameField.text = @"";
priceField.text = @"";
}

从数据库加载:

-(void)loadDataFromDb {
//apriamo il database
sqlite3 *db;
int dbrc; //Codice di ritorno del database (database return code)
DatabaseShoppingListAppDelegate *appDelegate = (DatabaseShoppingListAppDelegate *) [UIApplication sharedApplication].delegate;
const char *dbFilePathUTF8 = [appDelegate.dbFilePath UTF8String];
dbrc = sqlite3_open(dbFilePathUTF8, &db);
if (dbrc) {
    NSLog(@"Impossibile aprire il Database!");
    return;
}
//database aperto! Prendiamo i valori dal database.
sqlite3_stmt *dbps; //Istruzione di preparazione del database
NSString *queryStatementNS = @"select key, item, price, groupid, dateadded from shoppinglist order by dateadded";
const char *queryStatement = [queryStatementNS UTF8String];
dbrc = sqlite3_prepare_v2(db, queryStatement, -1, &dbps, NULL);

//Richiamo la funzione sqlite3_step() finché ho righe nel database
while ((dbrc = sqlite3_step(dbps)) == SQLITE_ROW) {
    int primaryKeyValueI = sqlite3_column_int(dbps, 0);
    NSNumber *primaryKeyValue = [[NSNumber alloc] initWithInt:primaryKeyValueI];
    NSString *itemValue = [[NSString alloc] initWithUTF8String:(char*) sqlite3_column_text(dbps, 1)];
    double priceValueD = sqlite3_column_double(dbps, 2);
    NSNumber *priceValue = [[NSNumber alloc] initWithDouble:priceValueD];
    int groupValueI = sqlite3_column_int(dbps, 3);
    NSNumber *groupValue = [[NSNumber alloc] initWithInt:groupValueI];
    NSString *dateValueS = [[NSString alloc] initWithUTF8String:(char*) sqlite3_column_text(dbps, 4)];
    NSDate *dateValue = [dateFormatter dateFromString: dateValueS];

    NSMutableDictionary *rowDict = [[NSMutableDictionary alloc] initWithCapacity:5];
    [rowDict setObject:primaryKeyValue forKey: ID_KEY];
    [rowDict setObject:itemValue forKey: ITEM_KEY];
    [rowDict setObject:priceValue forKey: PRICE_KEY];
    [rowDict setObject:groupValue forKey: GROUP_ID_KEY];
    [rowDict setObject:dateValue forKey: DATE_ADDED_KEY];
    [shoppingListItems addObject: rowDict];

    //rilascio tutti gli elementi
    [dateValue release];
    [primaryKeyValue release];
    [itemValue release];
    [priceValue release];
    [groupValue release];
    [rowDict release];
}
}

对于想要检查所有项目的勇敢者(这里只有另一个班级),这里有我所有工作的链接。 http://www.mediafire.com/?qxfde723r29nhtb

提前致谢。

1 个答案:

答案 0 :(得分:1)

您的代码中有太多错误。让我们简要地看一下它们:

1)在您的应用程序委托中,您将数据库初始化代码放在applicationDidFinishLaunching方法中,但根据Apple的手册:

  

此方法在早期版本的iOS中用于初始化   应用程序并准备运行。在iOS 3.0及更高版本中,您应该这样做   使用应用程序:didFinishLaunchingWithOptions:而不是。

所以,我刚将initializeDb方法移到- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

2)在ListViewController中你有一个方法loadDataFromDb,但我找不到它的用法。你永远不会称这种方法。在同一个控制器中,您使用viewWillAppear方法初始化将在tableView中显示的shoppingListItems数组,如下所示:

-(void)viewWillAppear:(BOOL)animated {
    shoppingListItems = [[NSMutableArray alloc] init];
    [self loadDataFromDb];
    [tableView reloadData];
}

tableView是您放置在nib文件中的UITableView控件的插座。我在ListViewController.h中添加了它的声明:

@interface ListViewController : UIViewController {
    UITableViewCell *nibLoadedCell;
    IBOutlet UITableView *tableView;
}
@property(nonatomic, retain) IBOutlet UITableViewCell *nibLoadedCell;

@end

并在接口构建器中与实际控件绑定。

3)AddItemViewController的方法addShoppingListItem无效,因为没有通过这个条件:

if (([itemNameField.text length] == 0) || ([priceField.text length] == 0) || ([priceField.text doubleValue] == 0.0)) {
        return;
    }

您没有在itemNameField,priceField,groupPicker的界面构建器中绑定您的商店。

通过修复此问题,我得到了解决方案,但实际上我没有检查内存使用情况,并且假设您在内存管理方面也存在一些问题。