0

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.");
    }
}

アプリを起動した後の 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.");
    }
}
4

1 に答える 1

0

私は同じ問題を抱えていました、

アプリでSQLite Dbポータブルファイルを使用しましたが、シミュレーターではうまく機能していましたが、実際のデバイスでは機能していませんでした。

そのため、多くのことを掘り下げた後、sqlite dbファイルをプロジェクトにドラッグしたときに、Xcodeがそれを追加してリソースをバンドルしていないことがわかりました。

お願いします!この方向に行ってください

  1. プロジェクトを選択して、「ビルドフェーズ」に進みます
  2. database.sqlite(私が知っているように.sqliteである必要があります)ファイルをバンドルリソースに追加します。

ここに画像の説明を入力

すべての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ヘルパーメソッドを呼び出します

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

これで助けが必要な場合はお知らせください。

于 2013-03-07T06:14:00.183 に答える