1

ドキュメントディレクトリからsqliteデータベースを開こうとしています:

NSString *docDir = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
NSString *dbFileName = [docDir stringByAppendingPathComponent:@"DatabaseName.sqlite"];

self.db = [FMDatabase databaseWithPath:dbFileName];

self.db.logsErrors = YES;

self.db = _db;
if ([self.db open]) {
    NSLog(@"database opened");

}
NSLog(@"docDir = %@",[NSString stringWithFormat:@"%@%@",docDir,dbFileName]);

NSLogは、の代わりに奇妙なパスdocDir=を示しています。開いている間、エラーや警告はありません。/Users/userName/Documents/Users/userName/Documents/DatabaseName.sqlite/Users/userName/Documents/DatabaseName.sqlite

この後、テーブルからcount(*)を取得しようとしました

NSString *queryString = [NSString stringWithFormat:@"SELECT count(*) FROM histories"];
FMResultSet *result = [self.db executeQuery:queryString];
NSLog(@"count = %i", [result intForColumnIndex:0]);

データベースには10k行の場合はさらに多くなりますが、NSLogには0が表示されます。アプリケーションはiOS用ではなく、コマンドラインのみです。問題はどこにありますか?

4

1 に答える 1

2

あなたが持っている

docDir = /Users/userName/Documents
dbFileName = /Users/userName/Documents/DatabaseName.sqlite

したがって、

NSLog(@"docDir = %@",[NSString stringWithFormat:@"%@%@",docDir,dbFileName]);

docDir2回印刷されます(dbFileNameすでに含まれていますdocDir)。

備考:ステートメントself.db = _db;は疑わしいようです。削除することをお勧めします。

追加: FMDBのドキュメントには次のように記載されています。

-[FMResultSet next]期待している値が1つしかない場合でも、クエリで返された値にアクセスする前に、必ず呼び出す必要があります。

したがって、コードはおそらく次のようになります。

FMResultSet *result = [self.db executeQuery:queryString];
if ([result next]) {
    NSLog(@"count = %i", [result intForColumnIndex:0]);
}
于 2012-11-03T12:39:54.173 に答える