0

私は常にこのコードを使用して iPhone アプリケーションで sqlite db を開きますが、iOS6 ではこのコードが機能しません。関数: sqlite3_prepare_v2 は失敗しますが、理由がわかりません!

また、sqlite db の名前「gamer.sqlite」を、存在しないファイルの別の名前に変更しようとすると、関数「sqlite3_open」が再び SQLITE_OK 値を返す理由もわかりません。

これは私のコードです:

-(NSMutableArray*)view_table
{
    const char *sql;

    NSMutableArray *content=[[NSMutableArray alloc] initWithObjects:nil];
    [self msgbox:@"eseguo"];
    /*elementi da visualizzare nella tabella*/
    if(sqlite3_open([databasePath  UTF8String],&database)==SQLITE_OK)
    {
            [self msgbox:@"opened"];
        sql = "SELECT * FROM  list_gamer";
        if (sqlite3_prepare_v2(database,sql, -1, &selectstmt, NULL) == SQLITE_OK)
        {
              [self msgbox:@"query eseguita"];
            while(sqlite3_step(selectstmt) == SQLITE_ROW)
            {
                [content addObject:[NSString stringWithFormat:@"%s",sqlite3_column_text(selectstmt,0)]];
            }
        }
    }

    return content;

}


- (void)viewDidLoad{
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [documentPaths objectAtIndex:0];
    databasePath = [[documentsDir stringByAppendingPathComponent:@"gamer.sqlite"] copy];

    if(![[NSFileManager defaultManager] fileExistsAtPath:databasePath])
    {
        NSFileManager *fileManager = [NSFileManager defaultManager];
        int success = [fileManager fileExistsAtPath:databasePath];
        if(success)
        {
            [fileManager removeItemAtPath:databasePath error:nil];
            return;
        }

        NSString *databasePathFromApp = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"gamer.sqlite"];

        // Copy the database from the package to the users filesystem
        [fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];


        documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        documentsDir = [documentPaths objectAtIndex:0];
    }

 [super viewDidLoad];
}

- (void)didReceiveMemoryWarning{
    [super didReceiveMemoryWarning];

}

-(IBAction)start_game:(id)sender{
    self.view=frmgame;
    [self view_table];
}
4

1 に答える 1

0

正確な答えではありませんが、個人的には fmbd を使用して sqlite とエラーを管理するのが大好きです。

Fmdb は SQLite の Objective-C ラッパーです: http://sqlite.org/

https://github.com/ccgus/fmdb

于 2013-03-29T23:28:28.507 に答える