从外部源更新时,Sqlite DB记录没有更新?

时间:2011-09-14 21:42:29

标签: iphone xcode ipad sqlite

我正在开发一个将在本地从SQLite Db中提取数据的应用程序。该应用程序正在运行文件,但在我测试时,我添加了更多记录等但由于某种原因,模拟器和设备只能看到最后一个副本。

我已经完成了一个CLEAN构建,从项目中删除了.DB,然后将其添加回来,但无济于事。如果数据库有5条记录,我更新/添加另外两条记录,这些新记录没有显示。

关于我能看到它们的唯一方法是从项目中删除.DB,将数据库重命名为另一个名称,然后重新添加。

我知道这听起来像某种类型的缓存问题,但我无法弄清楚如何清除它。正如我所提到的,模拟器和设备都是一样的。

非常感谢任何帮助。提前谢谢。

...地理位置

3 个答案:

答案 0 :(得分:0)

听起来像是一个棘手的调试。请问您是如何连接数据库的?您使用的是CoreData还是原始SQL语句?

我很难理解数据库如何与CoreData协同工作,所以我可以提供帮助。

答案 1 :(得分:0)

数据库文件是否是应用程序包的一部分?您无法修改应用程序包。将数据库复制到可以修改它的位置,例如Documents目录,或者在第一次运行时在运行时创建数据库。

答案 2 :(得分:0)

如果资源中有db文件,则需要在启动时将资源从资源复制到库或文档,然后连接到文档或库中的文件。

提示:注销您连接的路径,在终端中打开它(它将在Derived Data下),然后使用sqlite3 cmd行(搜索)进行连接和查询。这有助于保持您在正确的数据库上运行的理智,并且可以随时检查数据。

作为旁注,请参阅这篇文章(如果您有兴趣,我有一个处理所有这些的库): Don't wan't to replacing the old database when app is updated

这是一个示例应用程序中的示例,我调用了ensureOpened(它处理资源中的副本并记录我正在使用的内容):

- (BOOL)ensureDatabaseOpen: (NSError **)error
{
    // already created db connection
    if (_contactDb != nil)
    {
        return YES;
    }

    NSLog(@">> ContactManager::ensureDatabaseOpen");    
    if (![self ensureDatabasePrepared:error])
    {
        return NO;
    }

    const char *dbpath = [_dbPath UTF8String]; 
    if (sqlite3_open(dbpath, &_contactDb) != SQLITE_OK &&
        error != nil)
    {
        *error = [[[NSError alloc] initWithDomain:@"ContactsManager" code:1000 userInfo:nil] autorelease];
        return NO;
    }

    NSLog(@"opened");

    return YES;
}

- (BOOL)ensureDatabasePrepared: (NSError **)error
{
    // already prepared
    if ((_dbPath != nil) &&
        ([[NSFileManager defaultManager] fileExistsAtPath:_dbPath]))
    {
        return YES;
    }

    // db in main bundle - cant edit.  copy to library if !exist
    NSString *dbTemplatePath = [[NSBundle mainBundle] pathForResource:@"contacts" ofType:@"db"];
    NSLog(@"%@", dbTemplatePath);

    NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
    _dbPath = [libraryPath stringByAppendingPathComponent:@"contacts.db"];

    NSLog(@"dbPath: %@", _dbPath);

    // copy db from template to library
    if (![[NSFileManager defaultManager] fileExistsAtPath:_dbPath])
    {
        NSLog(@"db not exists");
        NSError *error = nil;
        if (![[NSFileManager defaultManager] copyItemAtPath:dbTemplatePath toPath:_dbPath error:&error])
        {
            return NO;
        }

        NSLog(@"copied");
    }    

    return YES;    
}

希望有所帮助