0

初めてiPhoneでSQLiteを試しています。私が直面しているエラーは、sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK以下の ecode のステートメントが false を返し、何も表示されないことです。

以下は私のコードです:

+ (void) getInitialDataToDisplay:(NSString *)dbPath {

dbTryAppDelegate *appDelegate = (dbTryAppDelegate *)[[UIApplication sharedApplication] delegate];

if (sqlite3_open([dbPath UTF8String], &database) == SQLITE_OK) {

    const char *sql = "select name,id from studtry";
    sqlite3_stmt *selectstmt;
//below line is never executed and its else part is also not executed.
    if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) {

        while(sqlite3_step(selectstmt) == SQLITE_ROW) {

            NSInteger primaryKey = sqlite3_column_int(selectstmt, 0);
            stud *coffeeObj = [[stud alloc] initWithPrimaryKey:primaryKey];
            coffeeObj.studName = [NSString stringWithUTF8String:(char *)sqlite3_column_text(selectstmt, 0)];

            //coffeeObj.isDirty = NO;

            [appDelegate.studArray addObject:coffeeObj];
          //  [coffeeObj release];
        }
    }
}
else
    sqlite3_close(database); //Even though the open call failed, close the database connection to release all the memory.
}

どこが間違っていますか?どうすれば解決できますか?

4

3 に答える 3

0

まず、アプリケーションとシミュレーターフォルダからアプリケーションを削除します。次に、:: Practise.sqlite3(SQLite3のタイプ)という名前のデータベースを作成します

次に、コピー用に次のメソッドを記述します。

- (void) copyDatabaseIfNeeded {

   NSFileManager *fileManager = [NSFileManager defaultManager];
   NSError *error;
   dbPath = [self getDBPath];

       BOOL success = [fileManager fileExistsAtPath:dbPath];

   if(!success) {
        NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"Practise.sqlite3"];
        success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error];
   if (!success)
        NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
   }
}


- (NSString *) getDBPath {

      NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES);
      NSString *documentsDir = [paths objectAtIndex:0];

      return [documentsDir stringByAppendingPathComponent:@"Practise.sqlite3"];
}

これはいつでもコピーできます。

[self copyDatabaseIfNeeded];

次に、結果を確認します。うまくいけばうまくいくでしょう。

于 2013-01-10T07:30:06.630 に答える
0

データベース パス、データベース拡張子、および同じテーブルとフィールドも確認してください。

いずれかの方法、

const string:: を直接使用する代わりに、This を使用してください。

NSString *sqlStr = [NSString stringWithFormat:@"select name,id from studtry"];

const char *sql = [sqlStr UTF8String];

while ループの finalize ステートメントの後、

sqlite3_finalize(selectstmt);

次に、If 条件の後、

 sqlite3_close(database);

else の部分は書く必要はありません。

うまくいけば、うまくいくでしょう。ありがとう。

于 2013-01-10T06:21:48.207 に答える
0

あなたのコードによると、すべてが絶対に正しいですが、間違ったものを渡しているDBPathか、DBファイルが正しい場所にない可能性があります。この両方の点を確認して、もう一度やり直してください。

于 2013-01-10T06:32:20.493 に答える