Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将数据复制到iPhone上的应用程序数据文件夹_Iphone_Objective C_Sqlite - Fatal编程技术网

将数据复制到iPhone上的应用程序数据文件夹

将数据复制到iPhone上的应用程序数据文件夹,iphone,objective-c,sqlite,Iphone,Objective C,Sqlite,我正在(最终)将我的应用程序加载到iPhone设备上进行测试。到目前为止,我只在模拟器中测试了应用程序。该应用程序以数据为中心,并使用SQLite数据库。我已经用我在模拟器中使用的示例数据创建了一个合适的SQLite数据库。如何将此.sqlite3文件复制到实际的iPhone 使用模拟器很容易,因为我可以将.sqlite3文件复制到~/Library/Application-Support/iPhone-simulator/User/Applications/{UUID}/Documents文件

我正在(最终)将我的应用程序加载到iPhone设备上进行测试。到目前为止,我只在模拟器中测试了应用程序。该应用程序以数据为中心,并使用SQLite数据库。我已经用我在模拟器中使用的示例数据创建了一个合适的SQLite数据库。如何将此.sqlite3文件复制到实际的iPhone


使用模拟器很容易,因为我可以将.sqlite3文件复制到~/Library/Application-Support/iPhone-simulator/User/Applications/{UUID}/Documents文件夹中,但我不知道如何将其复制到实际iPhone设备上的同一位置。在手机上从头开始重新创建数据库实际上不是一个选项,因为我已经在Mac上完成了所有创建数据库的艰苦工作。

为什么不将其添加到应用程序包中?右键单击Xcode中项目窗口中的
Resources
文件夹,然后选择
Add
现有文件…
添加sqlite数据库

然后从应用程序包加载文件:

NSString *databasePath = [[NSBundle mainBundle] pathForResource:@"mySQLiteDatabaseFile" ofType:@"sqlite3"];
NSData *databaseData = [NSData dataWithContentsOfFile:databasePath];
// ...

正如Alex所说,您必须将数据库文件作为资源添加到项目中。这将指示Xcode在.app中绑定数据库文件。但是,该文件是只读的,您可以将其复制到您的应用程序文档文件夹(在设备或模拟器上,也是一样),在那里它基本上可以写

下面是我用于这类事情的代码。这段代码的好处在于,每当您更改捆绑在.app中的“主”副本时,它会自动刷新应用程序文档文件夹中的可写副本。使用“pathLocal”打开(可写)数据库

当操作成功时,下面的函数返回YES(是)(无论是否需要副本)。您可以根据自己的喜好随意更改:)


这里我是如何创建一个名为DBManagement的类的 并在m文件中实现这些方法。同时将这一行放在@implementation line上方的实现文件中

静态sqlite3*CHManagement=nil

-(NSString *) getDBPath
{
 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
 NSString *documentsDirectory = [paths objectAtIndex:0];
 NSString *MyDatabasePath = [documentsDirectory stringByAppendingString:@"/CHManagement.sqlite"];
  return MyDatabasePath;

 }

-(void) checkDataBase
{
NSLog(@"CheckDatabase Called");
NSFileManager *fileManager=[NSFileManager defaultManager];
NSError *error=[[[NSError alloc]init] autorelease]; 
NSString *dbPath = [self getDBPath];
BOOL success=[fileManager fileExistsAtPath:dbPath];
if(!success)
{
 NSString *defaultDBPath=nil;
 defaultDBPath=[[[NSBundle mainBundle]resourcePath]stringByAppendingPathComponent:@"CHManagement.sqlite"];
 success=[fileManager copyItemAtPath:defaultDBPath  toPath:dbPath error:&error];
 if(!success)
 {
   NSAssert1(0,@"failed to create database with message '%@'.",[error localizedDescription]); 
  }
 }
 else
 {
 sqlite3 *MyDatabase;
 NSInteger VersionNumber=0;
 sqlite3_stmt *CompiledStatement=nil;
 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
 NSString *documentsDirectory = [paths objectAtIndex:0];
 NSString *MyDatabasePath = [documentsDirectory stringByAppendingString:@"/CHManagement.sqlite"];
 if(sqlite3_open([MyDatabasePath UTF8String],&MyDatabase) == SQLITE_OK)
 {
  sqlite3_prepare_v2(MyDatabase, "select appVersionNo from VersionInfo", -1, &CompiledStatement, NULL);
  while(sqlite3_step(CompiledStatement) == SQLITE_ROW)
  {
   VersionNumber=sqlite3_column_int(CompiledStatement,0);
  }
  sqlite3_reset(CompiledStatement);
  sqlite3_finalize(CompiledStatement);
  sqlite3_close(MyDatabase);
 }
 if (VersionNumber!=1)
 {
  [self deleteDatabase];
  NSString *defaultDBPath=[[[NSBundle mainBundle]resourcePath]stringByAppendingPathComponent:@"CHManagement.sqlite"];
  success=[fileManager copyItemAtPath:defaultDBPath  toPath:dbPath error:&error];
  if(!success)
  {
   NSAssert1(0,@"failed to create database with message '%@'.",[error localizedDescription]); 
   }
  }
 }
 }

