<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>A Tasty Pixel » Blog &#187; F-Script</title>
	<atom:link href="http://atastypixel.com/blog/tag/f-script/feed/" rel="self" type="application/rss+xml" />
	<link>http://atastypixel.com/blog</link>
	<description></description>
	<lastBuildDate>Mon, 06 Feb 2012 15:08:28 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	
		<item>
		<title>Browsing Core Data databases using F-Script</title>
		<link>http://atastypixel.com/blog/browsing-core-data-databases-using-f-script/</link>
		<comments>http://atastypixel.com/blog/browsing-core-data-databases-using-f-script/#comments</comments>
		<pubDate>Sat, 10 Apr 2010 12:00:37 +0000</pubDate>
		<dc:creator>Michael Tyson</dc:creator>
				<category><![CDATA[Geekspeak]]></category>
		<category><![CDATA[Cocoa]]></category>
		<category><![CDATA[Core Data]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[F-Script]]></category>
		<category><![CDATA[Scripts]]></category>

		<guid isPermaLink="false">http://atastypixel.com/blog/?p=1887</guid>
		<description><![CDATA[F-Script's new Core Data browser lets you open up and query any Core Data database, an invaluable debugging tool. Actually opening databases is a lengthy process through.  No longer: This Applescript app provides an easy interface to quickly open a Core Data database in F-Script's object browser.]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.fscript.org/">F-Script</a>, the Cocoa-based scripting environment, now provides some great tools for exploring Core Data databases.</p>

<p>I couldn&#8217;t figure out how to easily open up my databases, other than manually creating a managed object model, then a persistent store coordinator, then a managed object context on the console.  I couldn&#8217;t find any existing tools, and I wanted a quick workflow for opening up my databases, so I put together a script that prompts for the application bundle or <code>.xcdatamodel(d)</code> data model file, then prompts for the XML (<code>.xml</code>), binary (<code>.binary</code>) or SQLite (<code>.sql</code> or anything else) database file, and opens up the inspector.</p>

<p>I wrote it as an Applescript that just calls upon F-Script to evaluate the script, and saved it in an application bundle so I can pull it up quickly.</p>

<p>Here it is:</p>

<p><a href="http://atastypixel.com/blog/wp-content/uploads/2011/11/Core-Data-Browser.zip" title="Core Data Browser.zip" alt="Core Data Browser">Core Data Browser.app</a></p>

<p><a href="http://atastypixel.com/blog/wp-content/uploads/2010/04/201004101417.jpg" rel="lightbox[1887]"><img src="http://atastypixel.com/blog/wp-content/uploads/2010/04/201004101417-tm.jpg" width="400" height="194" alt="201004101417.jpg" class="aligncenter" /></a></p>

<p>It just needs the F-Script app to be available.</p>

<p>Upon opening, the managed object context is available on the console as &#8220;<code>context</code>&#8220;. So, aside from using F-Script&#8217;s object browser, you can also do things like:</p>


<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">&gt; request <span style="color: #002200;">:=</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSFetchRequest</span> alloc<span style="color: #002200;">&#41;</span> init
&gt; request setEntity<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSEntityDescription</span> entityForName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">'MyEntity'</span> inManagedObjectContext<span style="color: #002200;">:</span>context<span style="color: #002200;">&#41;</span>
&gt; request setPredicate<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSPredicate</span> predicateWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">'type = 3'</span><span style="color: #002200;">&#41;</span>
&gt; result <span style="color: #002200;">:=</span> context executeFetchRequest<span style="color: #002200;">:</span>request error<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span>
&gt; result
_PFArray <span style="color: #002200;">&#123;</span>&lt;NSManagedObject<span style="color: #002200;">:</span> 0x2006cf740&gt; <span style="color: #002200;">&#40;</span>entity<span style="color: #002200;">:</span> MyEntity; <span style="color: #a61390;">id</span><span style="color: #002200;">:</span> 0x20064c9e0 &lt;x<span style="color: #002200;">-</span>coredata<span style="color: #002200;">:</span><span style="color: #11740a; font-style: italic;">//BAC82A67-CC41-48C2-8A96-693B67A501D6/MyEntity/p1&gt; ; data: &lt;fault&gt;), </span>
&lt;NSManagedObject<span style="color: #002200;">:</span> 0x2006bdc80&gt; <span style="color: #002200;">&#40;</span>entity<span style="color: #002200;">:</span> MyEntity; <span style="color: #a61390;">id</span><span style="color: #002200;">:</span> 0x20064c9c0 &lt;x<span style="color: #002200;">-</span>coredata<span style="color: #002200;">:</span><span style="color: #11740a; font-style: italic;">//BAC82A67-CC41-48C2-8A96-693B67A501D6/MyEntity/p2&gt; ; data: &lt;fault&gt;), </span>
&lt;NSManagedObject<span style="color: #002200;">:</span> 0x2006bc680&gt; <span style="color: #002200;">&#40;</span>entity<span style="color: #002200;">:</span> MyEntity; <span style="color: #a61390;">id</span><span style="color: #002200;">:</span> 0x200651180 &lt;x<span style="color: #002200;">-</span>coredata<span style="color: #002200;">:</span><span style="color: #11740a; font-style: italic;">//BAC82A67-CC41-48C2-8A96-693B67A501D6/MyEntity/p3&gt; ; data: &lt;fault&gt;)</span>
...</pre></div></div>


<p><strong>Update</strong>: Now has better error reporting, and the option to load classes from a bundle.</p>

<p>For those interested, here&#8217;s the original F-Script:<span id="more-1887"></span></p>


<div class="wp_syntax"><div class="code"><pre class="objc" style="font-family:monospace;">panel <span style="color: #002200;">:=</span> <span style="color: #400080;">NSOpenPanel</span> openPanel.
panel setAllowedFileTypes<span style="color: #002200;">:</span><span style="color: #002200;">&#123;</span><span style="color: #bf1d1a;">'xcdatamodel'</span>, <span style="color: #bf1d1a;">'app'</span>, <span style="color: #bf1d1a;">'framework'</span><span style="color: #002200;">&#125;</span>;setTitle<span style="color: #002200;">:</span><span style="color: #bf1d1a;">'Data model'</span>;setMessage<span style="color: #002200;">:</span><span style="color: #bf1d1a;">'Select a data model file or bundle containing a data model'</span>.
classesButton <span style="color: #002200;">:=</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSButton</span> alloc<span style="color: #002200;">&#41;</span> initWithFrame<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #2400d9;">0</span>&lt;&gt;<span style="color: #2400d9;">0</span> extent<span style="color: #002200;">:</span><span style="color: #2400d9;">200</span>&lt;&gt;<span style="color: #2400d9;">30</span><span style="color: #002200;">&#41;</span>.
classesButton setTitle<span style="color: #002200;">:</span><span style="color: #bf1d1a;">'Load classes in bundle'</span>;setButtonType<span style="color: #002200;">:</span>NSSwitchButton.
panel setAccessoryView<span style="color: #002200;">:</span>classesButton.
model <span style="color: #002200;">:=</span> <span style="color: #a61390;">nil</span>.
<span style="color: #002200;">&#91;</span>model <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span> whileTrue<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>
	error <span style="color: #002200;">:=</span> FSPointer objectPointer.
	<span style="color: #002200;">&#40;</span>panel runModal <span style="color: #002200;">=</span> NSFileHandlingPanelCancelButton<span style="color: #002200;">&#41;</span> ifTrue<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSException</span> exceptionWithName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">'CancelException'</span> reason<span style="color: #002200;">:</span><span style="color: #bf1d1a;">'Cancelled'</span> userInfo<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span> <span style="color: #a61390;">raise</span> <span style="color: #002200;">&#93;</span> .
	<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span>panel URL<span style="color: #002200;">&#41;</span> absoluteString<span style="color: #002200;">&#41;</span> hasSuffix<span style="color: #002200;">:</span><span style="color: #bf1d1a;">'xcdatamodel'</span><span style="color: #002200;">&#41;</span> ifTrue<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>
		model <span style="color: #002200;">:=</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSManagedObjectModel</span> alloc<span style="color: #002200;">&#41;</span> initWithContentsOfURL<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>panel URL<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span>
	<span style="color: #002200;">&#93;</span> ifFalse<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>
		bundle <span style="color: #002200;">:=</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSBundle</span> bundleWithURL<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>panel URL<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span>.
		<span style="color: #002200;">&#40;</span>bundle <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span> ifFalse<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>
			model <span style="color: #002200;">:=</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSManagedObjectModel</span> mergedModelFromBundles<span style="color: #002200;">:</span><span style="color: #002200;">&#123;</span>bundle<span style="color: #002200;">&#125;</span><span style="color: #002200;">&#41;</span>.
			<span style="color: #002200;">&#40;</span>model ~~ <span style="color: #a61390;">nil</span> <span style="color: #002200;">&amp;</span> <span style="color: #002200;">&#40;</span>FSBoolean booleanWithBool<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>classesButton state<span style="color: #002200;">&#41;</span> <span style="color: #002200;">=</span> NSOnState<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span> ifTrue<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>
				<span style="color: #002200;">&#40;</span>FSBoolean booleanWithBool<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>bundle loadAndReturnError<span style="color: #002200;">:</span>error<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span> ifFalse<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>
					model <span style="color: #002200;">:=</span> <span style="color: #a61390;">nil</span>.
					<span style="color: #002200;">&#40;</span><span style="color: #400080;">NSAlert</span> alertWithMessageText<span style="color: #002200;">:</span><span style="color: #bf1d1a;">'Could not load bundle'</span> defaultButton<span style="color: #002200;">:</span><span style="color: #bf1d1a;">'OK'</span> alternateButton<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span> otherButton<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span> informativeTextWithFormat<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span>error at<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span> localizedDescription<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span> runModal
				<span style="color: #002200;">&#93;</span>
			<span style="color: #002200;">&#93;</span>
		<span style="color: #002200;">&#93;</span>
	<span style="color: #002200;">&#93;</span>.
	<span style="color: #002200;">&#40;</span>model <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span> <span style="color: #002200;">&amp;</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span>error at<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span> <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span> ifTrue<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSAlert</span> alertWithMessageText<span style="color: #002200;">:</span><span style="color: #bf1d1a;">'Could not load model from file or bundle'</span> defaultButton<span style="color: #002200;">:</span><span style="color: #bf1d1a;">'OK'</span> alternateButton<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span> otherButton<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span> informativeTextWithFormat<span style="color: #002200;">:</span><span style="color: #bf1d1a;">''</span><span style="color: #002200;">&#41;</span> runModal <span style="color: #002200;">&#93;</span>
<span style="color: #002200;">&#93;</span>.
panel setAccessoryView<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span>.
store <span style="color: #002200;">:=</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSPersistentStoreCoordinator</span> alloc<span style="color: #002200;">&#41;</span> initWithManagedObjectModel<span style="color: #002200;">:</span>model<span style="color: #002200;">&#41;</span>.
panel setAllowedFileTypes<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span>; setTitle<span style="color: #002200;">:</span><span style="color: #bf1d1a;">'Database file'</span>;setMessage<span style="color: #002200;">:</span><span style="color: #bf1d1a;">'Select Core Data SQLite database'</span>.
opened <span style="color: #002200;">:=</span> <span style="color: #a61390;">nil</span>.
<span style="color: #002200;">&#91;</span>opened <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#93;</span> whileTrue<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>
	<span style="color: #002200;">&#40;</span>panel runModal <span style="color: #002200;">=</span> NSFileHandlingPanelCancelButton<span style="color: #002200;">&#41;</span> ifTrue<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSException</span> exceptionWithName<span style="color: #002200;">:</span><span style="color: #bf1d1a;">'CancelException'</span> reason<span style="color: #002200;">:</span><span style="color: #bf1d1a;">'Cancelled'</span> userInfo<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span> <span style="color: #a61390;">raise</span> <span style="color: #002200;">&#93;</span> .
	type <span style="color: #002200;">:=</span> NSSQLiteStoreType.
	<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span>panel URL<span style="color: #002200;">&#41;</span> absoluteString<span style="color: #002200;">&#41;</span> lowercaseString<span style="color: #002200;">&#41;</span> hasSuffix<span style="color: #002200;">:</span><span style="color: #bf1d1a;">'xml'</span><span style="color: #002200;">&#41;</span> ifTrue<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>type <span style="color: #002200;">:=</span> NSXMLStoreType<span style="color: #002200;">&#93;</span>.
	<span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span>panel URL<span style="color: #002200;">&#41;</span> absoluteString<span style="color: #002200;">&#41;</span> lowercaseString<span style="color: #002200;">&#41;</span> hasSuffix<span style="color: #002200;">:</span><span style="color: #bf1d1a;">'binary'</span><span style="color: #002200;">&#41;</span> ifTrue<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span>type <span style="color: #002200;">:=</span> NSBinaryStoreType<span style="color: #002200;">&#93;</span>.
	error <span style="color: #002200;">:=</span> FSPointer objectPointer.
	opened <span style="color: #002200;">:=</span> <span style="color: #002200;">&#40;</span>store addPersistentStoreWithType<span style="color: #002200;">:</span>type configuration<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span> URL<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span>panel URL<span style="color: #002200;">&#41;</span> options<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span> error<span style="color: #002200;">:</span>error<span style="color: #002200;">&#41;</span>.
	<span style="color: #002200;">&#40;</span>opened <span style="color: #002200;">==</span> <span style="color: #a61390;">nil</span><span style="color: #002200;">&#41;</span> ifTrue<span style="color: #002200;">:</span><span style="color: #002200;">&#91;</span> <span style="color: #002200;">&#40;</span><span style="color: #400080;">NSAlert</span> alertWithMessageText<span style="color: #002200;">:</span><span style="color: #bf1d1a;">'Could not load database'</span> defaultButton<span style="color: #002200;">:</span><span style="color: #bf1d1a;">'OK'</span> alternateButton<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span> otherButton<span style="color: #002200;">:</span><span style="color: #a61390;">nil</span> informativeTextWithFormat<span style="color: #002200;">:</span><span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span>error at<span style="color: #002200;">:</span><span style="color: #2400d9;">0</span><span style="color: #002200;">&#41;</span> localizedDescription<span style="color: #002200;">&#41;</span><span style="color: #002200;">&#41;</span> runModal <span style="color: #002200;">&#93;</span>
<span style="color: #002200;">&#93;</span>.
context <span style="color: #002200;">:=</span> <span style="color: #002200;">&#40;</span><span style="color: #002200;">&#40;</span><span style="color: #400080;">NSManagedObjectContext</span> alloc<span style="color: #002200;">&#41;</span> init<span style="color: #002200;">&#41;</span>.
context setPersistentStoreCoordinator<span style="color: #002200;">:</span>store.
context inspectWithSystem<span style="color: #002200;">:</span>sys</pre></div></div>

 <img src="http://atastypixel.com/blog/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=1887" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://atastypixel.com/blog/browsing-core-data-databases-using-f-script/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
	</channel>
</rss>

