0

私はフェッチデータを常に同じ順序で取得しようとしています。これは、要求するたびに別の並べ替えられた配列を取得するため、ID で並べ替えようとしていますが、できませんでした。

私の状況:私は2つのモデルを持っています.FORMとFORMCOMPONENT 1つのFORMには、これを行うと多くのFORMCOMPONENTがあります

Form *form = ...;
[form formComponents]; //I get all the components but each time I run I get with a differente order

ORDER のフィールドがない場合、これをどのように注文すると思いますか? Androidでは、IDでこれを行いました..そのため、この提案にはフィールドがありません。

sortWithComparator を使用して配列で注文しようとしましたが、番号 ID を取得することが許可されていないため、これを行うことはできません (彼が [obj objectID] で指定した文字列全体ではなく、番号のみ)。sqlite3 を使用してデータベースを表示すると、そこに番号しか表示されないため、これは面白いです。

私が考えた別の方法は、次のように、FORM コンポーネント ([form formComponents]) ではなく、新しいリクエストで FORMCOMPONENT を直接取得することです。

AppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

NSEntityDescription *entity = [NSEntityDescription entityForName:@"FormComponent" inManagedObjectContext:[appDelegate managedObjectContext]];
NSFetchRequest *request = [[NSFetchRequest alloc] init];
[request setEntity:entity];
//SOME PREDICATE WITH THE FORM
[request setPredicate:predicate];
NSError *error = nil;
NSMutableArray *arrayComps = (NSMutableArray*) [[appDelegate managedObjectContext] executeFetchRequest:request error:&error];

それで、誰かアイデアがありますか?ありがとう。

- - 編集 - -

PS: 注文用に別のフィールドを作成する問題を回避したくありません。他に解決策がない場合は、これを行います。

4

5 に答える 5

2

Core Data は、並べ替えに使用できる SQL スタイルの数値 ID を一切公開しません。ソートする属性を追加したくない場合、最も簡単な方法は、この関係を順序付きとして構成することです。次にNSOrderedSet、リレーションシップの を取得し、個々のインスタンスを任意の順序で保持できます。Core Data モデル エディターで順序付けされた関係をmutableOrderedSetValueForKey:作成し、その関係に新しいインスタンスを追加する場合に使用します。

于 2013-05-07T22:48:09.680 に答える
2

コアデータはデータベースではありません。

もちろん、Core Data は内部的に PK を使用します。しかし、Core Data はデータベースではなく、グラフをモデル化するためのシステムです。したがって、「ID情報」は公開されません。ID を探すのは反概念的です。

データに「自然な順序」がない場合、ランダムな順序を取得しても問題はありません。自然な順序の場合は、単純にソート記述子を使用してください。

注文の「作成日」が必要な場合は、プロパティ creationDate を追加して -awakeFromInsert に設定します。(ところで:私の知る限り、PKが常に発生するのは都市伝説です。PKは自動インクリメント以外のものになる可能性があります。)

于 2013-05-07T20:29:33.833 に答える
1

コンポーネントに付与する ID/並べ替え順序のフィールドを追加することをお勧めします。

または、CoreData エディターでチェックボックスをオンにして関係を順序付けることもできます。これにはオーバーヘッドが多少かかりますが、コンポーネントを複数のリストに表示する必要がある場合の唯一のオプションです。

SQLite を直接操作するのは賢明な方法ではありません。

于 2013-05-10T16:47:04.423 に答える
-2

助けてくれてありがとう。探しているものが見つかりました (たとえば、これで注文できます) SQL から直接 PK を取得する必要があります。誰かがこれを行う必要がある場合は、ここにコードがあります: 友人のトムが言ったことを忘れないでください:コアデータの仕組みではありません」

-(NSMutableArray*) readDatabase {
    NSLog(@"READ");
    sqlite3 *database;

    NSMutableArray *components = [[NSMutableArray alloc] init];
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDir = [documentPaths objectAtIndex:0];
    NSString *databasePath = [documentsDir stringByAppendingPathComponent:@"Model.sqlite"];
    // Open the database from the users filessytem
    if(sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK) {
        NSLog(@"SQLITE_OK");
        // Setup the SQL Statement and compile it for faster access
        const char *sqlStatement = "select * from zformcomponent";
        sqlite3_stmt *compiledStatement;
        if(sqlite3_prepare_v2(database, sqlStatement, -1, &compiledStatement, NULL) == SQLITE_OK) {
            // Loop through the results and add them to the feeds array
            while(sqlite3_step(compiledStatement) == SQLITE_ROW) {
                // Read the data from the result row
                int aPK = sqlite3_column_int(compiledStatement, 0);
                //NSString *aDescription = [NSString stringWithUTF8String:    (char *)sqlite3_column_text(compiledStatement, 2)];
                //NSString *aImageUrl = [NSString stringWithUTF8String:(char *)sqlite3_column_text(compiledStatement, 3)];
                NSLog(@"PK: %d",aPK);
                //Animal *animal = [[Animal alloc] initWithName:aName description:aDescription url:aImageUrl];
                //[animals addObject:animal];
            }
        }
        sqlite3_finalize(compiledStatement);

    }
    sqlite3_close(database);

    return components;
}
于 2013-05-10T16:38:11.917 に答える