CoreData SQLite questions

Discussion in 'Mac Programming' started by cromestant, Jan 31, 2009.

  1. macrumors member

    Joined:
    Apr 27, 2006
    Messages:
    56
    #1
    Hello, i m fiddling with CoreData now, with bindings and such, and its quite interesting to have all done for you ( used to coding with much less help form IDE and frameworks...)

    Now my question is in regards to sqlite and the modeling tool.

    First of all i limited the type of storage to sqlite, so i m sure its that.

    Now i need to create a field in my entities that is autonumerical, which means it automatically increments itself on each insert , is this possible? how would i go about doing this?

    Because i m confused as to how this works, i have this set up :
    Client entity, with name, telephone and IdNumber.
    then i have a Bill entity
    which has :
    client ( relationship), date, control number

    now this works fine, with an interface i am able to add new clients and on another interface i m able to add new bills and list the clients etc..

    the question is , how does Coredata manage the relationship? what exactly does he put in the client relationship on the Bill entity? there is no ID, nothing unique.

    What i 'd like is to be able to define certain fields as unique keys and even autonumeric.

    there is the "indexed" box, but i m still not sure about exactly what the means.

    well if you' ve gotten this far, thanks for reading, and hope you can clear this up for me.

    Charles.
     
  2. macrumors member

    Joined:
    Apr 27, 2006
    Messages:
    56
    #2
    Ok, so looking directly into the sqlite file created i can see that there is an index, i am wondering as to how to access it programatically,

    something along the lines of finding the next index or something...

    I need to be able to see the index and set the starting number etc..
     
  3. macrumors member

    Joined:
    Jan 31, 2005
    Messages:
    58
    Location:
    Sweden
    #3
    The 'indexed' property just means that the field is indexed. It has nothing to do with autoincremented attributes, which Core Data sadly lacks.

    To emulate that feature you can override 'awakeFromInsert' and perform a fetch to find the highest existing value. Take care not to fetch anything that might include 'self', because this may or may not cause your program to behave unreliably.
     
  4. macrumors G4

    Joined:
    Jan 5, 2006
    Messages:
    11,012
    Location:
    Redondo Beach, California
    #4
    I don't know much about Core Data but do watch out for concurrency. Think about if two copies of your program are running at the same time. The querry and insert needs to by done as an atomic operation.

    In SQL one would use a sub-query like this fragment: "insert ... values( 1+select max(foobar).."
     
  5. macrumors member

    Joined:
    Apr 27, 2006
    Messages:
    56
    #5
    Yes, thanks to both of you.

    First off, no need to worry about concurrency this program might be used, but it will not be used in a big environment, its mostly a favour to my brother so that he can maintain his clients inorder.

    Thanks for the awakeFromInsert i ll give it a try i d though maybe to calculate the value on the awake from Nib method so that i could fill it in directly with the bindings.

    i ll give this a try
    too bad there is nothing like autonumeric in coredata... sucks..
     
  6. macrumors member

    Joined:
    Apr 27, 2006
    Messages:
    56
    #6
    how can I do to make a fetch to get the highest value?

    I ve tried to find it online but can t seem to find the way to do it.

    thanks again

    charles.
     
  7. macrumors newbie

    Joined:
    Jan 7, 2009
    Messages:
    14
    #7
    Check out NSSortDescriptor's initWithKey:ascending: and then setSortDescriptors: on your fetch request.

     

Share This Page