@interface database : NSObject { sqlite3 * db; sqlite3_stmt * query; NSString *queryString; NSString *dbPath; } - (void) opendb; - (BOOL)attach_user_databases; @end @implementation database - (void) opendb { dbpath = [[NSBundle mainBundle] pathForResource:@"levels" ofType:@"db"]; sqlite3_open([dbpath UTF8String], &db); [self attach_user_databases]; sqlite3_prepare_v2(db, [queryString UTF8String], -1, &query, NULL); } - (BOOL)attach_user_databases { int dbcount = 0, result; NSFileManager *fm = [NSFileManager defaultManager]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSDirectoryEnumerator *docs = [fm enumeratorAtPath:documentsDirectory]; NSString *file; while ((file = [docs nextObject])) { if ([[file pathExtension] isEqualToString:@"sqlite3"]) { ++dbcount; NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:file]; sqlite3_stmt *attach; sqlite3_prepare_v2(db,[[NSString stringWithFormat:@"ATTACH DATABASE '%@' AS 'DB%i'",fullPath,dbcount] UTF8String], -1, &attach, NULL); sqlite3_step(attach); sqlite3_finalize(attach); } } if (dbcount == 0) { queryString = @"SELECT * FROM levels WHERE ROWID=?"; return NO; } else { sqlite3_stmt *cview; NSMutableString *createView = [NSMutableString stringWithString:@"CREATE TEMP VIEW LV AS SELECT * FROM levels"]; for (int i=1;i<=dbcount;++i) { [createView appendFormat:@" UNION SELECT * FROM DB%i.levels",i]; } sqlite3_prepare_v2(db, [createView UTF8String], -1, &cview, NULL); sqlite3_step(cview); sqlite3_finalize(cview); queryString = @"SELECT * FROM LV WHERE ROWID=?"; return YES; } } @end
Opening multiple databases with SQLite
最新推荐文章于 2024-07-11 09:01:21 发布