2011-10-12 57 views
1

我試圖用我在工作的Java項目中的Ormlite替換現有的數據庫代碼。Ormlite在create()上拋出SQLException。我究竟做錯了什麼?

但是,當我調用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 [email protected]: 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 

我在做什麼錯?

回答

0

請確保您使用正確的SQLite驅動程序ORMLite。我知道Zentus司機很多都會拋出NYI的例外。這裏的手冊:

http://ormlite.com/docs/sqlite

引述:

有多種SQLite的司機在那裏。請確保您使用的驅動程序不是Xerial,而不是Zentus驅動程序,它不支持生成的ID。

+0

嗨!但是,我怎樣才能指定Xerial驅動程序與我的數據庫一起使用? – Yarovoy

+0

@Yarovoy這是用於JDBC連接 - 不是Android。您只需將Xerial jar包含在您的項目中即可。 – Gray

+0

嗨我得到了「java.sql.SQLException:NYI」我使用maven來管理我的依賴,以下是我的pom.xml的快照,請讓我知道我該如何糾正這個異常。 com.j256.ormlite ormlite核 4.41 com.j256.ormlite ormlite-JDBC 4.41 org.xerial源碼-JDBC 3.6。 16 Sam

0

那麼afaik NYI意味着尚未實施。我認爲這個東西不支持參數化的SQL。嘗試硬編碼你想直接插入到你的更新查詢字符串的字符串,看看是否可行

0

看看SQLite的源代碼看起來像NYI代表尚未實現

你的版本並沒有完全實現/完成。升級到3.6.20這似乎不再有這些例外。

+0

就是這樣。謝謝! – Rubicon