数据未保存到核心数据

Spa*_*Dog 6 iphone cocoa-touch core-data ipad ios

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

我正在从UTF8 txt文件中读取数据以填充核心数据实体.读完数据后,我将其记录到控制台.数据就在那里.我填充实体并将实体记录到控制台.我救了它.没错.没有崩溃.

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

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

当应用程序启动并MyDatabase.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);
            }
}
Run Code Online (Sandbox Code Playgroud)

这不会产生错误或崩溃.它就像是在储蓄.我已将mySql调试级别增加到3,这是我在控制台上看到的...

当表创建为空时

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
Run Code Online (Sandbox Code Playgroud)

保存一个品牌/年后

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
Run Code Online (Sandbox Code Playgroud)

我在这里看到的一个奇怪的事情是像int64这样的年变量,当我将它定义为整数16时.为什么它使用整数64超出了我...

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

我在运行iOS 7的设备上测试这个.谢谢.

我错过了什么?我该如何调试?

小智 8

如果预写日志(wal)的大小正在增加,则数据将保存到数据库中,请参阅http://www.sqlite.org/draft/wal.html中的文档.你用什么打开数据库文件?您必须使用适用于WAL日志模式的工具.不是直接查看db文件,而是尝试创建新上下文并获取已保存的实体.

  • 你是对的!我正在独立检查sqlite文件.我将其他两个文件复制到同一目录并再次检查数据库的那一刻,数据库显示已填充.现在这里是他们所有人的大问题:当应用程序第一次启动时,它必须将sqlite文件从包中复制到文档目录.我现在该怎么办?将捆绑包中的所有3个文件复制到文档目录中?数据库现在不只是一个而是3个文件?WTF!或者换句话说:我是否必须在捆绑包中包含这3个文件,对吧? (2认同)