将单独的 .sqlite 文件添加到 ios 项目

Posted

技术标签:

【中文标题】将单独的 .sqlite 文件添加到 ios 项目【英文标题】:add Separate .sqlite file to ios project 【发布时间】:2013-11-25 07:05:20 【问题描述】:

我已经从 SQLite Manager firefox 插件创建了一个 myDB.sqlite 数据库。我想将此 myDB.sqlite 文件添加到我的项目中。然后我可以编写函数来从表中获取数据。

我尝试将 myDB.sqlite 文件添加到项目文件夹并创建一个像这样的文件路径。但我认为这个文件路径是错误的。

-(NSString *) filePath

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];

    NSString *path = [documentsDirectory stringByAppendingPathComponent:@"document.sqlite"];
    return path;

将 myDB.sqlite 文件添加到项目文件夹是否正确?或者我应该在哪里保存这个 myDB.sqlite 文件以及我应该使用什么文件路径?

【问题讨论】:

当您发布问题的解决方案时学习accept answer。 【参考方案1】:

在您的项目中添加您的 myDB.sqlite 文件。通过右键单击您的项目名称 => 将文件添加到“项目名称”,然后添加它。

要获取你的文件路径,你可以在你的 appDelegate 中添加它

- (void) copyDatabaseIfNeeded 

//Using NSFileManager we can perform many file system operations.
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;

NSString *dbPath = [self getDBPath];
BOOL success = [fileManager fileExistsAtPath:dbPath];

if(!success) 

   NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"database.sqlite"];
   success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error];

   if (!success)
      NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);



- (NSString *) getDBPath
   
//Search for standard documents using NSSearchPathForDirectoriesInDomains
//First Param = Searching the documents directory
//Second Param = Searching the Users directory and not the System
//Expand any tildes and identify home directories.

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory , NSUserDomainMask, YES);
NSString *documentsDir = [paths objectAtIndex:0];
//NSLog(@"dbpath : %@",documentsDir);
return [documentsDir stringByAppendingPathComponent:@"myDB.sqlite"];

在您确实完成了启动方法调用 [self copyDatabaseIfNeeded];

【讨论】:

当我把这个 myDB.sqlite 文件保存在模拟器文件夹中时。但这是一个空文件(没有我的表格) 重置模拟器,然后尝试从模拟器复制sqlite数据库。 然后出现错误“NSInternalInconsistencyException”,原因:“无法创建可写数据库文件,并显示消息“操作无法完成。(Cocoa 错误 260。)”。 " 查看这个答案***.com/questions/10378564/… 终于把它弄对了....感谢您的帮助..抱歉我不能投票,因为我只有 14 个声望。【参考方案2】:

我假设您已成功将 sqlite db 复制到项目的文件夹中。所以你现在在你的应用程序包中有 sqlite 数据库。

因此,您需要使用以下代码将数据库从应用程序包复制到设备/模拟器的文档目录。将这些写在 AppDelegate.m 中

- (void) copyDatabaseIfNeeded

    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSError *error;
    NSString *folderPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,YES) objectAtIndex:0];
    // First, test for existence.
    if (![fileManager fileExistsAtPath:folderPath])
        [fileManager createDirectoryAtPath:folderPath withIntermediateDirectories:YES attributes:nil error:&error]; //Create folder

    NSString *dbPath = [folderPath stringByAppendingPathComponent:@"document.sqlite"];
    BOOL success = [fileManager fileExistsAtPath:dbPath];

    if(!success)
    
        NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"document.sqlite"];
        success = [fileManager copyItemAtPath:defaultDBPath toPath:dbPath error:&error];
        if (!success)
            NSAssert1(0, @"document.sqlite : Failed to create writable database file with message '%@'.", [error localizedDescription]);
    


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions

    /** Database copy is not exist **/
    [self copyDatabaseIfNeeded];

    // Override point for customization after application launch.
    return YES;

【讨论】:

当我把这个 document.sqlite 文件保存在模拟器文件夹中时。但这是一个空文件(没有我的表格)【参考方案3】:
-(void)addSqlFileIfNotExists 

NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES);
NSString *documentDirectory = [paths objectAtIndex:0];

NSString *writableDBPath = [documentDirectory stringByAppendingPathComponent:@"document.sqlite"];

BOOL exits = [fileManager fileExistsAtPath:writableDBPath];
if(exits) return;

NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"document.sqlite"];

BOOL exit = [fileManager copyItemAtPath:defaultDBPath toPath:writableDBPath error:&error];

if(!exit) 
  NSLog(@"%@",[error localizedDescription]);


【讨论】:

以上是关于将单独的 .sqlite 文件添加到 ios 项目的主要内容,如果未能解决你的问题,请参考以下文章

将sqlite文件从一个项目复制到另一个项目

应用轻量级迁移后,将 ios-add 列添加到 sqlite?

如何将 SQLite (SQLite.NET) 添加到我的 C# 项目中

如何将预先存在的 sqlite 文件导入核心数据 iOS 7.1

Qt SQLite 批量插入优化(SQLite默认将每条语句看成单独的事务)good

如何将 SQLite .db 添加到 C#.NET 项目中