0

在这个数据库中有一个名为“菜单”的表。我想在我的 ViewController 中打印此表,但此方法不起作用并立即关闭数据库。

在 DatabaseMenu.h 中:

@interface DatabaseMenu : NSObject {
    sqlite3 *databaseMenu;
    DataBaseMenu *rowMenu;
}

@property (nonatomic, assign) int ID; 
@property (nonatomic, copy)NSString *descrizione;
@property (nonatomic, assign) BOOL haSubMenu;
@property (nonatomic, assign) int IDPadre;
@property (nonatomic, copy) NSString *tabelleFigli;
@property (nonatomic, assign) int ordine;
@property (nonatomic, copy) NSString *custView;
@property (nonatomic, assign) BOOL visMappa;
@property (nonatomic, copy) NSMutableArray *menuArray;

-(NSMutableArray*) loadDataFromMenu;
+(DatabaseMenu*) database;

@end

在 DatabaseMenu.m 中

static DatabaseMenu * database;

+(DatabaseMenu*) database{
    if (database==nil) {
        database =[[DatabaseMenu alloc]init];
    }
    return database;
}


-(NSMutableArray*) loadDataFromMenu{ 

    NSString *query = @"SELECT * FROM Menu";

    sqlite3_stmt *statement;

    if (sqlite3_prepare_v2(databaseMenu, [query UTF8String], -1, &statement, nil)
        == SQLITE_OK) {

        while (sqlite3_step(statement) == SQLITE_ROW) {

            //.......

        }
        sqlite3_finalize(statement);

    } else {        
        sqlite3_close(databaseMenu);
    }

    return self.menuArray;  
}

  -(id) init{ //open database
        self =[super init];
        if(self){
        NSString *sqliteDb = [[NSBundle mainBundle]pathForResource:@"China" ofType:@"sqlite"];

         if(sqlite3_open([sqliteDb UTF8String], &databaseMenu)!=SQLITE_OK){

                     NSLog(@"Failed to open database");

            }else {

                     NSLog(@"open the database");



                  [self loadDatiFromMenu];
    }

    return self;
}

}

调试器无法进入 while 循环。为什么?

4

2 回答 2

0

您在头文件中定义了一个实例变量database,但也在database您的实现文件中定义了一个静态变量(不是 sqlite3 对象)。

你确定你使用的是正确的对象loadDataFromMenu吗?

于 2012-10-12T11:17:43.457 回答
0

您所做的不是从数据库读取数据的正确方法。

初始化后 sqlite3 变量必须先打开数据库,然后必须访问数据库,如下所示

if(!sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK)
{
     NSLog(@"An error has occured");
}

const char *sql = "SELECT * FROM Menu";
sqlite3_stmt *sqlStatement;
if(sqlite3_prepare(db, sql, -1, &sqlStatement, NULL) != SQLITE_OK)
{
     NSLog(@"Problem with prepare statement.");
}

while(sqlite3_step(sqlStatement) == SQLITE_ROW)
{
    //get all data from 
}

dbPath是 ivar 用于存储指向数据库的整个路径

于 2012-10-12T12:15:12.970 回答