Archive for July 2009

Core Data Error: Can’t Find Model for Source Store

July 29, 2009

Well, I’m still learning how Core Data works and how it works with iPhone OS 3.0. The following displays how I was able to resolve an error running an app using Core Data and a pre-populated SQLite database. The error gives the reason as “Can’t find model for source store”.

1. Create a new SQLite database with the following tables and columns.

Table

Column

ZFriends
FirstName
LastName
Z_METADATA
Z_VERSION (Int Primary Key)
Z_UUID (VARCHAR(255))
Z_PLIST (BLOB)
Z_PRIMARYKEY
Z_ENT (Int Primary Key)
Z_NAME (VARCHAR)
Z_SUPER (INTEGER)
Z_MAX (INTEGER)

ZFriends is an example of the pre-populated table with the columns (or attributes) FirstName and LastName. Z_METADATA and Z_PRIMARYKEY are the tables necessary for Core Data functionality.

2. Create the Data Model (xcdatamodel file) in XCode.

image

a. Create the Entity (Table Name without the leading ’Z’).

b. Create the attributes (Columns).

Using a Pre-Populated SQLite Database with Core Data on iPhone OS 3.0

July 13, 2009

I was recently re-writing a yet to be published iPhone app to use Core Data with a pre-populated SQLite database. I was able to get the app to function with a new database using the CoreDataBooks sample code as a reference but could not get the app to read a pre-populated database added to the project.

After many hours of troubleshooting, I discovered differences in the pre-populated database and a Core Data created SQLite database. The pre-populated database consisted of just my simple 1 table structure and the Core Data created SQLite database consisted of “extra ‘Z’ tables’ For example: Z_METADATA, I searched the Internet and Apple docs but could not find a utility or any other way to convert or prep a pre-populated SQLite database for use with Core Data.

Right or wrong. Here’s what I finally did (NOTE: All the ‘coding’ is based on the CoreDataBooks sampe):

In XCode:

1. Ensure the CoreData framework is added to your project.

image

** If creating a new project, check the ‘Use Core Data for storage’ option when selecting a template.

image

2. Create the Data Model file (xcdatamodel) if not already created.

a. Click File | New File.

b. Choose iPhone OS | Resource | Data Model

image

c. Click Next, name the file and click Next again.

d. If the model class is already created, select it from   the  next window. You can create it later if it isn’t created already.

image

2. Add an Entity (table name) and bind it to the class.

a. Click Design | Data Model | Add Entity

b. Rename Entity to the table name you wish to create and change the Class to the desired class name.

image

3. Create the Attributes (columns).

a. Click Design | Data Model | Add Attribute

b. Rename newAttribute to the desired column name and set the type.

image

c. Repeat step b for each additional attribute.

image

4. Set the name of the SQLite database name and location in the AppDelegate.m file (Please refer to the CoreDataBooks sample code for further info).

– (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator != nil) {
return persistentStoreCoordinator;
}
NSString *storePath = [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @”CoreData.sqlite”];
/*
Set up the store.
For the sake of illustration, provide a pre-populated default store.
*/
NSFileManager *fileManager = [NSFileManager defaultManager];
// If the expected store doesn’t exist, copy the default store.
if (![fileManager fileExistsAtPath:storePath]) {
NSString *defaultStorePath = [[NSBundle mainBundle] pathForResource:@”CoreData” ofType:@”sqlite”];
if (defaultStorePath) {
[fileManager copyItemAtPath:defaultStorePath toPath:storePath error:NULL];
}
}

NSURL *storeUrl = [NSURL fileURLWithPath:storePath];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];

NSError *error;
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
// Update to handle the error appropriately.
NSLog(@”Unresolved error %@, %@”, error, [error userInfo]);
exit(-1);  // Fail
}
return persistentStoreCoordinator;
}

5. Build and Run the app.

In Finder:

1. Use Spotlight to search for the SQLite database created by the app in the iPhone Simulator. This is /Users/<Username>/Library/Application Support/iPhone Simulator/User/Application/<Application GUID>/Documents/<database name.sqlite>

2. Copy that database to a working folder.

3. Populate that database.

4. Add the populated database to the project.

I hope this helps! If anyone has a better or preferred way of formatting a SQLite database for use with Core Data, please let me know.

WatchGuard x550e: Upgrade from a WatchGuard x500

July 6, 2009

With WatchGuard dropping the support on the WatchGuard x500 Firebox product in September 2009 you may find yourself configuring a new WatchGuard. We recently purchased a WatchGuard Firebox Core x550e. There is good news and bad new.

The bad news: You cannot use the config backup file from the x500 to configure the x550e. 😦

The good news: After you run the setup wizard to configure the x550e Firebox, you can configure the firewall policy with a backup (XML file) from the x550. Here’s the steps:

1.On the x500 Policy Manager, click File | Backup and save the backup to an XML file.

2. On the x550e Policy Manager, click File | Restore and load the XML from step 1.

3. On the x550e Policy Manager, click Network | Configuration and click Yes to the message concerning whether you want to change from a 6 interface Firebox to a 4 interface Firebox. If you don’t do this, you will receive a DATA_ERROR concerning the interfaces when attempting to save the the firebox in the next step.

4. On the x550e Policy Manager, click File | Save > To Firebox.

5. You should know have the policies from the x500 on the new x550e Firebox.

WatchGuard Firebox x550e Factory Default

July 6, 2009

I recently found myself with the need to set a WatchGuard Firebox x550e to the factory default. If you’ve ever had to do this for any WatchGuard Firebox product you know there are different procedures depending upon which Firebox you have. This WatchGuard support article details how to do a factory default of a Firebox X Core or Peak e-Series and non e-Series.