Sqlite无法在实际设备上运行(在我的iPhone上)

时间:2013-03-07 00:24:14

标签: iphone ios sqlite

我写了一个使用Sqlite数据库的简单应用程序。它在iPhone模拟器上运行良好,但在我的iPhone上无效。

-(NSString *) getFilePath
{
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
NSUserDomainMask,YES);
NSString *documentsDir=[paths objectAtIndex:0];


return [documentsDir stringByAppendingPathComponent:@"database.sql"];
}

-(void)openDatabase
{
    //Open

    if (sqlite3_open([[self getFilePath] UTF8String], &db) != SQLITE_OK ) {
        sqlite3_close(db);
        NSAssert(0, @"Database failed to open.");
    }
}

启动app后在Xcode上输出:

2013-03-07 02:12:16.525 SqliteWorkApp[464:907] *** Assertion failure in -[SqliteWorkAppViewController insertRecord], /Users/cmltkt/Objective-C Apps/SqliteWorkApp/SqliteWorkApp/SqliteWorkAppViewController.m:77
2013-03-07 02:12:16.529 SqliteWorkApp[464:907] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Error updating table.'
*** First throw call stack:
(0x3398e2a3 0x3b82797f 0x3398e15d 0x34263ab7 0x19b3b 0x195bd 0x357b5595 0x357f5d79 0x357f1aed 0x358331e9 0x357f683f 0x357ee84b 0x35796c39 0x357966cd 0x3579611b 0x374885a3 0x374881d3 0x33963173 0x33963117 0x33961f99 0x338d4ebd 0x338d4d49 0x357ed485 0x357ea301 0x19147 0x3bc5eb20)
libc++abi.dylib: terminate called throwing an exception

insertRecord函数:

-(void)insertRecord
{
    NSString *sql = [NSString stringWithFormat:@"INSERT OR REPLACE INTO 'countries' ('name', 'flag') " "VALUES ('Sample Data','Sample Data')"];

    char *err;
    if (sqlite3_exec(db, [sql UTF8String], NULL, NULL, &err)
        != SQLITE_OK) {
        sqlite3_close(db);
        NSAssert(0, @"Error updating table.");
    }
}

1 个答案:

答案 0 :(得分:0)

我有同样的问题,

我在应用程序中使用了SQLite Db可移植文件,它在模拟器上运行得非常好,但在真实设备上却没有。

所以经过深入挖掘后,我发现,当我将sqlite db文件拖入我的项目时,Xcode没有将它添加到捆绑资源中。

请!走这条路

  1. 选择您的项目转到“构建阶段”
  2. 将您的 database.sqlite (应该是我知道的.sqlite)文件添加到Bundle资源。
  3. enter image description here

    并且为了处理所有SQLite的东西,我的数据库助手类代码是

    #import "ASCODBHelper.h"
    #import <sqlite3.h>
    
    @implementation ASCODBHelper
    
    static ASCODBHelper *db;
    
    
    +(ASCODBHelper *)database{
    
        if (db == nil) {
    
            db = [[ASCODBHelper alloc] init];
        }
    
        return db;
    }
    
    - (id)init{
    
        self = [super init];
    
        if (self) {
    
            NSString *sqLiteDb = [[NSBundle mainBundle] pathForResource:@"IOSMeeting" ofType:@"sqlite"];
    
            if (sqlite3_open([sqLiteDb UTF8String], &db) != SQLITE_OK) {
    
                NSLog(@"Failed to open database!");       
            }
    
        }
        return self;
    }
    
    -(void)getPresentationDeatilById:(NSString *)presentationid andSessionId:(NSString *)sessionid{
    
        NSInteger pId = [presentationid integerValue];
        NSInteger sId = [sessionid integerValue];
    
        NSString *queryString = [[NSString alloc] initWithFormat:@"SELECT distinct mediaID,mediaURL,meetingName,trackName FROM Media WHERE presentationID='%d' and sessionID ='%d'",pId,sId];
    
        NSLog(@"query is  : %@",queryString);
    
        sqlite3_stmt *selectStatement;
    
        if (sqlite3_prepare_v2(db, [queryString UTF8String], -1, &selectStatement, nil) == SQLITE_OK) {
            while (sqlite3_step(selectStatement) == SQLITE_ROW) {
    
                char *mediaid = (char *) sqlite3_column_text(selectStatement, 0);
                char *mediaurl = (char *) sqlite3_column_text(selectStatement, 1);
                char *meetingname = (char *) sqlite3_column_text(selectStatement, 2);
                char *topicname = (char *) sqlite3_column_text(selectStatement, 3);
    
                NSString *mediaID = [[NSString alloc] initWithUTF8String:mediaid];
                NSString *mediaURL = [[NSString alloc] initWithUTF8String:mediaurl];
                NSString *topicName = [[NSString alloc] initWithUTF8String:topicname];
                NSString *meetingName = [[NSString alloc] initWithUTF8String:meetingname];
    
                //you can log here results            
    
            }
            sqlite3_finalize(selectStatement);
        }  
    }        
    
    @end
    

    以下是我如何使用它的代码。

    只需导入

    #import "ASCODBHelper.h"
    

    以这种方式调用我们的db helper方法

    [[ASCODBHelper database] getPresentationDeatilById:presentationId andSessionId:sessionId];
    

    如果需要帮助,请告诉我。