Ormlite вызывает SQLException при создании (). Что я делаю неправильно? - PullRequest
1 голос
/ 13 октября 2011

Я пытаюсь заменить существующий код базы данных на Ormlite в проекте Java, над которым я работаю.

Однако, когда я вызываю create () для вставки объекта в базу данных SQLite, он выдаетSQLException.Я полагаю, я, вероятно, совершаю очевидную ошибку, но я не могу понять, что это такое.Вот код:

public class OrmliteTest {
    private final String DATABASE_URL = "jdbc:sqlite:test.sqlite";
    private JdbcConnectionSource connectionSource = null;
    private Dao<Article, Integer> articleDao;

    public OrmliteTest() throws SQLException{
        connectionSource = new JdbcConnectionSource(DATABASE_URL);

        TableUtils.createTableIfNotExists(connectionSource, Article.class);

        articleDao = DaoManager.createDao(connectionSource, Article.class);

        Article article1 = new Article("articles", "idnumber", "blah blah blah", (int)(new Date().getTime()/1000));

        articleDao.createOrUpdate(article1); // throws SQLException - why?
    }
}

@DatabaseTable(tableName = "articles")
class Article {
    public static final String CATEGORY_FIELD_NAME = "category";
    public static final String ARTICLEID_FIELD_NAME = "articleid";
    public static final String BODY_FIELD_NAME = "body";
    public static final String ADDED_FIELD_NAME = "added";

    @DatabaseField(generatedId = true)
    public int id;

    @DatabaseField(columnName = CATEGORY_FIELD_NAME)
    public String category;

    @DatabaseField(columnName = ARTICLEID_FIELD_NAME)
    public String articleId;

@DatabaseField(columnName = BODY_FIELD_NAME)
    public String body;

    @DatabaseField(columnName = ADDED_FIELD_NAME)
    public int added;

    public Article() {}

    public Article(String category, String articleId, String body, int added) {
        setCategory(category);
        setArticleId(articleId);
        setBody(body);
        setAdded(added);
    }

    ...getters and setters...
}

Исключение выдается при вызове articleDao.createOrUpdate(article1).Вот обратная связь:

java.sql.SQLException: Unable to run insert stmt on object com.myapp.tester.Article@7a36824: INSERT INTO `articles` (`category` ,`storyid` ,`body` ,`added` ) VALUES (?,?,?,?)
    at com.j256.ormlite.misc.SqlExceptionUtil.create(SqlExceptionUtil.java:22)
    at com.j256.ormlite.stmt.mapped.MappedCreate.insert(MappedCreate.java:90)
    at com.j256.ormlite.stmt.StatementExecutor.create(StatementExecutor.java:325)
    at com.j256.ormlite.dao.BaseDaoImpl.create(BaseDaoImpl.java:287)
    at com.j256.ormlite.dao.BaseDaoImpl.createOrUpdate(BaseDaoImpl.java:312)
    at com.myapp.tester.OrmliteBugTester.<init>(OrmliteBugTester.java:128)
    at com.myapp.tester.Tester.main(Tester.java:24)
Caused by: java.sql.SQLException: NYI
    at org.sqlite.Conn.prepareStatement(Conn.java:217)
at com.j256.ormlite.jdbc.JdbcDatabaseConnection.insert(JdbcDatabaseConnection.java:105)
    at com.j256.ormlite.stmt.mapped.MappedCreate.insert(MappedCreate.java:63)
    ... 5 more

Что я делаю не так?

Ответы [ 3 ]

0 голосов
/ 13 октября 2011

Глядя на исходный код SQLite, он выглядит так: NYI означает , еще не реализованный .

Ваша версия просто не полностью реализована / сделана. Обновите до 3.6.20, который, похоже, больше не имеет этих исключений.

0 голосов
/ 13 октября 2011

Пожалуйста, убедитесь, что вы используете правильный драйвер SQLite с ORMLite . Я знаю, что водитель Zentus часто бросает исключения из NYI. Вот руководство:

http://ormlite.com/docs/sqlite

Цитировать:

Существует несколько драйверов SQLite. Убедитесь, что вы используете драйвер Xerial , а не драйвер Zentus , который не поддерживает сгенерированные идентификаторы.

0 голосов
/ 13 октября 2011

Хорошо, афаик NYI означает еще не реализовано.Я думаю, что эта вещь не поддерживает параметризованный SQL.Попробуйте жестко закодировать значения, которые вы хотите вставить непосредственно в строку запроса на обновление, и посмотрите, работает ли это

...