2013-03-07 5 views
0

Я написал простое приложение, которое использует базу данных Sqlite. Он отлично работает на симуляторе iPhone, но не работает на моем iPhone.Sqlite не работает на самом устройстве (на моем 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."); 
    } 
} 

Выход на 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."); 
    } 
} 
+0

Ошибка в методе 'insertRecord'. Покажите код этого метода. – rmaddy

+0

Также существует ли фактический файл в каталоге «Документы» на вашем устройстве? Как написано, ваше приложение просто открывает пустую (несуществующую) базу данных. Вам либо нужно скопировать предварительно подготовленный файл базы данных со всеми пустыми таблицами, либо вам нужно выполнить SQL для создания таблиц. – rmaddy

+0

@rmaddy делает хороший момент; если вы не включите предварительно сконфигурированную базу данных в комплекте, первое, что вам нужно сделать, это создать базу данных и ее схему. –

ответ

0

У меня была такая же проблема,

Я использовал SQLite Db портативный файл в приложении, и это очень хорошо работал на симуляторе, но не на реальном устройстве.

Итак, после многократного поиска, я обнаружил, что когда я перетащил файл sqlite db в свой проект, Xcode не добавил его для объединения ресурсов.

Пожалуйста! идти по этому пути

  1. выберите проект перейти к «Build Phases»
  2. добавить database.sqlite (это должно быть. SQLite, как я знаю) файл Bundle ресурсов.

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" 

и называем наш дб вспомогательный метод этот путь

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

Позвольте мне знать, если нужна помощь в этом.

Смежные вопросы