如何在 FMDB 中使用 Vacuum iOS
How to use Vacuum in FMDB iOS
如题,如何使用Vacuum使用FMDB收缩SQLite数据库?
提前致谢!
1.Database 更新中
我有一个数据库控制器——我最新应用程序中的 VSDatabaseController——它通过 FMDB 与 SQLite 对话。
FMDB 区分更新和查询。要更新数据库,应用调用:
-[VSDatabaseController runDatabaseBlockInTransaction:(VSDatabaseUpdateBlock)databaseBlock]
VSDatabaseUpdateBlock 很简单:
typedef void (^VSDatabaseUpdateBlock)(FMDatabase *database);
runDatabaseBlockInTransaction 也很简单:
- (void)runDatabaseBlockInTransaction:(VSDatabaseUpdateBlock)databaseBlock {
dispatch_async(self.serialDispatchQueue, ^{
@autoreleasepool {
[self beginTransaction];
databaseBlock(self.database);
[self endTransaction];
}
});
}
下面是一个调用更新数据库的简单示例:
SELECT全部
- (void)emptyTagsLookupTableForNote:(VSNote *)note {
NSString *uniqueID = note.uniqueID;
[self runDatabaseBlockInTransaction:^(FMDatabase *database) {
[database executeUpdate:
@"delete from tagsNotesLookup where noteUniqueID = ?;", uniqueID];
}];
}
[self.database executeUpdate:
@"CREATE INDEX if not exists noteUniqueIDIndex on tagsNotesLookup (noteUniqueID);"];
数据库获取
要获取对象,应用调用:
SELECT全部
-[VSDatabaseController runFetchForClass:(Class)databaseObjectClass
fetchBlock:(VSDatabaseFetchBlock)fetchBlock
fetchResultsBlock:(VSDatabaseFetchResultsBlock)fetchResultsBlock];
These two lines do much of the work:
SELECT ALL
FMResultSet *resultSet = fetchBlock(self.database);
NSArray *fetchedObjects = [self databaseObjectsWithResultSet:resultSet
class:databaseObjectClass];
使用 FMDB returns FMResultSet 的数据库提取。使用该结果集,您可以单步执行并创建模型对象。
3.Keeping 内存中的对象
FMResultSet *resultSet = [self.database executeQuery:@"select uniqueID from some_table"];
4.WebAPIs
- (void)uploadNote:(VSNote *)note {
VSNoteAPICall *apiCall = [[VSNoteAPICall alloc] initWithNote:[note detachedCopy]];
[self enqueueAPICall:apiCall];
}
5.Handling 网络 API Return 值
VSNote *cachedNote = [self.mapTable objectForKey:downloadedNote.uniqueID];
6.Database 迁移
[self.database executeUpdate:@"CREATE TABLE if not exists tags "
"(uniqueID TEXT UNIQUE, name TEXT, deleted INTEGER, deletedModificationDate DATE);"];
希望对你有所帮助
感谢大家的支持
我找到了答案:[database executeUpdate:@"vacuum"];
如题,如何使用Vacuum使用FMDB收缩SQLite数据库?
提前致谢!
1.Database 更新中
我有一个数据库控制器——我最新应用程序中的 VSDatabaseController——它通过 FMDB 与 SQLite 对话。 FMDB 区分更新和查询。要更新数据库,应用调用:
-[VSDatabaseController runDatabaseBlockInTransaction:(VSDatabaseUpdateBlock)databaseBlock]
VSDatabaseUpdateBlock 很简单:
typedef void (^VSDatabaseUpdateBlock)(FMDatabase *database);
runDatabaseBlockInTransaction 也很简单:
- (void)runDatabaseBlockInTransaction:(VSDatabaseUpdateBlock)databaseBlock {
dispatch_async(self.serialDispatchQueue, ^{
@autoreleasepool {
[self beginTransaction];
databaseBlock(self.database);
[self endTransaction];
}
});
}
下面是一个调用更新数据库的简单示例: SELECT全部
- (void)emptyTagsLookupTableForNote:(VSNote *)note {
NSString *uniqueID = note.uniqueID;
[self runDatabaseBlockInTransaction:^(FMDatabase *database) {
[database executeUpdate:
@"delete from tagsNotesLookup where noteUniqueID = ?;", uniqueID];
}];
}
[self.database executeUpdate:
@"CREATE INDEX if not exists noteUniqueIDIndex on tagsNotesLookup (noteUniqueID);"];
数据库获取
要获取对象,应用调用:
SELECT全部
-[VSDatabaseController runFetchForClass:(Class)databaseObjectClass
fetchBlock:(VSDatabaseFetchBlock)fetchBlock
fetchResultsBlock:(VSDatabaseFetchResultsBlock)fetchResultsBlock];
These two lines do much of the work:
SELECT ALL
FMResultSet *resultSet = fetchBlock(self.database);
NSArray *fetchedObjects = [self databaseObjectsWithResultSet:resultSet
class:databaseObjectClass];
使用 FMDB returns FMResultSet 的数据库提取。使用该结果集,您可以单步执行并创建模型对象。
3.Keeping 内存中的对象
FMResultSet *resultSet = [self.database executeQuery:@"select uniqueID from some_table"];
4.WebAPIs
- (void)uploadNote:(VSNote *)note {
VSNoteAPICall *apiCall = [[VSNoteAPICall alloc] initWithNote:[note detachedCopy]];
[self enqueueAPICall:apiCall];
}
5.Handling 网络 API Return 值
VSNote *cachedNote = [self.mapTable objectForKey:downloadedNote.uniqueID];
6.Database 迁移
[self.database executeUpdate:@"CREATE TABLE if not exists tags "
"(uniqueID TEXT UNIQUE, name TEXT, deleted INTEGER, deletedModificationDate DATE);"];
希望对你有所帮助
感谢大家的支持 我找到了答案:[database executeUpdate:@"vacuum"];