-2

私はiOS開発に本当に慣れていません。私が今やろうとしているのは、既存のsqliteデータベースを開き、そこからデータを選択することです。ソースをデバッグして、データベースを開くことが成功したことを確認します(* databaseポインターがnilではないため、成功したと思います)。しかし、sqlite3_prepare_v2()を使用してselectクエリを初期化すると、常に「NosuchtablePeople」というエラーが表示されます。私はパスをチェックしました:

〜/ライブラリ/アプリケーションサポート/iphoneシミュレータ/6.0/アプリケーション//。

データベースは正常にコピーされました。データベースを開いて、そこにあるデータを確認できます。

データベースをコピーして開くためのコードは次のとおりです。

- (NSString*) getDatabasePath{
    //Search for standard documents using NSSearchPathForDirectoriesInDomains
    //First Param = Searching the documents directory
    //Second Param = Searching the Users directory and not the System
    //Expand any tildes and identify home directories.
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
    NSString *documentsDir = [paths objectAtIndex:0];
    return [documentsDir stringByAppendingPathComponent:@"data.sqlite"];
}

- (void)copyDatabaseToDocument {
    //Using NSFileManager we can perform many file system operations.
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSString *dbPath = [self getDatabasePath];
    BOOL success = [fileManager fileExistsAtPath:dbPath];

    if(!success) {

        NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"data.sqlite"];
        success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error];

        if (!success)
            NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
    }
}

- (sqlite3*)openDatabaseConnection {
    sqlite3 *database;
    NSString * path = [self getDatabasePath];

    if (sqlite3_open([path UTF8String], &database) != SQLITE_OK) {
        sqlite3_close(database);
        NSAssert1(0, @"Failed to open database with message '%s'.", sqlite3_errmsg(database));
    }
    return database;
}

そして、これがデータを選択するための私のコードです。エラーは次の行で発生します。 sqlite3_prepare_v2(database, query, -1, &selectStatement, NULL)

- (People*) getPeople{
    sqlite3 *database = [[[DBConnector alloc] init] openDatabaseConnection];
    if(database == nil)
        return nil;
    sqlite3_stmt *selectStatement;
    NSString *rawquery      = @"select * from people";
    const char *query       = [rawquery UTF8String];
    NSMutableArray* result = [[NSMutableArray alloc] init];

    if (sqlite3_prepare_v2(database, query, -1, &selectStatement, NULL) == SQLITE_OK) {
        while (sqlite3_step(selectStatement) == SQLITE_ROW) {

            //Parse the data by calling a private method:
            People *people = [self parsePeopleWithStatement:selectStatement];

            [result addObject:people];
        }
    }else{
        NSAssert1(0, @"Error: '%s'.", sqlite3_errmsg(database));
    }
    sqlite3_finalize(selectStatement);
    return result;

}

私の間違いを知っているかどうか教えてください。

ありがとう。

4

1 に答える 1

1

私は自分で問題を解決しました。アプリをデバッグすると、メソッドを呼び出さず、applicationDidFinishLaunchingメソッドを呼び出していることがわかりapplicationDidFinishLaunchingWithOptionsます。メソッドにを呼び出すコードを配置するだけcopyDatabaseToDocumentで、機能します。applicationDidFinishLaunchingWithOptionsこれが私のDelegateクラスのコードです:

//THIS METHOD WAS NOT CALLED
- (void)applicationDidFinishLaunching:(UIApplication *)application{
    DBConnector *connector = [[DBConnector alloc] init];
    [connector copyDatabaseToDocument];
}

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
       self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];

       //SHOW MY SCREEN
        (...)

       self.window.backgroundColor = [UIColor whiteColor];
       [self.window makeKeyAndVisible];
       return YES;
}

ちなみに、これは本当の答えの同期ではないと思います。なぜ私のアプリがapplicationDidFinishLaunching()で起動しなかったのかわかりません。ご存知の方は説明をお願いします。

ありがとう。

于 2012-12-09T12:14:15.860 に答える