如何在Xcode中使用现有的数据库文件,读写?

Posted

技术标签:

【中文标题】如何在Xcode中使用现有的数据库文件,读写?【英文标题】:How to use an existed database file in Xcode, read and write? 【发布时间】:2013-11-26 10:28:20 【问题描述】:

我对 Xcode 和 sqlite 有点陌生。现在我有一个名为“mydb.db”的数据库文件,它已经有一些表和数据。我把它放在我的 mac 文件夹中,然后将它拖到“支持文件”下的 Xcode 项目中。

这是我的代码,但我发现我只能从这个“mydb.db”中读取,不能向其中插入数据!当我通过 sqlite manager 执行我的代码后打开“mydb.db”时,我不能 找到应该插入的数据!

谁能告诉我如何解决这个问题?非常感谢!

NSString *dbFilePath = [[NSBundle mainBundle] pathForResource:@"mydb" ofType:@"db"];
FMDatabaseQueue *queue = [FMDatabaseQueue databaseQueueWithPath:dbFilePath]

    [queue inDatabase:^(FMDatabase *db) 
        [db executeUpdate:@"INSERT INTO Focus VALUES (?,?,?)" withArgumentsInArray:@[@"100000000",@2,@2]];

    ];

【问题讨论】:

确保您只打开存储在“支持文件”下的 Xcode 项目中的更新数据库。 sqlite db 必须复制到可写位置。 “sqlite db必须复制到可写位置”,如何复制?哪个位置是可写位置?只需复制此文件并粘贴即可? 是的,必须将数据库复制到可写存储。如果您在此处搜索,很容易有一百个示例说明如何执行此操作。 【参考方案1】:

通过将 sqlite db 文件添加到 Xcode 中的 Supporting Files 组,您只是将该文件添加到应用程序的包中,以便在构建过程中它与所有其他资源一起打包。因为应用程序不能写入到它的bundle,你必须将sqlite数据库文件从bundle复制到一个可写的位置,例如

#define FORCE_RECOPY_DB NO

- (void)copyDatabaseIfNeeded 
    NSFileManager *fm = [[NSFileManager alloc] init];
    NSString *documentsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *destinationPath = [documentsPath stringByAppendingPathComponent:@"pte.sqlite"];

    void (^copyDb)(void) = ^(void)
        NSString *sourcePath = [[NSBundle mainBundle] pathForResource:@"pte" ofType:@"sqlite"];
        NSAssert1(sourcePath, @"source db does not exist at path %@",sourcePath);

        NSError *copyError = nil;
        if( ![fm copyItemAtPath:sourcePath toPath:destinationPath error:&copyError] ) 
            DDLogError(@"ERROR | db could not be copied: %@", copyError);
        
    ;
    if( FORCE_RECOPY_DB && [fm fileExistsAtPath:destinationPath] ) 
        [fm removeItemAtPath:destinationPath error:NULL];
        copyDb();
    
    else if( ![fm fileExistsAtPath:destinationPath] ) 
        DDLogInfo(@"INFO | db file needs copying");
        copyDb();
    

现在,当您希望打开数据库时,请使用文档路径中的位置。

请注意,您将无法检查项目中的 sqlite db 文件并期望找到从您的代码中写入的更改。 (因为您的代码现在将使用复制的 sqlite 文件。)

【讨论】:

这会让你的应用被拒绝,使用不同的路径:***.com/questions/13896757/…【参考方案2】:

首先学习ios的教程。

非常简单。

const char *sqlStatement = "insert into Userprofile (Userauth, Age, , Year) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)";

然后使用 sqlite3_prepare_v2 语句来执行该 sqlStatement。

【讨论】:

你好,我使用FMDB执行sqlstatement,我认为FMDB类似于sqlite3_prepare_v2,对吧?令我困惑的是,代码执行后,mydb.db文件中没有正确的数据。 尝试使用 FMDatabase 代替 FMDatabaseQueuedatabaseWithPath 代替 databaseQueueWithPath跨度> FMDatabase *database = [FMDatabase databaseWithPath:path]; [database open]; [database beginTransaction]; NSString *query = [NSString stringWithFormat:@"insert into person(rowid,fname,lname,address) values(null,'%@','%@','%@')",fname.text,lname.text,address.text]; 这对我有用... 啊哈,我找到了答案:link。主包中的所有文件都是只读的。我需要将数据库复制到 Documents 文件夹。明白了!也谢谢你! 是的,当我在下面发布答案时,您似乎已经找到了它。太好了!

以上是关于如何在Xcode中使用现有的数据库文件,读写?的主要内容,如果未能解决你的问题,请参考以下文章

现有的领域数据库不能在 swift 3.1 xcode 8 中工作

如何从 Xcode 打开现有的颤振项目?

Xcode:如何将 Unity 游戏添加到现有的 iOS 应用程序?

如何在现有的 ios 测试项目中启用 xcode 7 UI 测试

如何将 Facebook 的 Buck Build 安装到现有的 Xcode 项目中?

如何在现有的 Xcode 项目中安装 phoneGap [关闭]