数据未保存到核心数据

我正在使用专门为iOS 7编译的Xcode 5。

我正在从UTF8 txt文件读取数据以填充核心数据实体。 读完数据后,我将它logging到控制台。 数据在那里。 我填充实体并将实体logging到控制台。 我保存它。 没有错误。 没有崩溃。

我在设备上看到3个文件:

  • MyDatabase.sqlite
  • MyDatabase.sqlite-SHM
  • MyDatabase.sqlite,沃尔玛

当应用程序启动并创buildMyDatabase.sqlite时,它有40 kb。 在这一点上, shm文件是32kb, wal文件是零。

将数据写入数据库之后, wal文件增长到1,7 Mb,而其他两个文件保持其初始大小,换句话说,数据不会被保存到数据库。 我已经证实,通过检查与外部数据库查看器的sqlite文件。

这是我正在使用的代码:

 // 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); } } 

这不会产生错误或崩溃。 它就像是储蓄。 我已经增加了mySqldebugging级别为3,这是我在控制台上看到的…

当表被创build为空时

 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 

节省一个品牌/年后

 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 

我在这里看到的一个奇怪的事情是年variables像int64,当我已经定义它像整数16。为什么它是使用整数64超越了我…

数据根本没有被保存。 数据在那里。 如果我将数据的数组logging到控制台,我会看到数据。 如果我logging保存之前填充的实体,我会看到数据。

我正在testing运行iOS 7的设备上。谢谢。

我错过了什么? 我如何debugging?

如果提前写入日志(wal)的大小正在增加,则数据将被保存到数据库中。请参阅http://www.sqlite.org/draft/wal.html文档&#x3002; 你用什么打开数据库文件? 您必须使用与WAL日志模式配合使用的工具。 而不是直接查看数据库文件,尝试创build一个新的上下文,并获取您保存的实体。