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

Ios 如何在Xcode中使用现有的数据库文件,读写?,ios,xcode,sqlite,Ios,Xcode,Sqlite,我对Xcode和sqlite有点陌生。现在我有了一个名为“mydb.db”的数据库文件,它已经有了一些表和数据。我把它放在我的mac文件夹中,然后把它拖到我的Xcode项目的“支持文件”下 这是我的代码,但我发现我只能从这个“mydb.db”读取数据,不能向其中插入数据!当我在sqlite管理器执行代码后打开“mydb.db”时,我不能 找到应该插入的数据 谁能告诉我如何解决这个问题?非常感谢 NSString *dbFilePath = [[NSBundle mainBundle] pathF

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

这是我的代码,但我发现我只能从这个“mydb.db”读取数据,不能向其中插入数据!当我在sqlite管理器执行代码后打开“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]];

    }];

首先学习IOS的教程

这很简单

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

然后使用sqlite3\u prepare\u v2语句执行该sqlStatement。

通过将sqlite db文件添加到Xcode中的支持文件组,您只需将该文件添加到应用程序的捆绑包中,以便在构建过程中将其与所有其他资源打包。由于应用程序无法写入其捆绑包,因此必须将sqlite数据库文件从捆绑包复制到可写位置,例如

#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文件。)

确保只打开存储在Xcode项目“支持文件”下的更新数据库。sqlite数据库必须复制到可写位置。“sqlite数据库必须复制到可写位置”,如何复制?以及哪个位置是可写位置?只需复制此文件并粘贴?是的,必须将数据库复制到可写存储器。如果你在这里搜索的话,很容易就会有上百个例子来说明如何做到这一点。嗨,我使用FMDB来执行sqlstatement,我认为FMDB类似于sqlite3\u prepare\u v2,对吗?我弄糊涂的是,代码执行后,mydb.db文件中没有正确的数据。尝试使用FMDatabase而不是FMDatabaseQueue,使用databaseWithPath而不是databaseQueueWithPath
FMDatabase*database=[FMDatabase databaseWithPath:path];[数据库开放];[database beginTransaction];NSString*query=[NSString stringWithFormat:@“插入到个人(rowid,fname,lname,address)值中(null,“%@',“%@',“%@')”,fname.text,lname.text,address.text]这对我有用…啊哈,我找到了答案:。主捆绑包中的所有文件都是只读的。我需要把数据库复制到文档文件夹。明白了!也谢谢你!是的,当我在下面发布答案时,你们似乎已经找到了。伟大的这将导致您的应用被拒绝,请使用其他路径: