我正在使用专为iOS 7编译的Xcode 5。
我正在从UTF8 txt文件中读取数据以填充核心数据实体。读完数据后,我将其记录到控制台。数据就在那里。我填充实体并将实体记录到控制台。我救了它。没错。没有崩溃。
我在设备上看到3个文件:
当应用程序启动并且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);
}
}
这不会产生错误或崩溃。它就像是在储蓄。我已将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
保存一个品牌/年后
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
我在这里看到的一个奇怪的事情是像int64这样的年变量,当我将它定义为整数16.为什么它使用整数64超出了我...
根本没有保存数据。数据就在那里。如果我将数据数组记录到控制台,我会看到数据。如果我在保存之前记录填充的实体,我会看到数据。
我正在运行iOS 7的设备上进行测试。谢谢。
我错过了什么?我该如何调试?
答案 0 :(得分:8)
如果预写日志(wal)的大小正在增加,则数据将保存到数据库中,请参阅此处的文档http://www.sqlite.org/draft/wal.html。你用什么打开数据库文件?您必须使用适用于WAL日志模式的工具。不是直接查看db文件,而是尝试创建新的上下文并获取已保存的实体。