0

このデータベースには「Menu」というテーブルがあります。このテーブルを 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 に答える