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

时间:2013-11-25 07:05:21

标签: ios iphone sqlite

我已经从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文件&我应该使用什么文件路径?

3 个答案:

答案 0 :(得分:6)

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

要获取文件路径,您可以在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];

答案 1 :(得分:1)

我假设您已成功将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;
}

答案 2 :(得分:1)

-(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]);

}