在ios上读取已经创建的sqlite文件

时间:2013-10-14 14:23:14

标签: ios sqlite

我有一个已经制作的.sqlite文件,我可以使用mozilla插件并查看所有字段和编辑/添加等。我想将此文件读入iphone应用程序。如何读取文件并将每个条目保存到新的NSObject中?

当我搜索这个问题时,我可以在stackoverflow上找到所有人都说要使用mozilla插件但实际上没有谈论事物的客观方面。

提前致谢, 奥利

2 个答案:

答案 0 :(得分:1)

要实现这一点,您需要一个通过将数据库从项目资源复制到应用程序使用的实际目录来创建数据库的类。

因此,像这样创建一个名为DataController的Objective C类。在DataController.h中你喜欢这个

#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

在它的实现中这样做。假设,您的数据库是bible.sqlite。它基本上做的是,它检查文档目录,如果数据库存在,如果不存在,它会将您已创建的数据库从项目资源复制到实际目录。这是代码。

#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

好的......我已经创建了两种方法来展示如何使用它。

首先,在Appdelegate.m中,您必须通过执行此操作来初始化数据库

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

现在,让我们使用它。这很简单。只需获取DataController的一个实例,并调用在数据库中运行SQL的方法,就像我编写的最后两个方法一样。希望它能解决你的问题。

答案 1 :(得分:0)

几个月前我遇到了同样的问题,我在youtube上找到了解决方案。

您必须将sqlite文件复制到捆绑包中,导入所有链接库,然后主要编写一些小代码。

这是一段视频,你不需要全部看,有点长。

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

如果您只是需要代码,请告诉我; D