Monday, 1 May 2017

Databse Using SQLManager in Swift

Databse Using SQLManager in Swift



Add framework : - 

- libsqlite3.tbd


Add NSObject File of Objective C : -


SQLManager.h :-


#import <Foundation/Foundation.h>
#import "sqlite3.h"

@interface SQLManager : NSObject

{
    char *errorDB ;
}

@property (assign , nonatomic) sqlite3 *DB ;

/* Open DB And Create table if not exist  */

-(void)createAndOpenDatabase ;

/* Get All User Info Details */

-(NSMutableDictionary *)getAllUserInfo ;

/* Insert User Data to "user_data" Table */

-(BOOL)insertKeyToDatabase:(NSString *)key value:(NSString *)value ;
-(void)updateDATA : (NSString *)value : (NSString *)key ;
-(void)DeleteData ;


@end


SQLManager.m :-


#import "SQLManager.h"

@implementation SQLManager

@synthesize DB ;

#pragma mark - Database Methods

-(void)createAndOpenDatabase
{
    //NSLog(@"called") ;
    
    [self openDB];
    [self createTable] ;
}

-(NSString *)documentsPath
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentDir = [paths objectAtIndex:0];
    NSLog(@"%@",paths);
    return [documentDir stringByAppendingPathComponent:@"ClPanic.sqlite"];
}

-(void)openDB
{
    if (sqlite3_open([[self documentsPath]UTF8String],&DB) == SQLITE_OK)
    {
        // NSLog(@"database opened");
    }
    else
    {
        sqlite3_close(DB);
        NSAssert(0, @"database failed to open");
    }
}

-(void) createTable
{
    // Table - [ User Data Table ]
    
    NSString *tableName = @"user_data";
    NSString *field1 = @"id";
    NSString *field2 = @"key";
    NSString *field3 = @"value";
    
    NSString *sql_stat = [NSString stringWithFormat:@"CREATE TABLE IF NOT EXISTS '%@' ('%@' " "INTEGER PRIMARY KEY AUTOINCREMENT, '%@' TEXT,'%@' TEXT);",tableName, field1, field2,field3];
    
    if (sqlite3_exec(DB, [sql_stat UTF8String], NULL, NULL, &errorDB) == SQLITE_OK &&
        sqlite3_exec(DB, [sql_stat UTF8String], NULL, NULL, &errorDB) == SQLITE_OK)
    {
        // NSLog(@"Table1 Created");
    }
    else
    {
        sqlite3_close(DB);
        NSAssert(0, @"Tabled failed to create.");
    }
}

#pragma mark - Get Data from DB

-(NSMutableDictionary *)getAllUserInfo
{
    NSMutableDictionary *userInfoDict = [[NSMutableDictionary alloc] init] ;
    
    NSMutableArray *keyArray = [[NSMutableArray alloc] init];
    NSMutableArray *valueArray = [[NSMutableArray alloc] init];
    
    NSString *display = [NSString stringWithFormat:@"SELECT * FROM user_data"];
    
    sqlite3_stmt *statement ;
    
    if (sqlite3_prepare_v2(DB, [display UTF8String], -1, &statement, nil) == SQLITE_OK)
    {
        while (sqlite3_step(statement) == SQLITE_ROW)
        {
            char *field = (char *) sqlite3_column_text(statement, 1);
            NSString *fieldStr = [[NSString alloc] initWithUTF8String:field];
            
            char *field2 = (char *) sqlite3_column_text(statement, 2);
            NSString *fieldStr2 = [[NSString alloc] initWithUTF8String:field2];
            
            [keyArray addObject:fieldStr] ;
            [valueArray addObject:fieldStr2] ;
        }
    }
    
    for (int i = 0 ; i < keyArray.count ; i++)
    {
        [userInfoDict setValue:[valueArray objectAtIndex:i] forKey:[keyArray objectAtIndex:i]] ;
    }
    
    return userInfoDict ;
}

#pragma mark - Insert User Data to table

-(BOOL)insertKeyToDatabase:(NSString *)key value:(NSString *)value
{
    NSString *insertTag = [NSString stringWithFormat:@"INSERT INTO user_data ('key','value') VALUES ('%@','%@')", key , value];
    
    if (sqlite3_exec(DB, [insertTag UTF8String], NULL, NULL, &errorDB) == SQLITE_OK)
    {
        return YES ;
    }
    else
    {
        return NO ;
    }
}

