如何在 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);"];
  1. 数据库获取

    要获取对象,应用调用:

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"];