2

私はsqlite dbを開きたいのですが、それは私のmainBundleにはありませんが、サーバーにはありません。

NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"info.sqlite"];

しかし、私は持っています

NSString *filePath = @"http://serverAddress/info.sqlite";
NSURL *url = [NSURL URLWithString:filePath];
NSData *myData = [NSData dataWithContentsOfURL:url];

そして、このデータベースを読んだら何ができるでしょうか? 私のデータベースがmainBundle内にある場合、私はこれを行います:

if (sqlite3_open([filePath UTF8String], &database) == SQLITE_OK) {

        const char *sql = "select id, one, two from TABLE";
        sqlite3_stmt *selectstmt;

        if(sqlite3_prepare_v2(database, sql, -1, &selectstmt, NULL) == SQLITE_OK) {

            while(sqlite3_step(selectstmt) == SQLITE_ROW) {

                idNum = [NSNumber numberWithInt:(int)sqlite3_column_int(selectstmt, 0)];
                ...
                ...

しかし、NSData があるとしたら? 手伝って頂けますか?

4

2 に答える 2

3

SQLite は「サーバーレス」です。サーバーでホストされている SQLite ファイルにデバイスからアクセスすることはできません。読み取り専用データベースの場合は、最初にダウンロードするか、別のデータベース サーバー (およびクライアント) を使用できます。

ファイルをドキュメント ディレクトリに保存し、後で読み取るには、次のコードを追加します。

NSString *documentsDirectory = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString* filePath = [documentsDirectory stringByAppendingPathComponent:@"database.sqlite"];

[data writeToFile:filePath atomically:NO];

おそらく最善の策は、データベースの周りに薄い Web サービス ラッパーを公開することです。直接のリモート データベース アクセスの代わりに Web サービスを使用することには、さらに多くの利点があります。詳細については、このブログ投稿を参照してください。

于 2013-02-25T17:24:34.137 に答える
-1

アプリケーションをリリースするときに、バンドルするのではなく、最新のデータベース バンドルをダウンロードする必要があると思います。これで、データベース ファイルがダウンロードされ、NSDataフォーマットで利用できるようになります。

ソリューションが単純な場合は、NSDatato ファイルをドキュメント ディレクトリに保存するだけで ( NSData をファイルに保存する方法はこちらを参照してください)、通常の方法でバンドルの読み込みを続けます。このような、

NSString *defaultDBPath = [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@"info.sqlite"];

ファイル「info.sqlite」をロードする前に、NSData からファイルに保存する必要があることに注意してください。私はこれを試していませんが、うまくいくはずです:)

ハッピーコーディング!!!

于 2013-02-25T17:29:49.453 に答える