带有 sqlite 的核心数据仅返回 3 行

Posted

技术标签:

【中文标题】带有 sqlite 的核心数据仅返回 3 行【英文标题】:Core Data with sqlite returning only 3 rows 【发布时间】:2015-01-06 06:28:37 【问题描述】:

我的数据库有两个表 ZDESTINATIONZPOSTIT。存在多对一关系,一个PostIt 可以有多个Destinations。我想获取所有 Destination 行(其中有 9 行)并且我正在使用 NSFetchRequest。但只返回 3 行。我没有指定谓词。我有一个排序顺序和一个部分键名路径为@"postIt.creationTime"。我检查了数据库,所有postIts 都有一个创建时间,所有目的地都有一个有效的postit 关系。

这是非常简化的查询。

SELECT t0.Z_ENT, t0.Z_PK, t0.ZPOSTIT
FROM ZDESTINATION t0
LEFT OUTER JOIN ZPOSTIT t1 ON t0.ZPOSTIT = t1.Z_PK
WHERE t0.Z_PK IN (?,?,?)
ORDER BY t1.ZCREATIONTIME DESC
LIMIT 20

DESTINATION(主键,PostIt)

"1" "3"
"2" "2"
"3" "4"
"4" "5"
"5" "5"
"6" "5"
"7" "7"
"8" "7"
"9" "7"

POSTIT 主键,创建时间

"1" "442134908.015139"
"2" "442134921.469915"
"3" "442134941.083225"
"4" "442135028.839804"
"5" "442212344.121323"
"6" "442212468.053344"
"7" "442214203.670005"

注意 LEFT OUTERJOIN 是由 fetch 请求自动生成的。

您对如何调试有什么想法或提示吗?

这是核心数据NSFetchRequest

NSFetchRequest *fetchRequest = [ [ NSFetchRequest alloc ] init ];
NSEntityDescription *entity = [ NSEntityDescription entityForName:@"Destination"
                                           inManagedObjectContext:studyStageAssets.postItMoContext ];
[ fetchRequest setEntity:entity ];

// Create the sort descriptors array.
NSSortDescriptor *creationTimeDescriptor = [ [ NSSortDescriptor alloc ]
                                            initWithKey:@"postIt.creationTime"
                                            ascending:NO ];

NSArray *sortDescriptors = @[ creationTimeDescriptor ];
[ fetchRequest setSortDescriptors:sortDescriptors ];

// Create and initialize the fetch results controller.
_fetchedResultsController = [ [ NSFetchedResultsController alloc ]
                             initWithFetchRequest:fetchRequest
                             managedObjectContext:studyStageAssets.postItMoContext
                             sectionNameKeyPath:@"postIt.creationTime"
                             cacheName:@"TrailIt" ];

_fetchedResultsController.delegate = self;

紧随其后的是performFetch

【问题讨论】:

WHERE 子句从何而来? 能否提供获取请求? 添加您正在使用的 Core Data 代码,因为这不是您实际尝试过的有用描述。 我已经在获取请求的代码中添加了。 @CL - WHERE 子句是在内部生成的,我在启动时传递的参数上使用了 -com.apple.CoreData.SQLDebug 1 ,以便 Core Data 发出调试语句。我没有放置谓词,所以 WHERE 子句是由 Core Data 自动生成的。 你试过清除 NSFetchedResultsController 的缓存吗? 【参考方案1】:

根据我的评论,问题可能是由于获取的结果控制器的缓存。您可以使用

清除它
[NSFetchedResultsController deleteCacheWithName:@"TrailIt"];

【讨论】:

以上是关于带有 sqlite 的核心数据仅返回 3 行的主要内容,如果未能解决你的问题,请参考以下文章

sqlite的几个常用方法

如何使用 expo-sqlite 执行带有 typescript 的 sql?

Iphone 编程 - 将现有的 sql 表导入到 sqlite 或核心数据

SQL 行返回顺序

带有 OrderBy 和 MaxResult 的 CriteriaQuery 仅返回非 NULL 行

sqlite3_step 只返回 1 行