Oli Black
Oli Black

Reputation: 441

Reading an already made sqlite file on ios

I have an already made .sqlite file, I can use the mozilla plugin and see all the fields and edit/add etc. I want to read this file into an iphone application. How do I approach reading the file and saving each entry into a new NSObject?

All I can find on stackoverflow when I search for this question is people saying to use the mozilla plugin but not actually talk about the objective-c side of things.

Thanks in advance, Oli

Upvotes: 0

Views: 267

Answers (2)

ayon
ayon

Reputation: 2180

To achieve this , you'll need a class that creates the database by copying the database from your project resource to the actual directory that app use.

So, create a Objective C class called DataController like this. In DataController.h do like this

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

@interface DataController : NSObject
{
    sqlite3 *databaseHandler ;
}

-(void)initDatabase;
-(NSArray*)getBooks;
-(NSString*)getChapter:(NSString*) bible:(NSString*) book:(NSString*) chapter;

@end

In it's implementation do like this. Assume, your database is bible.sqlite . What it basically do is , it checks the document directory that if the database exists , if not it copies your already created database from your project resource to actual directory. Here's the codes.

#import "DataController.h"
#import <sqlite3.h>

@implementation DataController


-(void)initDatabase
{
    // Create a string containing the full path to the sqlite.db inside the documents folder
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *databasePath = [documentsDirectory stringByAppendingPathComponent:@"Bibles.sqlite"];

    // Check to see if the database file already exists
    bool databaseAlreadyExists = [[NSFileManager defaultManager] fileExistsAtPath:databasePath];

    // Open the database and store the handle as a data member
    if (sqlite3_open([databasePath UTF8String], &databaseHandler) == SQLITE_OK)
    {
        // Create the database if it doesn't yet exists in the file system
        if (!databaseAlreadyExists)
        {
            NSLog(@"Database doesn't Exists");
            BOOL success = NO ;
            NSFileManager *filemngr = [NSFileManager defaultManager];
            NSError *error;
            NSString *defaultDbPath = [[[NSBundle mainBundle] resourcePath]stringByAppendingPathComponent:@"Bibles.sqlite"];
            NSLog(@"Size : %lld" , [[[NSFileManager defaultManager] attributesOfItemAtPath:defaultDbPath error:nil] fileSize]);
            [filemngr removeItemAtPath:databasePath error:&error];
            success = [filemngr copyItemAtPath:defaultDbPath toPath:databasePath error:&error];
            if (!success){
                NSLog(@"Error : %@" , [error localizedDescription]);
            } else{
                NSLog(@"Copy Successful");
                NSLog(@"Size : %lld" , [[[NSFileManager defaultManager] attributesOfItemAtPath:databasePath error:nil] fileSize]);

            }
        } else{
            NSLog(@"Database already Exists of Size : %lld" , [[[NSFileManager defaultManager] attributesOfItemAtPath:databasePath error:nil] fileSize]);
        }
    }
}

- (void)dealloc {
    sqlite3_close(databaseHandler);
}

-(NSArray*)getBooks
{
    NSMutableArray *Books = [[NSMutableArray alloc]init];
    NSString *queryStatement = [NSString stringWithFormat:@"SELECT Name FROM Book ORDER BY ID"];

    sqlite3_stmt *statement;

    if (sqlite3_prepare_v2(databaseHandler, [queryStatement UTF8String], -1, &statement, NULL) == SQLITE_OK)
    {
        while (sqlite3_step(statement) == SQLITE_ROW) {
            NSString *bookName = [NSString stringWithUTF8String:(char*)sqlite3_column_text(statement, 0)];
            [Books addObject:bookName];
            NSLog(@"Book : %@" , bookName);
        } 
        sqlite3_finalize(statement);
    } else{
        NSLog(@"Error : %s",sqlite3_errmsg(databaseHandler));
    }
    return Books ;
}



-(NSString*)getChapter:(NSString*) bible:(NSString*) book:(NSString*) chapter{
    NSString *verse = [[NSString alloc]init];

    NSString *queryStatement = [NSString stringWithFormat:@"SELECT Text FROM %@ WHERE BookID = %@ AND Chapter = %@" , bible , book , chapter];

    sqlite3_stmt *statement;
    if (sqlite3_prepare_v2(databaseHandler, [queryStatement UTF8String], -1, &statement, NULL) == SQLITE_OK)
    {
        while (sqlite3_step(statement) == SQLITE_ROW) {
            NSString *temp = [NSString stringWithUTF8String:(char*)sqlite3_column_text(statement, 0)];
            verse = [[NSString alloc]initWithFormat:@"%@\n\n%@",verse ,temp];
          //  NSLog(@"Book : %@" , verse);
        }
        sqlite3_finalize(statement);
    }

    return verse ;
}

@end

Ok...I have created 2 methods for you to show how to use it.

Firstly , in Appdelegate.m , you have to init the database by doing this

DataController *c = [[DataController alloc]init];
[c initDatabase];

Now , let's use it. It's very simple. Just take an instance of DataController and call the method that runs SQL within the database like the last 2 methods I have written. Hope it solves your problem.

Upvotes: 1

Albara
Albara

Reputation: 1296

I had the same issue a couple of months ago, I found the solution in youtube.

You have to copy your sqlite file to your bundle, import all the link libraries then write some small pieces of code mainly.

Here's a video, you don't need to watch it all, its kinda long.

https://www.youtube.com/watch?v=SVMorX_2Ymk

If you just need the codes let me know ;D

Upvotes: 0

Related Questions