-(void)updateDATA : (NSString *)value : (NSString *)key
{
    sqlite3_stmt *updateStmt = nil;
    
    if (sqlite3_open([[self documentsPath] UTF8String], &DB) == SQLITE_OK)
    {
        if (updateStmt == nil)
        {
            const char *sql = "UPDATE user_data SET value =? where key = ?";
            
            if (sqlite3_prepare_v2(DB, sql, -1, &updateStmt, NULL) != SQLITE_OK)
                NSAssert1(0, @"Error while creating add statement. '%s'",sqlite3_errmsg(DB));
        }
        
        sqlite3_bind_text(updateStmt, 2, [key UTF8String], -1, SQLITE_TRANSIENT);
        
        sqlite3_bind_text(updateStmt, 1, [value UTF8String], -1, SQLITE_TRANSIENT);
        
        
        
        if (SQLITE_DONE != sqlite3_step(updateStmt))
            NSAssert1(0, @"Error while updating data. '%s'", sqlite3_errmsg(DB));
        else
        {
            sqlite3_finalize(updateStmt);
            sqlite3_close(DB);
        }
    }
    else
    {
        
        sqlite3_finalize(updateStmt);
        sqlite3_close(DB);
    }
    
}


-(void)DeleteData
{
    sqlite3_stmt *deleteStmnt = nil;
    
    if(sqlite3_open([[self documentsPath] UTF8String],&DB) == SQLITE_OK)
    {
        if(deleteStmnt == nil)
        {
            const char *sql = "delete from user_data";
            if(sqlite3_prepare_v2(DB, sql, -1, &deleteStmnt, NULL) != SQLITE_OK)
                NSAssert1(0, @"Error while creating delete statement. '%s'", sqlite3_errmsg(DB));
        }
        
        
        if (SQLITE_DONE != sqlite3_step(deleteStmnt))
            NSAssert1(0, @"Error while deleting. '%s'", sqlite3_errmsg(DB));
        
        else{
            
            sqlite3_finalize(deleteStmnt);
            sqlite3_close(DB);
        }
    }
    else{
        
        sqlite3_finalize(deleteStmnt);
        sqlite3_close(DB);
    }
}


@end




Add PCH file & Import This Class in File :-


#import "SQLManager.h"


Add This PCH file in Build Settings of Application target : -





Write Coding In Appdelegate : -

import UIKit


@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate {

    var window: UIWindow?
    
    var SQLManagerData = SQLManager()
    

    func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool {
    
        SQLManagerData.createAndOpenDatabase()
        
        if (userAlreadyLoggedIn()) {
        
            let appdelegate = UIApplication.shared.delegate as! AppDelegate
            let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
            let homeViewController = mainStoryboard.instantiateViewController(withIdentifier: "SecondViewController") as! SecondViewController
            let nav = UINavigationController(rootViewController: homeViewController)
            appdelegate.window!.rootViewController = nav
            
        }
        else
        {
            
        }
        
        return true
    }
    
    func userAlreadyLoggedIn() -> Bool {
        
        let userLoggedIn = SQLManagerData.getAllUserInfo() .value(forKey: "user_logged_in") as? String
        
        if (userLoggedIn == "Yes") {
            return true
        }
        else
        {
            return false
        }
    }
    
   

Write Coding In ViewController.swift : -

import UIKit


class ViewController: UIViewController {

    @IBOutlet weak var name: UITextField!
    @IBOutlet weak var Password: UITextField!
    
     var SQLManagerData = SQLManager()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view, typically from a nib.
    }

     @IBAction func saveData(_ sender: AnyObject) {
        
        SQLManagerData.createAndOpenDatabase()
        
        SQLManagerData .insertKey(toDatabase: "name", value: name.text)
        SQLManagerData .insertKey(toDatabase: "pass", value: Password.text)
        SQLManagerData .insertKey(toDatabase: "user_logged_in", value: "Yes")
        
        let secondViewController = self.storyboard?.instantiateViewController(withIdentifier: "SecondViewController") as! SecondViewController
        self.navigationController?.pushViewController(secondViewController, animated: true)
        
        
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }


}


Write Coding In SecondViewController.swift : -


import UIKit

class SecondViewController: UIViewController {

    var SQLManagerData = SQLManager()
    
    override func viewDidLoad() {
        super.viewDidLoad()

        // Do any additional setup after loading the view.
    }

    @IBAction func Logout(_ sender: AnyObject) {
        
        SQLManagerData.createAndOpenDatabase()
        
        SQLManagerData .insertKey(toDatabase: "name", value: "")
        SQLManagerData .insertKey(toDatabase: "pass", value: "")
        SQLManagerData .insertKey(toDatabase: "user_logged_in", value: "No")
        
        let secondViewController = self.storyboard?.instantiateViewController(withIdentifier: "ViewController") as! ViewController
        self.navigationController?.pushViewController(secondViewController, animated: true)
        
        
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    

    /*
    // MARK: - Navigation

    // In a storyboard-based application, you will often want to do a little preparation before navigation
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        // Get the new view controller using segue.destinationViewController.
        // Pass the selected object to the new view controller.
    }
    */

}









No comments:

Post a Comment