Ios FMDB:提前放置数据
我通过FMDB管理SQLite数据 在这个应用程序中,我想提前放置数据,所以我通过terminal和Lita提前制作了dbfile sample.db,复制并导入到项目中。 问题是您无法更新数据库。 即使称为saveData,列标题也是空的。 我需要如何修复以更新数据库 ・在sample.db中,有一个表events。 ・表事件模式为id INTEGER主键自动递增、日文本、标题文本、时间整数; ・将数据事件添加到表事件中。 现在,调用saveData方法并将测试放入事件中 事件hIos FMDB:提前放置数据,ios,xcode,sqlite,fmdb,Ios,Xcode,Sqlite,Fmdb,我通过FMDB管理SQLite数据 在这个应用程序中,我想提前放置数据,所以我通过terminal和Lita提前制作了dbfile sample.db,复制并导入到项目中。 问题是您无法更新数据库。 即使称为saveData,列标题也是空的。 我需要如何修复以更新数据库 ・在sample.db中,有一个表events。 ・表事件模式为id INTEGER主键自动递增、日文本、标题文本、时间整数; ・将数据事件添加到表事件中。 现在,调用saveData方法并将测试放入事件中 事件h @inter
@interface Event : NSObject
@property (nonatomic, assign) NSInteger eventId;
@property (nonatomic, copy) NSString* day;
@property (nonatomic, copy) NSString* title;
@property (nonatomic, assign) NSInteger time;
DetailViewController.m
- (void)saveData:(id)sender
{
Event* newEvent = [[Event alloc]init];
newEvent.title = @“test";
[self.delegate editEventDidFinish:self.event newEvent:newEvent];
@end
- (void)viewDidLoad
{
[super viewDidLoad];
self.daoEvents = [[DaoEvents alloc] init];
}
- (void)editEventDidFinish:(Event *)oldEvent newEvent:(Event *)newEvent
{
[self.daoEvents update:newEvent];
[self.navigationController popViewControllerAnimated:YES];
}
- (void)removeOldEnent:(Event*)oldEvent
{
[self.daoEvents remove:oldEvent.eventId];
}
MasterViewController.m
- (void)saveData:(id)sender
{
Event* newEvent = [[Event alloc]init];
newEvent.title = @“test";
[self.delegate editEventDidFinish:self.event newEvent:newEvent];
@end
- (void)viewDidLoad
{
[super viewDidLoad];
self.daoEvents = [[DaoEvents alloc] init];
}
- (void)editEventDidFinish:(Event *)oldEvent newEvent:(Event *)newEvent
{
[self.daoEvents update:newEvent];
[self.navigationController popViewControllerAnimated:YES];
}
- (void)removeOldEnent:(Event*)oldEvent
{
[self.daoEvents remove:oldEvent.eventId];
}
DaoEvents.m
#define DB_FILE_NAME @“sample.db"
#define SQL_UPDATE @"UPDATE events SET day = ?, title = ?, time = ? WHERE id = ?;”
#define SQL_DELETE @"DELETE FROM events WHERE id = ?;"
- (FMDatabase *)dbConnect
{
NSArray *paths = NSSearchPathForDirectoriesInDomains( NSDocumentDirectory, NSUserDomainMask, YES );
NSString* dir = [paths objectAtIndex:0];
return [FMDatabase databaseWithPath:[dir stringByAppendingPathComponent:DB_FILE_NAME]];
}
- (BOOL)update:(Event *)event
{
FMDatabase* db = [self dbConnect];
[db open];
BOOL success = [db executeUpdate:SQL_UPDATE, event.day, event.title, [NSNumber numberWithInt:event.time],[NSNumber numberWithInteger:event.eventId]];
[db close];
NSLog(@"%@", event.title); //correctly outputs “test"
return success;
}
- (BOOL)remove:(NSInteger)eventId
{
FMDatabase* db = [self dbConnect];
[db open];
BOOL isSucceeded = [db executeUpdate:SQL_DELETE, [NSNumber numberWithInteger:eventId]];
[db close];
return isSucceeded;
}
我需要如何修复以更新数据库?
谢谢。您的UPDATE语句可能不会更新任何内容,因为没有具有该id值的记录。如果检查FMDB changes方法sqlite3_changes返回的值,它告诉您更新了多少行,我打赌它将返回零。当您执行更新并且WHERE子句找不到任何匹配项时,它不会导致错误,而是会在不更改任何数据的情况下悄悄地成功。changes方法可用于确认记录是否真正更新
您可以先检查是否有具有该id值的值,如果找到,则执行更新,如果没有,则执行插入。或者,如果您知道没有具有相同id值的值,您可以直接执行INSERT。在尝试执行更新之前,您正在删除记录。已删除的记录是您尝试更新的id的记录吗?如果是这样,如果你真的想更新它,就删除它。如果要删除和添加新记录,请执行插入而不是更新。