数据未保存到核心数据 [英] Data not being saved to core data

查看:134
本文介绍了数据未保存到核心数据的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用专门针对iOS 7的Xcode 5编译。

I am using Xcode 5 compiling exclusively for iOS 7.

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

I am reading data from a UTF8 txt file to populate a core data entity. After reading the data, I log it to the console. The data is there. I populate the entity and log the entity to the console. I save it. No error. No crash.

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

I see 3 files on the device:


  • MyDatabase。 sqlite

  • MyDatabase.sqlite-shm

  • MyDatabase.sqlite-wal

当应用程序启动并且 MyDatabase.sqlite 创建为空时,它有40 kb。此时, shm 文件为32kb, wal 文件为零。

When the app 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.

在将数据写入数据库之后, wal 文件增长到1,7 Mb,但其他两个文件保持其初始大小,换句话说, ,则数据未保存到数据库。我已通过使用外部数据库查看器检查sqlite文件确认了。

After I write the data to the database, the wal files grows to 1,7 Mb but the other two files keep their initial sizes or in other words, the data is not being saved to the database. I have confirmed that by inspecting the sqlite file with an external database viewer.

这是我使用的代码:

// 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,这是我在控制台上看到的...

This produces no error or crash. It goes like it was saving. I have increased mySql debug level to 3 and this is what I see on console...

表创建时空

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

一个奇怪的事情我看到这里是年变量像int64当我定义它像整数16。正在使用整数64是超出我...

one strange thing I see here is the year variable like int64 when I have defined it like integer 16. Why it is using integer 64 is beyond me...

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

The data is not being saved at all. The data is there. If I log the arrays of data to console I see the data. If I log the entities populated before saving I see the data.

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

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

我缺少什么?如何调试?

What am I missing? How do I debug that?

推荐答案

如果写入日志尺寸越来越大,请参阅此处的文档 http://www.sqlite.org/draft/wal.html 。您使用什么来打开数据库文件?您必须使用与WAL日志模式一起使用的工具。而不是直接查看数据库文件,请尝试创建一个新的上下文并获取保存的实体。

The data is being saved to the database if the write-ahead-log (wal) is increasing in size, See documentation here http://www.sqlite.org/draft/wal.html. What are you using to open the database file? You must use a tool that works with WAL journal mode. Rather than looking at the db files directly, try creating a new context and fetching your saved entities.

这篇关于数据未保存到核心数据的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