【问题标题】:Bulk Insert into iphone sqlite database批量插入 iphone sqlite 数据库
【发布时间】:2011-01-20 05:49:59
【问题描述】:

您好,我正在使用以下代码将数组中的批量数据插入到 sqlite db 中...但是速度非常慢...请告知... 我是否使用了正确的方法?

sqlite3 *db1=nil; db1 = [One2GuideUAppDelegate getNewDBConnection];

sqlite3_stmt *init_statement = nil;
@try
{   


    if(init_statement == nil)
    {
        const char *sql = "insert into tblBrand(intBId,intVersion,intLikes,intDontLikes,strName,strDesc,strWebsite,intEst,strFounder,strLogo,strThumbnail) values(?,?,?,?,?,?,?,?,?,?,?)";
        if(sqlite3_prepare_v2(db1, sql, -1, &init_statement, NULL) != SQLITE_OK)
            NSAssert1(0,@"Error: Failed to prepare statement with message '%s'.",sqlite3_errmsg(db1));  
    }

    for(int br=0;br<[brands count];br++)
    {
        BrandVO *brandVO=[brands objectAtIndex:br ];
        NSString *brandID=brandVO.brandID;
        NSString *brandVer=brandVO.brandVersion;
        NSString *brandLikes=brandVO.likes;
        NSString *brandDontLikes=brandVO.dontLikes;
        NSString *brandName=brandVO.name;
        NSString *brandDesc=brandVO.description;
        NSString *brandWeb=brandVO.url;
        NSString *brandEstb=brandVO.establishedYear;
        NSString *brandFounder=brandVO.founders;
        NSString *brandLogo=brandVO.logoURL;
        NSString *brandthumb=brandVO.thumbnailURL;





    sqlite3_bind_int(init_statement, 1, [brandID intValue]);
    sqlite3_bind_int(init_statement, 2, [brandVer intValue]);
    sqlite3_bind_int(init_statement, 3, [brandLikes intValue]);
    sqlite3_bind_int(init_statement, 4, [brandDontLikes intValue]);
    sqlite3_bind_text(init_statement, 5,[brandName UTF8String],-1,SQLITE_TRANSIENT);
    sqlite3_bind_text(init_statement, 6,[brandDesc UTF8String],-1,SQLITE_TRANSIENT);
    sqlite3_bind_text(init_statement, 7,[brandWeb UTF8String],-1,SQLITE_TRANSIENT);
    sqlite3_bind_int(init_statement, 8,[brandEstb intValue]);
    sqlite3_bind_text(init_statement, 9,[brandFounder UTF8String],-1,SQLITE_TRANSIENT);
    sqlite3_bind_text(init_statement, 10,[brandLogo UTF8String],-1,SQLITE_TRANSIENT);
    sqlite3_bind_text(init_statement, 11,[brandthumb UTF8String],-1,SQLITE_TRANSIENT);


    if(SQLITE_DONE != sqlite3_step(init_statement))
        NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(db1));

    sqlite3_reset(init_statement);
        }

}

@catch (NSException *ex) 
{
    @throw ex;
}
@finally 
{
    if(init_statement)sqlite3_finalize(init_statement);
    sqlite3_close(db1);
}

谢谢,

【问题讨论】:

    标签: iphone sqlite


    【解决方案1】:

    使用BEGIN TRANSACTIONEND TRANSACTION 将您的插入语句包装在事务中。这通常会大大加快批量插入的速度。

    【讨论】:

    • 我想我们在获取数据时不能使用相同的(开始和结束事务)......我在从数据库中获取数据时面临类似的速度问题......请告知。 ..
    • 检查是否有您正在查询的列的索引。
    • 我没有为我指定的列创建任何索引...我猜它是在创建数据库时完成的...如何去做??
    • 参考sqlite.org/lang_createindex.html或者使用像SQLite Manager或者Base这样的GUI工具(有好几个)。
    猜你喜欢
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 2013-01-20
    • 1970-01-01
    • 2011-01-14
    • 1970-01-01
    • 2013-08-15
    相关资源
    最近更新 更多