Use and Access Existing SQLite Database on iOS

后端 未结 5 2062
青春惊慌失措
青春惊慌失措 2020-11-27 14:23

I have a fully populated database in SQLite that I\'d like to use in my new app. It\'s rather large, so I\'d like to avoid changing it to another format if possible. How can

5条回答
  •  隐瞒了意图╮
    2020-11-27 14:48

    This following methods will help you to handle database

    Method for copy database in document directory if not exist

    -(void)copyDatabase
    {
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *insPath = [NSString stringWithFormat:@"Instamontage.sqlite"];
        destPath = [documentsDirectory stringByAppendingPathComponent:insPath];
        NSString *srcPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:insPath];
    // NSLog(@"\n src %@ \n dest %@", srcPath, destPath);
       if (![[NSFileManager defaultManager] fileExistsAtPath:destPath])
       {
        NSError *error;
        NSLog(@"not exist");
        [[NSFileManager defaultManager] copyItemAtPath:srcPath toPath:destPath error:&error];
       }
       else
       {
          NSLog(@"exist");
       }
    }
    

    Method for insert/deleting/updating table

    -(BOOL)dataManipulation: (NSString *)query
    {
        BOOL result=NO;
       if (sqlite3_open([destPath UTF8String], &connectDatabase)==SQLITE_OK)
       {
          sqlite3_stmt *stmt;
    
          if (sqlite3_prepare_v2(connectDatabase, [query UTF8String], -1, &stmt, NULL)==SQLITE_OK)
        {
            sqlite3_step(stmt);
            result=YES;
        }
        sqlite3_finalize(stmt);
      }
    
      sqlite3_close(connectDatabase);
      return result;
    }
    

    Method for getting rows from table

    -(NSMutableArray *)getData: (NSString *)query
    {
        NSMutableArray *arrData=[[NSMutableArray alloc]init];
        if (sqlite3_open([destPath UTF8String],&connectDatabase)==SQLITE_OK)
        {
            sqlite3_stmt *stmt;
            const char *query_stmt = [query UTF8String];
    
            if (sqlite3_prepare_v2(connectDatabase,query_stmt, -1, &stmt, NULL)==SQLITE_OK)
            {
                while (sqlite3_step(stmt)==SQLITE_ROW)
                {
                    NSMutableDictionary *dictResult=[[NSMutableDictionary alloc] init];
    
                    for (int i=0;i

    Above methods in swift will written as below

    Method for copy database in document directory if not exist

    func copyDatabaseToDocumentDirectory() {
        let directoryList = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)
        var documentDirectory = directoryList.first
        documentDirectory?.append("/DatabasePract1.sqlite")
        print(documentDirectory!)
    
        if !FileManager.default.fileExists(atPath: documentDirectory!) {
            let databaseBundlePath = Bundle.main.path(forResource: "DatabasePract1", ofType: "sqlite")
            do {
               try FileManager.default.copyItem(atPath: databaseBundlePath!, toPath: documentDirectory!)
                self.databasePath = documentDirectory
            } catch {
                print("Unable to copy database.")
            }
        } else {
            print("database exist")
            self.databasePath = documentDirectory
        }
    }
    

    Method for insert/deleting/updating table

    func dataManipulation(query: String) -> Bool {
        var database: OpaquePointer?
        var result = false
    
        if (sqlite3_open(databasePath, &database) == SQLITE_OK) {
            var queryStatement: OpaquePointer?
            if (sqlite3_prepare_v2(database, query, -1, &queryStatement, nil) == SQLITE_OK) {
                sqlite3_step(queryStatement)
                result = true
            } else {
                let errmsg = String(cString: sqlite3_errmsg(database)!)
                print("error preparing insert: \(errmsg)")
            }
            sqlite3_finalize(queryStatement)
        }
        sqlite3_close(database)
        return result
    }
    

    Method for getting rows from table

    func fetchData(_ query: String) -> [[String:Any]] {
        var database: OpaquePointer?
        var arrData: [[String:Any]] = []
    
        if (sqlite3_open(databasePath, &database) == SQLITE_OK) {
            var stmt:OpaquePointer?
            if sqlite3_prepare(database, query, -1, &stmt, nil) != SQLITE_OK{
                let errmsg = String(cString: sqlite3_errmsg(database)!)
                print("error preparing insert: \(errmsg)")
                return arrData
            } 
    
            while(sqlite3_step(stmt) == SQLITE_ROW) {
                var dictData: [String: Any] = [:]
                for i in 0..

提交回复
热议问题