- (void)deleteDatabase
{
NSLog(@"Delete Database Called");
NSError **error=nil;
NSFileManager *FileManager = [NSFileManager defaultManager];
NSString *databasepath = [self getDBPath];
  BOOL success = [FileManager fileExistsAtPath:databasepath];
if(success) {
[FileManager removeItemAtPath:databasepath error:error];
}
 }
使用这些方法,您可以轻松地将数据库加载到应用程序的iphone文档文件夹中。
很抱歉格式化。appVersionNo是表格中名为versionInfo的字段,默认值为1。但是如果数据库已经包含在应用程序包中,我可以写回数据库吗?不可以,但是您可以将这个“预初始化”的基本数据库从那里复制到可写的
Documents
文件夹中。很好的一点是,这种方法还允许用户“重置”应用程序。这太棒了。谢谢你的代码Zoran。这将使事情对我来说更容易:)我特别喜欢当主副本更改时,代码将刷新可写副本。
-(NSString *) getDBPath
{
 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
 NSString *documentsDirectory = [paths objectAtIndex:0];
 NSString *MyDatabasePath = [documentsDirectory stringByAppendingString:@"/CHManagement.sqlite"];
  return MyDatabasePath;

 }

-(void) checkDataBase
{
NSLog(@"CheckDatabase Called");
NSFileManager *fileManager=[NSFileManager defaultManager];
NSError *error=[[[NSError alloc]init] autorelease]; 
NSString *dbPath = [self getDBPath];
BOOL success=[fileManager fileExistsAtPath:dbPath];
if(!success)
{
 NSString *defaultDBPath=nil;
 defaultDBPath=[[[NSBundle mainBundle]resourcePath]stringByAppendingPathComponent:@"CHManagement.sqlite"];
 success=[fileManager copyItemAtPath:defaultDBPath  toPath:dbPath error:&error];
 if(!success)
 {
   NSAssert1(0,@"failed to create database with message '%@'.",[error localizedDescription]); 
  }
 }
 else
 {
 sqlite3 *MyDatabase;
 NSInteger VersionNumber=0;
 sqlite3_stmt *CompiledStatement=nil;
 NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
 NSString *documentsDirectory = [paths objectAtIndex:0];
 NSString *MyDatabasePath = [documentsDirectory stringByAppendingString:@"/CHManagement.sqlite"];
 if(sqlite3_open([MyDatabasePath UTF8String],&MyDatabase) == SQLITE_OK)
 {
  sqlite3_prepare_v2(MyDatabase, "select appVersionNo from VersionInfo", -1, &CompiledStatement, NULL);
  while(sqlite3_step(CompiledStatement) == SQLITE_ROW)
  {
   VersionNumber=sqlite3_column_int(CompiledStatement,0);
  }
  sqlite3_reset(CompiledStatement);
  sqlite3_finalize(CompiledStatement);
  sqlite3_close(MyDatabase);
 }
 if (VersionNumber!=1)
 {
  [self deleteDatabase];
  NSString *defaultDBPath=[[[NSBundle mainBundle]resourcePath]stringByAppendingPathComponent:@"CHManagement.sqlite"];
  success=[fileManager copyItemAtPath:defaultDBPath  toPath:dbPath error:&error];
  if(!success)
  {
   NSAssert1(0,@"failed to create database with message '%@'.",[error localizedDescription]); 
   }
  }
 }
 }

- (void)deleteDatabase
{
NSLog(@"Delete Database Called");
NSError **error=nil;
NSFileManager *FileManager = [NSFileManager defaultManager];
NSString *databasepath = [self getDBPath];
  BOOL success = [FileManager fileExistsAtPath:databasepath];
if(success) {
[FileManager removeItemAtPath:databasepath error:error];
}
 }