-2

サーバーからsqlite3ファイルをダウンロードして後で使用するアプリを開発していますが、ダウンロード後にデータを読み取ることができませんでした

私はこのコードを使用してダウンロードします:

myConnection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[myConnection start];

私はこのコードを使用してデータを取得します:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
    [myMutableData appendData:data];
}

そして私はこのコードを使ってファイルを保存します:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection
{
    [myMutableData writeToFile:kPath atomically:YES]
}

ファイルを保存した後、私はこのコードでそれを使用しようとします:

{
    const char *SQL = [@"SELECT * from table1" UTF8String];
    sqlite3 *database = NULL;
    NSString *file = kPath;
    if (sqlite3_open([file UTF8String], &database) == SQLITE_OK)
        sqlite3_exec(database, SQL, myCallback, (__bridge void*)myArray, NULL);
    sqlite3_close(database);
}

私のコールバック関数は次のとおりです。

static int myCallback(void *context, int count, char **values, char **columns) {
    // "count" is always zero !!

    return SQLITE_OK;
}

私の問題は次のとおりです。コールバック関数の「カウント」は常にゼロです!!

私を助けてください

4

2 に答える 2

0

解決しました!

私の間違いは次のとおりです。データベースファイルをローカルで更新しましたが、サーバーの愚かな間違いで更新するのを忘れました。

助けてくれてありがとう。

于 2013-03-09T06:46:59.743 に答える
0

いくつかの問題:

  1. データベース パスは次のようにする必要があります。

    • おそらく によって生成されるはずNSSearchPathForDirectoriesInDomainsです。

    • connectionDidFinishLoadingasで同じである必要がありsqlite3_openます。

    • プログラミング スタイルの問題として、 とは異なる変数名を使用したい場合がありますkPath。これは、それが定数であることを示唆している可能性がありますが、明らかにそうではありません。

  2. への呼び出しの結果を調べて、writeToFile正しく保存されたことを確認する必要があります。

  3. シミュレーターで実行している場合は、ダウンロード後にファイルを検査する必要があります (アプリ経由ではなく、Mac OS Finder で手動で... にあるはずです~/Library/Application Support/iPhone Simulator/...)。シミュレーターのフォルダーに移動し、ダウンロードされたファイルをチェックアウトします。ファイル サイズを見て、サーバーの値がダウンロードされたものと一致するかどうかを確認します。

  4. didFailWithErrorより微妙な問題の 1 つは、データベースの URL が HTTP プロトコルを使用していて見つからない場合、NSURLConnection. 結果のファイルを手動で検査して、ダウンロードが成功したことを確認します。

    HTTP 経由で使用NSURLConnectionおよびダウンロードしていて、エラーが発生していないことをプログラムで確認したい場合は、次を使用できますdidReceiveResponse

    - (void)connection:(NSURLConnection*)connection didReceiveResponse:(NSURLResponse *)response
    {
        if ([response isKindOfClass:[NSHTTPURLResponse class]])
        {
            NSHTTPURLResponse *httpResponse = (id)response;
    
            NSInteger statusCode = [httpResponse statusCode];
    
            if (statusCode == 200)
            {
                // everything is ok
            }
            else if (statusCode >= 400)
            {
                // something went wrong, such as statusCode == 404 or something like that
            }
        }
    }
    
  5. の初期化を示していませんmyMutableData。私はあなたがそれをしたと仮定します。追加していますが、その変数の初期化を怠ると、問題なく続行されますが、ファイルは保存されません。

    myMutableData = [[NSMutableData alloc] init];
    
  6. 前の問題は潜行性がありsqlite3_openます。データベースが存在しない場合、実行のプロセスでデータベースが作成されるからです。データベースを開くときに頻繁に使用sqlite3_open_v2するため、データベースが存在しない場合はエラーが発生する可能性があります (または、NSFileManager最初にファイルの存在を確認するために使用することをお勧めします)。作成された空白のデータベースが削除されるように、シミュレーターをリセットする (またはデバイスからアプリを削除する) ことsqlite3_openができます。

  7. 当面の問題とは関係ありませんが、余談ですが、NSURLConnectionコードはデータベース全体を RAM にロードしています。サイズが大きすぎない場合は問題ありませんが、ダウンロード プロセスのメモリ フットプリントを最小限に抑えるために、永続ストレージにストリーミングすることをお勧めします。これは、(シミュレーターではなく) デバイスでアプリを実行する場合に特に当てはまります。

于 2013-03-08T18:43:05.407 に答える