【问题标题】:Sqlite DB records not updating in vie wwhen updated from external source?从外部源更新时,Sqlite DB 记录未在视图中更新?
【发布时间】:2011-09-14 21:42:28
【问题描述】:

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

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

我能让他们看到的唯一方法是从项目中删除 .DB,将 DB 重命名为另一个名称,然后再添加回来。

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

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

地理...

【问题讨论】:

    标签: iphone xcode ipad sqlite


    【解决方案1】:

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

    提示:注销您连接的路径,在终端中打开它(它将在派生数据下),然后使用 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;    
    }
    

    希望有帮助

    【讨论】:

    • 我肯定会对您拥有的能够完成所有这些工作的库感兴趣。这是我第一次尝试访问 SQLite 数据库,所以我已经结束了教程。谢谢
    • 你可以先尝试的一件事是 github 上的 fmdb - 这是一个流行的 sqlite 包装器。你也可以给我发电子邮件。
    • 我实际上是通过进入模拟器目录并删除 SQL DB 文件来解决这个问题的。然后它开始拉下新版本。
    【解决方案2】:

    听起来很难调试。请问您是如何连接到数据库的?您使用的是 CoreData 还是原始 SQL 语句?

    我在理解数据库如何与 CoreData 一起工作时遇到了很多痛苦,所以我可以提供帮助。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2021-11-15
        • 2021-06-08
        • 1970-01-01
        • 2021-05-27
        • 2018-10-16
        • 1970-01-01
        • 1970-01-01
        • 2023-03-06
        • 2018-06-09
        相关资源
        最近更新 更多