Data is not saved in master data

I am using Xcode 5 compiling exclusively for iOS 7.

I am reading data from a txt file in UTF8 to populate the main data object. After reading the data, I will write it to the console. There is data. I populate the object and register the entity in the console. I keep it. There is no mistake. Without crashing.

I see 3 files on the device:

  • Mydatabase.sqlite
  • MyDatabase.sqlite
  • MyDatabase.sqlite-wali

When the application starts and MyDatabase.sqlite is created empty, it has 40 kb. At this point, the shm file is 32kb and the wal file is zero.

After I write the data to the database, the wal files will increase to 1.7 MB, but the other two files retain their initial sizes or, in other words, the data is not saved in the database. I confirmed this by checking the sqlite file with an external database viewer.

This is the code I'm using:

 // NSArray *arrayOfYears = ... // this contains an array of numbers read from the CSV file // at this point the array contains numbers in text format // NSArray *arrayOfBrands = ... // this is an array of brands for (int i=0; i<[arrayOfBrands count]; i++) { Cars *car = [NSEntityDescription insertNewObjectForEntityForName:@"Cars" inManagedObjectContext:context]; car.brand = [arrayOfBrands objectAtIndex:i]; car.year = [NSNumber numberWithInt:[[arrayOfYears objectAtIndex:i] integerValue]]; NSError *error = nil; if (![context save:&error]) { // Handle the error. NSLog(@"error = %@", error); } } 

It does not cause errors or failures. It seemed like a salvation. I increased the debug level of mySql to 3, and this is what I see on the console ...

when the table is created empty

 CoreData: annotation: Connecting to sqlite database file at "/var/mobile/Applications/BB22334C4-550A-4C44-B17A-3F02062EC687/Documents/MyDatabase.sqlite" CoreData: annotation: creating schema. CoreData: sql: pragma page_size=4096 CoreData: sql: pragma auto_vacuum=2 CoreData: sql: BEGIN EXCLUSIVE CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_METADATA' CoreData: sql: CREATE TABLE ZCARS ( Z_PK INTEGER PRIMARY KEY, Z_ENT INTEGER, Z_OPT INTEGER, ZYEAR INTEGER, ZBRAND VARCHAR ) CoreData: annotation: Creating primary key table. CoreData: sql: CREATE TABLE Z_PRIMARYKEY (Z_ENT INTEGER PRIMARY KEY, Z_NAME VARCHAR, Z_SUPER INTEGER, Z_MAX INTEGER) CoreData: sql: INSERT INTO Z_PRIMARYKEY(Z_ENT, Z_NAME, Z_SUPER, Z_MAX) VALUES(1, 'Cars', 0, 0) CoreData: sql: CREATE TABLE Z_METADATA (Z_VERSION INTEGER PRIMARY KEY, Z_UUID VARCHAR(255), Z_PLIST BLOB) CoreData: sql: SELECT TBL_NAME FROM SQLITE_MASTER WHERE TBL_NAME = 'Z_METADATA' CoreData: sql: DELETE FROM Z_METADATA WHERE Z_VERSION = ? CoreData: details: SQLite bind[0] = 1 CoreData: sql: INSERT INTO Z_METADATA (Z_VERSION, Z_UUID, Z_PLIST) VALUES (?, ?, ?) CoreData: details: SQLite bind[0] = 1 CoreData: details: SQLite bind[1] = "C6E2268B-6792-4298-B292-5025E5BDE31A" CoreData: details: SQLite bind[2] = <NSData len=455> CoreData: annotation: Saving new meta data; version = 1 ; UUID = C6E2268B-6792-4298-B292-5025E5BDE31A CoreData: sql: COMMIT CoreData: sql: pragma journal_mode=wal CoreData: sql: pragma journal_mode=wal CoreData: sql: pragma cache_size=200 CoreData: sql: SELECT Z_VERSION, Z_UUID, Z_PLIST FROM Z_METADATA 

after saving one brand / year

 CoreData: sql: BEGIN EXCLUSIVE CoreData: sql: SELECT Z_MAX FROM Z_PRIMARYKEY WHERE Z_ENT = ? CoreData: annotation: getting max pk for entityID = 4 CoreData: sql: UPDATE Z_PRIMARYKEY SET Z_MAX = ? WHERE Z_ENT = ? AND Z_MAX = ? CoreData: annotation: updating max pk for entityID = 4 with old = 0 and new = 1 CoreData: sql: COMMIT CoreData: sql: BEGIN EXCLUSIVE CoreData: sql: INSERT INTO ZTABULEIRO(Z_PK, Z_ENT, Z_OPT, ZYEAR, ZBRAND) VALUES(?, ?, ?, ?, ?) CoreData: details: SQLite bind[0] = (int64)1 CoreData: details: SQLite bind[1] = (int64)4 CoreData: details: SQLite bind[2] = (int64)1 CoreData: details: SQLite bind[3] = "FORD" CoreData: details: SQLite bind[4] = (int64)1989 CoreData: sql: COMMIT CoreData: annotation: Changing objectID 0x14e71730 <x-coredata:///Cars/t38FA86EE-4124-4FD7-A8C0-8CE7BBAC73782> to 0x14e73ef0 <x-coredata://C6E3368B-6792-4298-B292-5025E5BDE31A/Cars/p1> CoreData: sql: pragma page_count CoreData: annotation: sql execution time: 0.0014s CoreData: sql: pragma freelist_count CoreData: annotation: sql execution time: 0.0016s 

One strange thing I see here is a variable of the year, such as int64, when I defined it as an integer 16. Why does it use the integer 64 outside of me ...

Data is not saved at all. There is data. If I register datasets in the console, I see the data. If I register objects filled before saving, I see the data.

I am testing this on a device running iOS 7. Thanks.

What am I missing? How do I debug this?

+6
source share
1 answer

Data is stored in the database if the write-write log (wal) grows in size, see the documentation here http://www.sqlite.org/draft/wal.html . What do you use to open the database file? You must use a tool that works with WAL log mode. Instead of looking directly at the db files, try creating a new context and retrieving the stored objects.

+8
source

Source: https://habr.com/ru/post/954144/


All Articles