Похоже, что на 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();
}
}
}
Он передается как заключенное в рамку целое число, то есть как целое число. Чтобы убедиться, я также напрямую передал новое Integer (1), и это не имело никакого значения.
Похоже, это ошибка в реализации метода execute в Android. Это исправлено в коммите git здесь: https://github.com/codenameone/CodenameOne/commit/77c9ad1b9ecf107cb49bbfb95ebe31ecc09235a8
Он будет доступен в обновлении в эту пятницу (7 декабря 2018 г.).
Спасибо! Обходной путь был легким, но потребовалось время, чтобы его найти :-)
вероятно, потому что он передается как
Object, а не какintилиInteger