На Android int передается в базу данных как null

Похоже, что на Android целые числа передаются в базу данных как null при использовании в качестве параметра подготовленного оператора, например. в

db.execute("INSERT INTO keycounter (key, counter) VALUES (?, ?)", key, counter);

В симуляторе этот оператор отлично работает, когда counter является целым числом, а counter - строкой.

На Android он не работает с нарушением ограничения NULL, когда counter является целым числом, но работает нормально, когда counter является String.

Эту проблему можно воспроизвести с помощью формы ниже.

С уважением, Франс

import com.codename1.db.Database;
import com.codename1.ui.Button;
import com.codename1.ui.Form;
import com.codename1.ui.Label;
import com.codename1.ui.layouts.BoxLayout;

public class DatabaseIntAsNullForm extends Form
{
    public DatabaseIntAsNullForm()
    {
        super("int is passed as null to db", BoxLayout.y());
        Button passInt = new Button("Pass int");
        passInt.addActionListener(e -> test("key", 1));
        add(passInt);
        Button passStr = new Button("Pass String");
        passStr.addActionListener(e -> test("key", String.valueOf(1)));
        add(passStr);
    }

    private void test(String key, Object counter)
    {
        try
        {
            Database db = Database.openOrCreate("IntAsNull");
            try
            {
                db.execute("CREATE TABLE keycounter (key TEXT NOT NULL PRIMARY KEY, counter INTEGER NOT NULL)");
                try
                {
                    db.execute("INSERT INTO keycounter (key, counter) VALUES (?, ?)", key, counter);
                }
                finally
                {
                    db.execute("DROP TABLE keycounter");
                }
            }
            finally
            {
                db.close();
            }
            add(new Label("Success"));
            revalidate();
        }
        catch (Exception e)
        {
            e.printStackTrace();
            add(new Label(e.toString()));
            revalidate();
        }
    }
}

вероятно, потому что он передается как Object, а не как int или Integer

Vladyslav Matviienko 03.12.2018 11:45

Он передается как заключенное в рамку целое число, то есть как целое число. Чтобы убедиться, я также напрямую передал новое Integer (1), и это не имело никакого значения.

Frans van Gool 03.12.2018 12:10
1
2
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Похоже, это ошибка в реализации метода execute в Android. Это исправлено в коммите git здесь: https://github.com/codenameone/CodenameOne/commit/77c9ad1b9ecf107cb49bbfb95ebe31ecc09235a8

Он будет доступен в обновлении в эту пятницу (7 декабря 2018 г.).

Спасибо! Обходной путь был легким, но потребовалось время, чтобы его найти :-)

Frans van Gool 04.12.2018 17:24

Другие вопросы по теме