イメージ名などの情報を保存するために SQLite データベースを使用しています。データを挿入しようとしているときに例外が発生し、アプリケーションがクラッシュします。
テーブルを見つけることができなかったが、テーブルが既に存在するため、ブレークポイントと例外ブレークポイントを配置してクラッシュしました。
これを参照してください:
ここに私が得ているクラッシュレポートがあります:
*** Assertion failure in -[PhotosPage savePhotosToDB], /Users/apple/Desktop/Mayur_iPhone/My Home Projects/Daily Photos Application/29thMar2013_DailyPhotos/iPhone/PhotosPage.m:168
2013-03-29 14:21:53.398 DailyPhotos[881:c07] *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Error while creating add statement. 'no such table: PhotosTable''
*** First throw call stack:
(0x1b11012 0x1606e7e 0x1b10e78 0x5e5f35 0x9014 0x870d 0x161a705 0x92f920 0x92f8b8 0x9f0671 0x9f0bcf 0x9efd38 0x95f33f 0x95f552 0x93d3aa 0x92ecf8 0x26d7df9 0x26d7ad0 0x1a86bf5 0x1a86962 0x1ab7bb6 0x1ab6f44 0x1ab6e1b 0x26d67e3 0x26d6668 0x92c65c 0x7cad 0x1d45)
libc++abi.dylib: terminate called throwing an exception
(lldb)
データの挿入に使用しているコードは次のとおりです。
-(void)checkAndCreateDatabase
{
BOOL success;
databaseName = @"DailyPhotosDB.rdb";
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
NSString *documentsDir = [documentPaths objectAtIndex:0];
databasePath = [documentsDir stringByAppendingPathComponent:databaseName];
NSFileManager *fileManager = [NSFileManager defaultManager];
success = [fileManager fileExistsAtPath:databasePath];
if(success) return;
NSString *databasePathFromApp = [[NSBundle mainBundle] pathForResource:@"DailyPhotosDB" ofType:@"sqlite"];
[fileManager copyItemAtPath:databasePathFromApp toPath:databasePath error:nil];
[fileManager release];
}
-(void)savePhotosToDB
{
[self checkAndCreateDatabase];
sqlite3 *database;
static sqlite3_stmt * addStmt ;
NSFileManager *fileManager = [NSFileManager defaultManager];
NSError *error;
databaseName = @"DailyPhotosDB.rdb";
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
NSString *documentsDir = [documentPaths objectAtIndex:0];
databasePath = [documentsDir stringByAppendingPathComponent:databaseName];
BOOL success = [fileManager fileExistsAtPath:databasePath];
NSDateFormatter* df = [NSDateFormatter new];
[df setDateFormat:@"dd-MM-yyyy"];
NSString *strCurDate = [df stringFromDate:[NSDate date]];
if(!success)
{
NSString *defaultDBPath = [[NSBundle mainBundle] pathForResource:@"DailyPhotosDB" ofType:@"sqlite"];
success = [fileManager copyItemAtPath:defaultDBPath toPath:databasePath error:&error];
if (!success)
NSAssert1(0, @"Failed to create writable database file with message '%@'.", [error localizedDescription]);
}
if (sqlite3_open([databasePath UTF8String], &database) == SQLITE_OK)
{
const char *sql = "insert into PhotosTable(PhotoName,CreationDate) Values(?,?)";
if(sqlite3_prepare_v2(database, sql, -1, &addStmt, NULL) != SQLITE_OK)
NSAssert1(0, @"Error while creating add statement. '%s'", sqlite3_errmsg(database));
sqlite3_bind_text(addStmt, 1, [timeString UTF8String], -1, SQLITE_TRANSIENT);
sqlite3_bind_text(addStmt, 2, [strCurDate UTF8String], -1, SQLITE_TRANSIENT);
if(SQLITE_DONE != sqlite3_step(addStmt))
NSAssert1(0, @"Error while inserting data. '%s'", sqlite3_errmsg(database));
else
sqlite3_reset(addStmt);
}
sqlite3_close(database);
}
前もって感謝します...