0

元々自動インクリメントで設定されておらず、すでに数百のレコードがあるSQLiteデータベースで次に高いPKを取得しようとしています。それで、私はそれがうまくいくように思われる以下の方法を作りました、しかし私はこれから何の結果も得ることができません。データベースからデータを取得する方法は他にもいくつかありますが、何が間違っているのか理解できず、目を細めてしまうので、助けを求めたいと思いました。

- (NSInteger)getNextSubjectId {

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

    FMDatabase *database = [FMDatabase databaseWithPath:appDelegate.getDBPath];    
    [database open];

    FMResultSet *rst = [database executeQuery:@"select max(subject_id) + 1 AS SUBJECT_ID from SUBJECT"];

    NSLog(@"PRINT FIRST SUBJECT_ID = %@", [rst stringForColumnIndex:0]);

    NSString *nextSubId = [rst stringForColumnIndex:0];
    [database close];

    NSLog(@"NEW SUBJECT_ID = %@", nextSubId);


    NSInteger myInt = [nextSubId intValue];

    return myInt;

    //    [maxSubjectId release];

}

ログは次のことを示しています。

2012-01-25 22:56:29.398引用符[6992:f803] PRINT FIRST SUBJECT_ID =(null)(gdb)

ヘッダーは次のようになります。

//  Subject.h
//  DrillDownApp

#import <UIKit/UIKit.h>

@interface Subject : NSObject {
    NSInteger subject_id;
    NSString *category_title;
    NSString *title;
    BOOL isDirty;

}

- (id) initWithPrimaryKey:(NSInteger)pk;
- (void) addSubject;
- (NSInteger)getNextSubjectId;

@property (nonatomic, readwrite) BOOL isDirty;
@property (nonatomic, readonly) NSInteger subject_id;
@property (nonatomic, retain) NSString * title;
@property (nonatomic, retain) NSString * category_title;

@end
4

2 に答える 2

1

FMDBドキュメントから:

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

stringForColumnIndexを呼び出す前に、最初に次のメソッドを呼び出すだけです。

于 2012-01-26T14:47:46.743 に答える
0

最初の呼び出し[最初の次へ]

また、あなたsubject_id文字列であり、intではありませんか?

そして最後に、あなたが使用できるかどうかを見ましたかlastInsertRowID

私はこのように使用します:

int lastRow = [[self getDatabase]lastInsertRowId];
于 2012-01-26T14:50:23.997 に答える