FMDB:提前放数据
Posted
技术标签:
【中文标题】FMDB:提前放数据【英文标题】:FMDB: put the data in advance 【发布时间】:2014-04-03 17:41:24 【问题描述】:我通过 FMDB 管理 SQLite 数据。
在这个App中,我想提前放数据,所以我把terminal
和terminal
和Lita
提前做了dbfilesample.db
,复制过来导入到项目中。
问题是您无法更新数据库。
即使称为saveData
,列title
也是空的。
我需要如何修复才能更新数据库?
・在sample.db
,有一个表events
。
・表events
架构是(id INTEGER PRIMARY KEY AUTOINCREMENT, day TEXT, title TEXT, time INTEGER);
・您将数据Event
添加到表events
。
现在,您调用方法saveData
并将"test"
放入events
。
事件.h
@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
MasterViewController.m
- (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;
我需要如何修复才能更新数据库? 谢谢。
【问题讨论】:
您在尝试更新之前正在删除一条记录。删除的记录是您要更新的带有id
的记录吗?如果是这样,如果您真的打算更新它,请删除DELETE
。如果您打算删除并添加新记录,请使用INSERT
而不是UPDATE
。
【参考方案1】:
您的UPDATE
语句可能不会更新任何内容,因为没有具有该id
值的记录。如果您检查 FMDB changes
方法 (sqlite3_changes()
) 返回的值,它告诉您更新了多少行,我敢打赌它将返回零。当您执行UPDATE
并且WHERE
子句未能找到任何匹配项时,它不会导致错误,而是会在不更改任何数据的情况下悄悄成功。 changes
方法可以用来确认记录是否真的更新了。
您可以先检查是否存在具有该id
值的值,如果找到则执行UPDATE
,否则执行INSERT
。或者,如果你知道不会有相同的id
值,你可以直接做INSERT
。
【讨论】:
以上是关于FMDB:提前放数据的主要内容,如果未能解决你的问题,请参考以下文章
如何在 IOS Swift 中使用 SQLite 使用 FMDB 处理多个线程