gpt4 book ai didi

iphone - 无法使用iOS将数据插入sqlite3数据库

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:16:44 24 4
gpt4 key购买 nike

使用 MacOS 终端我创建了一个数据库名称 database.sql 并插入了一些记录。使用 iOS 我可以检索插入的值。

但使用 iOS 代码,我尝试将记录插入数据库,但它没有将记录输入数据库。

我应该设置需要设置一些权限吗?这是我的代码:

- (void)viewDidLoad
{
[super viewDidLoad];
[self openDB];
}

-(IBAction)save:(id)sender{

[self insertRecordIntoTableNamed:@"Contacts"
field1Value:fname.text
field2Value:lname.text
field3Value:comp.text
field4Value:email.text
field5Value:pnumber.text
field6Value:mnumber.text
field7Value:add.text
field8Value:city.text
field9Value:state.text];
}


-(void)openDB{
NSString *sqlfile=[[NSBundle mainBundle]pathForResource:@"database" ofType:@"sql"];

if(sqlite3_open([sqlfile UTF8String], &db)!= SQLITE_OK){
sqlite3_close(db);
NSLog(@"Database connected");
NSAssert(0,@"Database failed to open");
}
else
{
NSLog(@"Database connected");
}
}


-(void) insertRecordIntoTableNamed:(NSString *) tableName
field1Value:(NSString *) field1Value
field2Value:(NSString *) field2Value
field3Value:(NSString *) field3Value
field4Value:(NSString *) field4Value
field5Value:(NSString *) field5Value
field6Value:(NSString *) field6Value
field7Value:(NSString *) field7Value
field8Value:(NSString *) field8Value
field9Value:(NSString *) field9Value {

NSString *sql = [NSString stringWithFormat:@"INSERT INTO %@ VALUES ('%@','%@','%@','%@',%@,%@,'%@','%@','%@');",tableName, field1Value, field2Value,field3Value,field4Value,field5Value,field6Value,field7Value ,field8Value,field9Value];


NSLog(@"%@",sql);

// char *err;
sqlite3_stmt *statement;
if (sqlite3_prepare_v2(db, [sql UTF8String], -1, &statement, nil)== SQLITE_OK)
{
if (SQLITE_DONE!=sqlite3_step(statement))
{
sqlite3_close(db);
NSAssert(0, @"Error updating table.");
}
else{
NSLog(@"Success");
NSLog(@"%@",sql);
}
}
sqlite3_finalize(statement);
}

@end

这是我所做的:

  1. 使用 CHMOD 更改文件夹和路径权限

  2. sqlite3_exec() 拆分为 sqlite3_prepare()sqlite3_step()sqlite3_finalize() - 我得到相同的输出 - 查询已创建但记录未在数据库中创建

  3. 我能够检索记录信息

最佳答案

您不能写入资源包中的数据库。您需要复制它然后使用它。

这是我成功用于执行此操作的一些代码(关键是从资源中复制的 ensureDatabasePrepared):

- (BOOL)ensureDatabaseOpen: (NSError **)error
{
// already created db connection
if (_contactDb != nil)
{
return YES;
}

NSLog(@">> ContactManager::ensureDatabaseOpen");
if (![self ensureDatabasePrepared:error])
{
return NO;
}

const char *dbpath = [_dbPath UTF8String];
if (sqlite3_open(dbpath, &_contactDb) != SQLITE_OK &&
error != nil)
{
*error = [[[NSError alloc] initWithDomain:@"ContactsManager" code:1000 userInfo:nil] autorelease];
return NO;
}

NSLog(@"opened");

return YES;
}

- (BOOL)ensureDatabasePrepared: (NSError **)error
{
// already prepared
if ((_dbPath != nil) &&
([[NSFileManager defaultManager] fileExistsAtPath:_dbPath]))
{
return YES;
}

// db in main bundle - cant edit. copy to library if !exist
NSString *dbTemplatePath = [[NSBundle mainBundle] pathForResource:@"contacts" ofType:@"db"];
NSLog(@"%@", dbTemplatePath);

NSString *libraryPath = [NSSearchPathForDirectoriesInDomains(NSLibraryDirectory, NSUserDomainMask, YES) lastObject];
_dbPath = [libraryPath stringByAppendingPathComponent:@"contacts.db"];

NSLog(@"dbPath: %@", _dbPath);

// copy db from template to library
if (![[NSFileManager defaultManager] fileExistsAtPath:_dbPath])
{
NSLog(@"db not exists");
NSError *error = nil;
if (![[NSFileManager defaultManager] copyItemAtPath:dbTemplatePath toPath:_dbPath error:&error])
{
return NO;
}

NSLog(@"copied");
}

return YES;
}

关于iphone - 无法使用iOS将数据插入sqlite3数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14257721/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com