Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>It isn't very difficult to use CoreData in MonoTouch. You need to generate the mom using momc.exe. I have successfully done it.</p> <p>If you place the file on the top level of the application directory (maybe other locations will work too) and you set the build action to "BundleResource" (possibly other actions work too). Instantiating a UIManagedDocument will cause CoreData to automatically pick up the mom file, so you won't need to create it yourself, plus you gain the advantage of iCloud support.</p> <p>You will have to generate the class files yourself. It should be easy to write a script that can read off a xcdatamodel file and spit out the C#. This is an example of how it should look.</p> <pre><code>public partial class Photographer : NSManagedObject { public static NSString NameKey = (NSString) "name"; public static NSString PhotosKey = (NSString) "photos"; public Photographer(IntPtr handle) : base(handle) { } public string Name { get { return (NSString) Runtime.GetNSObject(ValueForKey(NameKey)); } set { SetValueForKey(value, NameKey); } } public NSSet Photos { get { return (NSSet) Runtime.GetNSObject(ValueForKey(PhotosKey)); } set { SetValueForKey(value, PhotosKey); } } void SetValueForKey(string value, NSString key) { base.SetValueForKey((NSString)(value ?? ""), key); } public static Photographer InsertNewObject(NSManagedObjectContext context) { return (Photographer) NSEntityDescription.InsertNewObjectForEntityForName("Photographer", context); } public static Photographer WithName(string name, NSManagedObjectContext context) { Photographer photographer = null; // This is just like Photo(Flickr)'s method. Look there for commentary. if (name.Length &gt; 0) { var request = new NSFetchRequest("Photographer") { SortDescriptors = new[] {new NSSortDescriptor("name", true, new Selector("localizedCaseInsensitiveCompare:"))}, Predicate = NSPredicate.FromFormat("name = %@", new NSObject[] {(NSString) name}) }; NSError error; var matches = context.ExecuteFetchRequest(request, out error); if (matches == null || matches.Length &gt; 1) { // handle error } else if (matches.Length == 0) { photographer = InsertNewObject(context); photographer.Name = name; } else { photographer = (Photographer) matches.First(); } } return photographer; } } public partial class Photo : NSManagedObject { public static NSString ImageUrlKey = (NSString) "imageURL"; public static NSString TitleKey = (NSString) "title"; public static NSString UniqueKey = (NSString) "unique"; public static NSString SubtitleKey = (NSString) "subtitle"; public static NSString WhoTookKey = (NSString) "whoTook"; public Photo (IntPtr handle) : base (handle) { } public string ImageUrl { get { return (NSString)Runtime.GetNSObject(ValueForKey(ImageUrlKey)); } set { SetValueForKey(value, ImageUrlKey); } } public string Subtitle { get { return (NSString)Runtime.GetNSObject(ValueForKey(SubtitleKey)); } set { SetValueForKey(value, SubtitleKey); } } public string Title { get { return (NSString)Runtime.GetNSObject(ValueForKey(TitleKey)); } set { SetValueForKey(value, TitleKey); } } public string Unique { get { return (NSString)Runtime.GetNSObject(ValueForKey(UniqueKey)); } set { SetValueForKey(value, UniqueKey); } } public Photographer WhoTook { get { return (Photographer)Runtime.GetNSObject(ValueForKey(WhoTookKey)); } set { SetValueForKey(value, WhoTookKey); } } void SetValueForKey(string value, NSString key) { base.SetValueForKey((NSString) (value??""), key); } public static Photo InsertNewObject(NSManagedObjectContext context) { return (Photo) NSEntityDescription.InsertNewObjectForEntityForName("Photo", context); } public UIImage Image { get { if (string.IsNullOrEmpty(ImageUrl)) return null; var imageData = NSData.FromUrl(new NSUrl(ImageUrl)); if (imageData == null) return null; return new UIImage(imageData); } } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload