2015-12-05 2 views
0

При попытке решить вопрос How to print a sqlite table content with genie programming language Я узнал, что могу попытаться вызвать PrintSingleRecipe в качестве обратного вызова из Database.exec. Тем не менее, кажется, что обратный вызов не может быть регулярной функцией, у них есть свойство, которое я, кажется, не обнаружил в интернетах.Как использовать Sqlite.Callback в Genie

Я называю это следующим образом:

else if response is "3" //Show a Recipe 
    res:string = UserInterface.raw_input("Select a recipe -> ") 
    sql:string = "SELECT * FROM Recipes WHERE pkID = %res" 
    db.exec(sql, PrintSingleRecipe, null) 

И сама функция выглядит следующим образом:

def PrintSingleRecipe(n_columns:int, values:array of string, column_names:array of string) 
    print "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" 
    for i:int = 0 to n_columns 
     stdout.printf ("%s = %s\n", column_names[i], values[i]) 
    print "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" 
    print "Ingredient list" 
    print " " 
    stdout.printf("%-5s", "%03i") 

Однако, я получаю следующее сообщение об ошибке при компиляции:

valac --pkg sqlite3 --pkg gee-0.8 cookbook.gs 
cookbook.gs:42.26-42.42: error: Argument 2: Cannot convert from `PrintSingleRecipe' to `Sqlite.Callback?' 
      db.exec(sql, PrintSingleRecipe, null) 
         ^^^^^^^^^^^^^^^^^ 
Compilation failed: 1 error(s), 0 warning(s) 

Как правильно запустить обратный вызов в Genie?

ответ

1

Компилятор Vala выполняет проверку типа функции, когда функция передается в качестве параметра. Когда функция используется таким образом, она называется «делегатом». В частности, компилятор Vala проверяет, соответствует ли подпись функции сигнатуре определения типа делегата. Подпись функции состоит из ее типов параметров и типа возвращаемого значения. Cannot convert from 'PrintSingleRecipe' to 'Sqlite.Callback?' означает, что подпись функции PrintSingleRecipe не соответствует подписке определения делегата.

Определение делегата Sqlite.Callback показано здесь: http://valadoc.org/#!api=sqlite3/Sqlite.Callback Вы правильно определили параметры, необходимые являются int, array of string, array of string, но вы также должны включать в себя тип возвращаемого значения. В этом случае это int. Таким образом, ваш обратный вызов должен выглядеть так:

def PrintSingleRecipe(n_columns:int, 
     values:array of string, 
     column_names:array of string 
     ):int 
    print "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" 
    for i:int = 0 to n_columns 
     stdout.printf ("%s = %s\n", column_names[i], values[i]) 
    print "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~" 
    print "Ingredient list" 
    print " " 
    stdout.printf("%-5s", "%03i") 
    return 0 

Возврат ненулевого отменяет запрос. См. https://www.sqlite.org/capi3ref.html#sqlite3_exec

+0

Привет, AIThomas, как вызвать переменную res из строки sql? Синтаксис, который я использовал, не работает: '' 'res: string = UserInterface.raw_input (« Выбрать рецепт -> ») sql: string =" SELECT * FROM Recipes WHERE pkID =% res "' '' –

+0

Вы можете use string concatenation: 'sql: string =" SELECT * FROM Recipes WHERE pkID = "+ res" или шаблон: 'sql: string = @" SELECT * FROM Recipes WHERE pkID = $ res "' – AlThomas

 Смежные вопросы

  • Нет связанных вопросов^_^