0

我正在尝试编写两个应用程序(iphone 和桌面)来实现以下链接中描述的内容:

核心数据是否有可能构建一个桌面应用程序来创建数据模型换一个

行。所以我创建了一个非常简单的桌面应用程序,它有一个名为 Client 的实体和一个名为 name 的字符串属性字段。我还生成了相应的 Model 类。

我已经运行了应用程序,在列表中添加了几个客户端名称并保存了文件(作为 Testing.sqlite)。

现在在我等效的 iphone 应用程序中,我正在尝试加载文件。我最初使用其中一个应用程序模板生成了该应用程序,并包含了 Core Data。注意:我已经镜像了 Client 实体并生成了相应的 Model 类。

我进入了我的“应用程序委托”类并修改了 persistentStoreCoordinator 方法以引用我的“Testing.sqlite”文件,即

    NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"Testing.sqlite"]];

我还将保存的桌面应用程序文件复制到预期的位置,即

~/Library/Application Support/IPhone Simulator/User/... etc.

所以现在理论上至少两个应用程序中的每一个都应该是相同的。

但是,当我尝试从中加载数据时,它似乎总是空的。我的代码看起来有点像这样:

    // fetch the delegate.
TestingAppDelegate *app = (TestingAppDelegate *)[[UIApplication sharedApplication] delegate];
NSManagedObjectContext *managedObjectContext = [app managedObjectContext];

// construct the request.
NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Client" inManagedObjectContext:managedObjectContext]; 
[request setEntity:entity]; 

// execute the request.
NSError *error;
NSArray *results = [managedObjectContext executeFetchRequest:request error:&error];

if (results == nil) { 
    // Handle the error.        
    NSLog(@"No data loaded");
} 

NSLog(@"Returned: %@", results);    

// finally release  
[results release]; 
[request release]; 

我似乎无法弄清楚出了什么问题。任何提示或建议将不胜感激。

当我在调试时查看persistanceStoreCoordinator、managedObjectContext、结果数组(NSArray)的实例时,我可以看到它似乎包含所有这些的0条记录。所以我很困惑。

注意:Testing.sqlite 文件包含条目。

在此先感谢,马特

4

1 回答 1

0

使用 Core Data 时,简单地复制 sqlite 数据库文件是行不通的。您需要完全复制您在桌面应用程序中创建的持久存储。

但是,这可能是与 Core Data 没有看到您的数据库文件这一事实相关的问题,即使您复制了它。尝试以下操作:

1)将您的数据库文件添加到资源组中的项目中 2)使用此方法实际复制您的数据库文件到位

- (NSString *) initialize_db {
    NSString *DATABASE_RESOURCE_NAME = @"testing";
    NSString *DATABASE_RESOURCE_TYPE = @"sqlite";
    NSString *DATABASE_FILE_NAME = @"testing.sqlite";

    // copy the database from the bundle if necessary
    // look to see if DB is in known location (~/Documents/$DATABASE_FILE_NAME)


    NSArray *searchPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentFolderPath = [searchPaths objectAtIndex: 0];
        NSString *dbFilePath = [documentFolderPath stringByAppendingPathComponent: DATABASE_FILE_NAME];
        [dbFilePath retain];

        if (! [[NSFileManager defaultManager] fileExistsAtPath: dbFilePath]) {
            // didn't find db, need to copy
            NSString *backupDbPath = [[NSBundle mainBundle]
                                      pathForResource:DATABASE_RESOURCE_NAME
                                      ofType:DATABASE_RESOURCE_TYPE];
            if (backupDbPath == nil) {
                // couldn't find backup db to copy, bail
                NSLog (@"couldn't init db");
                return NULL;
            } else {
                BOOL copiedBackupDb = [[NSFileManager defaultManager]
                                       copyItemAtPath:backupDbPath
                                       toPath:dbFilePath
                                       error:nil];
                if (! copiedBackupDb) {
                    // copying backup db failed, bail
                    NSLog (@"couldn't init db");
                    return NULL;
                }
            }
        }


        return dbFilePath;

    }

复制数据库文件后,您将返回其文件路径,并使用它来实际打开数据库。

于 2009-09-08T06:20:34.390 回答