Iphone 在Xcode上使用SQLite数据库时出现问题

Iphone 在Xcode上使用SQLite数据库时出现问题,iphone,database,xcode,sqlite,Iphone,Database,Xcode,Sqlite,我对Xcode很陌生,我正在编写的教程有一个很大的问题 我正在尝试使用sql数据库编写一个简单的购物清单 事实上,我完成了这个项目。我对每一行代码都进行了三次检查,但出于某种原因,它既不想向我显示数据库的内容,也不想在里面写东西 真的,我不知道代码出了什么问题。。。 在数据库中写入: -(IBAction)addShoppingListItem:(id)sender { //apriamo il database if (([itemNameField.text length] == 0) ||

我对Xcode很陌生,我正在编写的教程有一个很大的问题

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

事实上,我完成了这个项目。我对每一行代码都进行了三次检查,但出于某种原因,它既不想向我显示数据库的内容,也不想在里面写东西

真的,我不知道代码出了什么问题。。。 在数据库中写入:

-(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];
}
}
对于想检查所有项目的勇敢者(这里只有另一个类),这里有我所有工作的链接


提前谢谢

代码中的错误太多了。让我们简单地看一下:

1) 在应用程序委托中,您将db初始化代码放入
ApplicationIDFinishLaunching
方法中,但根据苹果的手册:

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

因此,我刚刚将
initializeDb
方法移动到
-(BOOL)应用程序:(UIApplication*)应用程序使用选项完成启动:(NSDictionary*)启动选项

2) 在
ListViewController
中,您有一个方法
loadDataFromDb
,但我没有找到它的用法。您从未调用此方法。在同一个控制器中,您有
视图将出现
方法,我使用该方法初始化您的
购物列表项目
数组,该数组将在tableView中显示如下:

-(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
并将interface builder与实际控件绑定

3) AddItemViewController的方法
addShoppingListItem
不起作用,因为未通过此条件:

if (([itemNameField.text length] == 0) || ([priceField.text length] == 0) || ([priceField.text doubleValue] == 0.0)) {
        return;
    }
您没有在interface builder中为itemNameField、priceField和groupPicker绑定您的门店


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

我建议您应该使用核心数据,而不是这个低级sqlite代码。事实上,核心dat为您做了很多事情,比如管理缓存和其他与数据库相关的东西。而且学习起来也很简单。我真的很感激你的建议,我会尽快学习的。但是现在我必须使用sql,因为我的老师给了我一个sql的作业!你太棒了!非常感谢你的帮助!看来我真的要提高我的xcode(英语)知识了。还有一个问题:你认为直接从相机向数据库添加物品的照片容易吗?我的意思是,我将创建一个新字段,在其中存储保存在Documents文件夹中的图像路径。再次感谢你的帮助!两天后我终于可以睡觉了。我欠你一杯啤酒!:)一切皆有可能(几乎一切:)。您甚至可以使用BLOB数据类型将照片直接存储在DB中。但实际上,按照Darshan在评论您的问题时所推荐的方法,最好学习一些CoreData员工。CoreData的相同功能可以通过最少的代码编写来实现。