【问题标题】:Storing data locally until application is open在本地存储数据直到应用程序打开
【发布时间】:2012-12-15 18:55:39
【问题描述】:

我有一个本地 Sqlite 数据库,其中包含 3 个表(高级经理、经理、员工)并且所有 3 个表都是相互关联的。我为数据创建了 3 个 NSObject 类(w.r.t 表)。现在我有一个 Controller 类,我可以在其中查询这些表并创建那些 NSobject 类的对象 并更新它。最后,我将这些对象添加到该类中的数组中。

现在假设我有 3 个视图控制器(VC1、VC2、VC3)。所以当我从 VC1 来到 VC2 时,我调用数据控制器类,进行查询并从数据控制器类获取数组并显示这些数据在我的 VC2 的 3 个表视图中。所以现在我可以添加/删除一个新的高级经理/经理并在 VC2 的不同表视图中显示它。

所以我的问题是当我再次从 VC2 回到 VC1 并再次回到 VC2 时,我看不到添加/删除的行。因为在我的 viewDidLoad 中,我再次尝试从 Data 控制器类中获取我的数组,因此它将再次显示 DB 中存在的数据。

注意我有一个限制,我不想将这些添加/删除操作数据写入任何数据库。因此,每次重新启动应用程序时,我都必须显示 DB 中存在的默认数据。

任何机构可以帮助我解决这个问题吗?所以从应用程序的打开到关闭我可以维护这些数据。

【问题讨论】:

    标签: objective-c ios ipad


    【解决方案1】:

    如果您希望数据从启动到启动持续存在,您将需要将其存储在持久性、文件、数据库、iCloud 等位置。

    【讨论】:

      【解决方案2】:

      您是从捆绑包中打开数据库吗?您无法将更改保存到捆绑包中的数据库。您需要将数据库从捆绑包复制到Documents,然后打开该数据库。如果您不想在会话之间保存数据库,只需确保在应用程序首次启动时始终将数据库从捆绑包复制到 Documents。 (一般情况下,只有当Documents 中不存在数据库时,人们才会从bundle 复制到Documents,但听起来您总是想复制它。)

      要复制数据库,您可以执行以下操作:

      NSString *databaseName = kDatabaseName; // obviously, replace this with your database filename
      
      NSString *documentsFolder      = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
      NSString *databaseDocumentPath = [documentsFolder stringByAppendingPathComponent:databaseName];
      NSString *databaseBundlePath   = [[NSBundle mainBundle] pathForResource:databaseName ofType:@""];
      
      NSFileManager *fileManager = [NSFileManager defaultManager];
      NSError *error;
      
      if (![fileManager copyItemAtPath:databaseBundlePath
                                toPath:databaseDocumentPath
                                 error:&error])
          NSLog(@"Unable to copy database from '%@' to '%@': error = %@", databaseBundlePath, databaseDocumentPath, error);
      

      一旦你这样做了,你就可以打开databaseDocumentPath指向的数据库。

      【讨论】:

        【解决方案3】:

        您只需要在从数据库加载后缓存数组。大致可以这样做:

        @implementation DataController
        
        static NSMutableArray *managers;
        
        //Note: not thread-safe
        - (NSMutableArray*) managers {
            if (!managers)
              managers = loadDefaultManagers();//queries default data from sqlite db and loads array
        
            return managers;
        }
        
        - (void) addManager:(NSDictionary*) manager {
          [managers addObject:manager];
        }
        ...
        
        @end
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-11-13
          • 2014-09-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多