2

(xamarin.ios を使用して) zumero と sqllite db の同期を開始する際に問題が発生しました。同期コマンドをセットアップしました:

cmd.CommandText = 
    @"SELECT zumero_sync(
    'main', 
    @server_url, 
    @dbfile, 
    zumero_internal_auth_scheme('zumero_users_admin'), 
    @credentials_username, 
    @credentials_password, 
    @temp_path
    );";

cmd.Parameters.AddWithValue ("@server_url", "https://zinst*****.s.zumero.net");
cmd.Parameters.AddWithValue ("@dbfile", dbPath);
cmd.Parameters.AddWithValue ("@credentials_username", "myusername");
cmd.Parameters.AddWithValue ("@credentials_password", "*mypassword*");
cmd.Parameters.AddWithValue ("@temp_path", System.IO.Path.GetTempPath());

しかし、例外が発生しています:

Unhandled managed exception: Object reference not set to an instance of an object (System.NullReferenceException)
  at System.Data.SQLite.SQLiteConnection.GetPointer () [0x00000] in <filename unknown>:0 
  at System.Data.SQLite.SQLiteConnection.ZumeroRegister () [0x00000] in <filename unknown>:0 
  at (wrapper remoting-invoke-with-check) System.Data.SQLite.SQLiteConnection:ZumeroRegister ()

これでdbNameを設定しました:

string personalFolder = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
string dbName = "***.db";
string dbPath = Path.Combine ( personalFolder, dbName);

var conn = new SQLiteConnection ("Data Source=" + dbPath); 
conn.Open (); 
conn.ZumeroRegister();

うまくいけば、誰かが私が間違っていることを理解できるでしょうか? ありがとう。

4

1 に答える 1

1

私が目にする最初の問題は、おそらくあなたが得ているエラーの原因ではありません:

zumero_sync() の dbfile 引数は、サーバー上の dbfile の名前である必要があります。これは、クライアント上の対応する dbfile の名前/パスとは異なります。

コード スニペットから、dbPath を new SQLiteConnection() に渡しているように見えますが、これは正しいですが、同じ文字列を @dbfile パラメータに渡しているため、あまり正しくありません。:-)

クライアントでは、SQLite ファイルの管理はユーザーの責任であり、Zumero は気にしません。もちろん、ファイルはそのパスによって識別されます。

サーバー上では、SQLite ファイルの管理はすべてサーバーによって処理され、ファイルは名前で識別されます。名前空間はフラットで、命名規則は厳密です。サーバー上の dbfile 名には、小文字と数字のみを含める必要があり、小文字で始める必要があります。

エラーについてですが、SQLiteファイルが存在するかどうか疑問に思っていますか? Tasky サンプルのスニペットを次に示します。

    private SQLiteConnection GetConnection ()
    {
        bool exists = File.Exists (_path);

        if (!exists)
        {
            SQLiteConnection.CreateFile (_path);
        }

        var conn = new SQLiteConnection ("Data Source=" + _path);

        if (!exists)
        {
            do_sync (conn);
        }

        return conn;
    }

これが役立つことを願っています。

于 2013-05-30T14:13:37.913 に答える