Исключение при вызове zumero_sync

Возникла проблема при запуске синхронизации sqllite db с zumero (с использованием xamarin.ios). Я установил команду синхронизации:

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();

Надеюсь, кто-нибудь увидит, что я делаю неправильно? Спасибо.


person user2420225    schedule 30.05.2013    source источник
comment
Можем ли мы увидеть код, в котором вы фактически открываете / регистрируете SQLiteConnection?   -  person Paul Roub    schedule 30.05.2013
comment
Конечно же: var conn = new SQLiteConnection (Data Source = + dbPath); conn.Open (); conn.ZumeroRegister ();   -  person user2420225    schedule 30.05.2013


Ответы (1)


Первая проблема, которую я вижу, которая, вероятно, не связана с полученной вами ошибкой:

Аргумент dbfile для zumero_sync () должен быть именем 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;
    }

Надеюсь, это поможет.

person Eric Sink    schedule 30.05.2013
comment
Большое спасибо за ваши ответы. Я думаю, что для меня в документации неясно следующее: первое - это имя прикрепленной базы данных SQLite, которая должна быть синхронизирована (обычно «основная»). Это полный путь к имени моей локальной базы данных? ‹Br/› - person user2420225; 30.05.2013
comment
SQLite позволяет прикрепить несколько файлов базы данных к одному дескриптору соединения SQLite. Каждый назван. База данных по умолчанию называется «основная». Первый параметр zumero_sync () - это имя присоединенной базы данных, обычно main. - person Eric Sink; 31.05.2013
comment
Путь файловой системы к вашему файлу базы данных SQLite не передается в zumero_sync (). Вам нужно только передать этот путь в качестве аргумента любой функции, которую вы используете для открытия файла SQLite. - person Eric Sink; 31.05.2013
comment
Первым параметром zumero_sync () является имя присоединенной базы данных, обычно «main» - это часть, которую я считаю неоднозначной - ›является ли имя« main », а затем псевдонимом присоединенной базы данных? (а затем для каждого последующего файла базы данных создаются разные имена / псевдонимы по мере их присоединения). Извините, что не уловил этого. - person user2420225; 31.05.2013