1

iOS でプロジェクトを行っていますが、次の問題があります。既存のデータベースを使用しており、最初のステップ (データベースを開く) は正常に機能しますが、データを読み取ろうとするとエラーが発生します。

コンソールのみが表示されます: 2013-02-26 14:46:59.999 MyApp[66537:c07] データの読み取りの問題

-(void) openDB
{
    @try {
        NSFileManager *fileMgr = [NSFileManager defaultManager];
        NSString *dbPath = [[[NSBundle mainBundle] resourcePath ]stringByAppendingPathComponent:@"data.db"];
        BOOL success = [fileMgr fileExistsAtPath:dbPath];
        if(!success)
        {
            NSLog(@"Cannot locate database file '%@'.", dbPath);
        }
        if(!(sqlite3_open([dbPath UTF8String], &db) == SQLITE_OK))
        {
            NSLog(@"An error has occured.");
        }
    }
    @catch (NSException *exception) {
        NSLog(@"An exception occured: %@", [exception reason]);
    }
}

-(void) getData{
    NSString  *sql = @"SELECT * FROM frases";
    sqlite3_stmt * stmt;

    if (sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil) != SQLITE_OK) {
        NSLog(@"problem reading data");
    }
}


- (void)viewDidLoad
{
    [super viewDidLoad];
    [self openDB];
    [self getData];
}
4

1 に答える 1

-1

-(void)getData {NSString * sql = @ "SELECT * FROM frases"; sqlite3_stmt * stmt;

if (sqlite3_prepare_v2(db, [sql UTF8String], -1, &stmt, nil) != SQLITE_OK) {
    NSLog(@"problem reading data");
}else{
    sqlite3_stmt *compiledstatement;
    const char *selectStatement = [sql UTF8String];
    sqlite3_prepare_v2(sqlDatabase, selectStatement, -1, &compiledstatement, NULL);

    if (sqlite3_step(compiledstatement) == SQLITE_DONE) {}
    else NSLog(@"Failed!");
    sqlite3_finalize(compiledstatement);
}

}

これは私がそれをする方法です。ジェネリック関数を持ち、変数を渡すだけです。

-(void)readDB:(NSString *)queryString {
    NSString    *docsDir;
    NSArray     *dirPaths;
    dirPaths    = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    docsDir     = [dirPaths objectAtIndex:0];

    strDatabasePath         = [NSString stringWithString:[docsDir stringByAppendingPathComponent:@"database.db"]];
    NSFileManager *filemgr  = [NSFileManager defaultManager];

    if ([filemgr fileExistsAtPath: strDatabasePath] == YES)
    {
        const char *dbpath = [strDatabasePath UTF8String];
        if (sqlite3_open(dbpath, &sqlDatabase) == SQLITE_OK)
        {
            const char* beginString = "BEGIN;";
            sqlite3_stmt *compiledstatement;
            sqlite3_prepare_v2(sqlDatabase, beginString, -1, &compiledstatement, NULL);
            if (sqlite3_step(compiledstatement) == SQLITE_DONE) {}
            else DLog(@"Failed!");
            sqlite3_finalize(compiledstatement);

            DLog(@"QUERY : %@",queryString);

            const char *selectStatement = [queryString UTF8String];

            sqlite3_prepare_v2(sqlDatabase, selectStatement, -1, &compiledstatement, NULL);
            //sqlite3_bind_text(compiledstatement,1,[statusString UTF8String],-1,SQLITE_TRANSIENT);

            if (sqlite3_step(compiledstatement) == SQLITE_DONE) {}
            else DLog(@"Failed!");
            sqlite3_finalize(compiledstatement);


            const char* endString="END;";
            sqlite3_prepare_v2(sqlDatabase, endString, -1, &compiledstatement, NULL);
            if (sqlite3_step(compiledstatement) == SQLITE_DONE) {}
            else DLog(@"Failed!");
            sqlite3_finalize(compiledstatement);

            sqlite3_close(sqlDatabase);
        }
        else DLog(@"Failed to open table");
    }
}

NSString *queryString;
queryString = @"SELECT * FROM frases";
[self readDB:queryString];

これがお役に立てば幸いです...データベースを閉じることを忘れないでください(sqlite3_close(sqlDatabase);)。

于 2013-02-26T18:09:36.057 に答える