0

sqliteデータベースへの接続に問題があります。xcodeバージョン4.4.1を使用しています。

これが私のコードです。

NSString *docsDir;
NSArray *dirPaths;

// Get the documents directory
dirPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

docsDir = [dirPaths objectAtIndex:0];

// Build the path to the database file
databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent: @"signature.db"]];

NSFileManager *filemgr = [NSFileManager defaultManager];

if ([filemgr fileExistsAtPath: databasePath ] == NO)
{
    const char *dbpath = [databasePath UTF8String];

    if (sqlite3_open(dbpath, &database) == SQLITE_OK)
    {
        status.text = @"Connected..";

    } else {
        status.text = @"Failed to open/create database..";
    }
}

[filemgr release];

なにか提案を..?

ありがとう、

ブーム

4

2 に答える 2

0

データベースが存在するかどうかを確認する必要はありません。sqlite3_open_v2()参照)は、データベースが存在しない場合、フラグを渡すとデータベースを作成しますSQLITE_OPEN_CREATE

NSString *dbPath = [[NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES) objectAtIndex:0] stringByAppendingPath:@"signature.db"];

if (sqlite3_open_v2([dbPath UTF8String], &database, SQLITE_OPEN_READWRITE|SQLITE_OPEN_CREATE) == SQLITE_OK)
{
    status.text = @"Connected..";
    // Check the schema and install if it doesn't exist
    sqlite3_close(database);
} else {
    status.text = @"Failed to open/create database..";
}
于 2013-01-11T16:14:51.520 に答える
0

アプリのバンドルにビルド済みの DB ファイルがある場合は、DB ファイルが配置されているかどうかを確認して、ドキュメント フォルダーにドロップできるようにすることをお勧めします。もちろん、アプリを強化する場合、スキーマの変更はすべてコードで行う必要があります。これが私が使用するコードです(動作しますが、少し更新する必要があります)

DB を開く/作成するときに、これを使用して DB ファイルの場所を指定します。私の場所はiOSとMac OS Xで異なり、DBコードを両方で動作させたいので、initには入れません。

NSString *dbFilePath;
NSArray *searchPaths = NSSearchPathForDirectoriesInDomains (NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentFolderPath = searchPaths[0];
dbFilePath = [documentFolderPath stringByAppendingPathComponent: @"MyDBFile.db"];
MyDB* appDB = [[EasySpendLogDB alloc] initWithFile:dbFilePath];
if(!appDB) {
    // show error
    return;
}

これは私の DB アクセス クラスにあります。私が書いたいくつかのラッパークラスを使用しています:

- (id) initWithFile: (NSString*) filePathName {
if(!(self = [super init])) return nil;

BOOL myPathIsDir;
BOOL fileExists = [[NSFileManager defaultManager]
                         fileExistsAtPath: filePathName
                         isDirectory: &myPathIsDir];
NSString *backupDbPath = [[NSBundle mainBundle]
                                  pathForResource:@"MyDBFile"
                                  ofType:@"db"];

if (backupDbPath != nil && !fileExists) {
    [[NSFileManager defaultManager]
                            copyItemAtPath:backupDbPath
                            toPath:filePathName
                            error:nil];
}

db = [[ABSQLiteDB alloc] init];
if(![db connect:filePathName]) {
    return nil;
}

[self checkSchema]; // this is where schema updates are done (see project sample)

return self;
}

また、サンプル プロジェクトを含む、私が作成したこの Objective-C ラッパーを確認することもできます: https://github.com/AaronBratcher/ABSQLite

于 2013-07-23T13:12:55.223 に答える