我有一个充满电影信息的数据库,然后从网络服务器上的XML文件读入数据库。
以下是:
Gather/Parse XML and store film info as objects
Begin Statement
For every film object we found:
Check to see if record for film exists in database
If no film record, write data for film
Commit Statement
目前我只是使用(非常基本的)测试电影的存在:
SELECT film_title FROM film WHERE film_id = ?
如果返回一行,那么电影就存在,如果没有,那么我需要添加它......
我也尝试过使用
INSERT INTO film (film_id, film_title, film_mStar, film_dStar, film_date) SELECT ?, ?, ?, ?, ?, ?, ? WHERE NOT EXISTS (SELECT 1 FROM film WHERE film_id = ?)
在处理时间方面达到完全相同的效果......
唯一的问题是,数据库中有很多数百条记录(很多电影!),因为它必须先检查数据库中是否存在电影才能编写,整个过程最终花了一段时间(210部电影约27秒)
是否有更有效的方法可以做到这一点,或者只是一般的建议?
编程语言是Objective-C,数据库是sqlite3,平台是iPhone / iPad / iPodTouch
谢谢, DWAINE
答案 0 :(得分:0)
您可以尝试在film_id上添加索引,以加快搜索现有影片的速度。
这样的事情应该可以胜任:
CREATE INDEX IF NOT EXISTS film_index_film_id ON film (film_id)
如果您的唯一键实际上是其他键(不仅仅是film_id,但可能是标题和年份),那么您应该包括您在索引中使用的所有列。
答案 1 :(得分:0)
如果film_id每部电影都是独一无二的,你可以考虑这样的事情:
SELECT film_id FROM film;
启动时,并缓存数组或类似的所有ID。然后,当您从XML中读取新记录时,检查数组中是否存在film_id,如果不存在,则将其添加到数组和数据库中。这样你每个文件只能选择一次而不是每部电影一次。
编辑:要考虑的另一件事是交易。在启动时:
BEGIN TRANSACTION;
并在所有插入之后:
COMMIT;
答案 2 :(得分:0)
为filmIDs创建一个布尔数组(它可以只是一个位图) 然后为数组中的每个相应地址将位设置为false / true。 然后,而不是使用sql检查它是否存在,检查它对阵列。 插入时,将filmid = true添加到数组中。