如何在FMDB iOS中使用Vacuum

时间:2016-04-26 06:12:02

标签: ios objective-c sqlite fmdb

作为标题,如何使用Vacuum来缩小使用FMDB的SQLite数据库?

提前致谢!

2 个答案:

答案 0 :(得分:1)

感谢您的支持 我找到了答案:[数据库executeUpdate:@“vacuum”];

答案 1 :(得分:-1)

1.Database Updating

我有一个数据库控制器 - 我最新应用程序中的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];
        }
    });
}

以下是更新数据库调用的简单示例: 全部选择

- (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. 数据库提取

    要获取对象,应用程序会调用:

  2. 全部选择

    -[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进行数据库提取会返回FMResultSet。使用该resultSet,您可以单步执行并创建模型对象。

    3.保持记忆中的物体

    FMResultSet * resultSet = [self.database executeQuery:@"从some_table中选择uniqueID"];

    4.Web API

    - (void)uploadNote:(VSNote *)note {
        VSNoteAPICall *apiCall = [[VSNoteAPICall alloc] initWithNote:[note detachedCopy]];
        [self enqueueAPICall:apiCall];
    }
    

    5.处理Web API返回值

    VSNote *cachedNote = [self.mapTable objectForKey:downloadedNote.uniqueID];
    

    6.Database Migration

    [self.database executeUpdate:@"CREATE TABLE if not exists tags "
        "(uniqueID TEXT UNIQUE, name TEXT, deleted INTEGER, deletedModificationDate DATE);"];
    

    我希望,它会对你有帮助。