【问题标题】:How to build the SQLite Data base separately and bundle to the android app in maven build如何单独构建 SQLite 数据库并在 maven build 中捆绑到 android 应用程序
【发布时间】:2012-08-01 02:55:07
【问题描述】:

我有一个单独的网络服务来获取应用程序所需的数据(txt 数据 + 图像 URL 以下载图像),这是我的应用程序中唯一的服务,我在调用此服务应用程序启动并设置 SQLite 数据库(使用 ORMLite),一旦一切完成,用户就可以进入主屏幕,因此在下次启动时,如果数据在数据库中,则此服务不会调用。到目前为止一切正常。

我的问题是如何在 android 应用程序之外构建这个 SQLite DB 并将 SQLite 数据库文件捆绑到应用程序;我正在使用 maven 构建 android 应用程序。

  1. 我是否需要一个单独的android项目来调用Web服务并构建SQLite DB,或者我可以使用java项目来构建SQLite Db,

  2. 如果我使用android项目我如何获取数据库文件?

  3. 如何指示maven运行上述项目并将db文件复制到android app。

我从一个 maven 项目开始,下面是我的 pom xml 文件的快照

 <dependencies>
  <dependency>
    <groupId>org.apache.commons</groupId>
    <artifactId>commons-io</artifactId>
    <version>1.3.2</version>
</dependency>

<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>1.2.16</version>
</dependency>

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.2.2</version>
</dependency>

<dependency>
    <groupId>com.j256.ormlite</groupId>
    <artifactId>ormlite-core</artifactId>
    <version>4.41</version>
</dependency>

<dependency>
    <groupId>com.j256.ormlite</groupId>
    <artifactId>ormlite-jdbc</artifactId>
    <version>4.41</version>
</dependency>

<dependency>
      <groupId>org.xerial</groupId>
      <artifactId>sqlite-jdbc</artifactId>
      <version>3.6.16</version>
    </dependency>

  </dependencies>

当我尝试将数据插入数据库时​​出现以下异常。

at com.j256.ormlite.misc.SqlExceptionUtil.create(SqlExceptionUtil.java:22)
    at com.j256.ormlite.stmt.mapped.MappedCreate.insert(MappedCreate.java:124)
    at com.j256.ormlite.stmt.StatementExecutor.create(StatementExecutor.java:363)
    at com.j256.ormlite.dao.BaseDaoImpl.create(BaseDaoImpl.java:306)

Caused by: java.sql.SQLException: NYI
    at org.sqlite.Conn.prepareStatement(Conn.java:443)
    at com.j256.ormlite.jdbc.JdbcDatabaseConnection.insert(JdbcDatabaseConnection.java:147)
    at com.j256.ormlite.stmt.mapped.MappedCreate.insert(MappedCreate.java:89)
    ... 4 more

我的域对象

@DatabaseTable
public class Widget implements Comparable<Widget>{

    @DatabaseField(id = true)
    private String id = null;

    @DatabaseField
    private String title = null;
....More fileds.

    @ForeignCollectionField
    private ForeignCollection<WidgetAttribute> db_widget_attribute;

    @DatabaseField(canBeNull = true, foreign = true)
    private AdvancedSettings advanced_settings = null;
... Getters /setters....
}

@DatabaseTable
public class WidgetAttribute {

    @DatabaseField(id = true)
    private String id = null;

    @DatabaseField
    private String value = null;
    ....More fileds.

    @DatabaseField(foreign=true,foreignAutoRefresh=true)
    private Widget widget;
    ... Getters /setters....
 }

@DatabaseTable
public class AdvancedSettings {
    @DatabaseField(id = true)
    private String id = null;

    public static final String  DB_COLUMN_SHOW_AS_TAB_BAR = "show_as_tab_bar"; 

    @DatabaseField
    private String show_as_tab_bar = null;
    ....More fileds

    @DatabaseField(canBeNull = true, foreign = true)
    private AdvancedSettingsImages advanced_settings_images = null;

   @DatabaseField(foreign=true,foreignAutoRefresh=true)
    private Widget widget;

    public String getId() {
        return id;
    }
        ... Getters /setters....
}   

@DatabaseTable
public class AdvancedSettingsImages {
    @DatabaseField(generatedId=true)
    private int id;

     ....More fileds

    @DatabaseField(canBeNull = true, foreign = true)
    private AdvancedSettings advancedSettings = null;

    ... Getters /setters....

 }

当我运行应用程序时,我在控制台中看到以下日志消息

DEBUG [com.j256.ormlite.dao.DaoManager] created dao for class class com.xxx.domain.Widget with reflection 
DEBUG [com.j256.ormlite.dao.DaoManager] created dao for class class com.xxx.domain.WidgetAttribute with reflection 
DEBUG [com.j256.ormlite.dao.DaoManager] created dao for class class com.xxx.domain.AdvancedSettings with reflection 
DEBUG [com.j256.ormlite.dao.DaoManager] created dao for class class com.xxx.domain.AdvancedSettingsImages with reflection 

INFO  [com.j256.ormlite.table.TableUtils] creating table 'widget' 
INFO  [com.j256.ormlite.table.TableUtils] executed create table statement changed 0 rows: CREATE TABLE IF NOT EXISTS `widget` (`id` VARCHAR , `title` VARCHAR , `widget_type_id` VARCHAR , `app_xxx_id` VARCHAR , `created_at` VARCHAR , `updated_at` VARCHAR , `position` VARCHAR , `group_widget` VARCHAR , `parent_id` VARCHAR , `image_link` VARCHAR , `advanced_settings_id` VARCHAR , `widgets_id` INTEGER NOT NULL , PRIMARY KEY (`id`) )  
INFO  [com.j256.ormlite.table.TableUtils] creating table 'widgetattribute' 
INFO  [com.j256.ormlite.table.TableUtils] executed create table statement changed 0 rows: CREATE TABLE IF NOT EXISTS `widgetattribute` (`id` VARCHAR , `value` VARCHAR , `attribute_type` VARCHAR , `name` VARCHAR , `created_at` VARCHAR , `updated_at` VARCHAR , `image_link` VARCHAR , `widget_id` VARCHAR , PRIMARY KEY (`id`) )  
INFO  [com.j256.ormlite.table.TableUtils] creating table 'advancedsettings' 
INFO  [com.j256.ormlite.table.TableUtils] executed create table statement changed 0 rows: CREATE TABLE IF NOT EXISTS `advancedsettings` (`id` VARCHAR , `show_widget_on_home_screen` VARCHAR , `highlight_cell` VARCHAR , `hide_menu` VARCHAR , `show_as_tab_bar` VARCHAR , `icon_color` VARCHAR , `live_tile` VARCHAR , `text_color` VARCHAR , `vertical_alignment` VARCHAR , `horizontal_alignment` VARCHAR , `created_at` VARCHAR , `updated_at` VARCHAR , `advanced_settings_images_id` INTEGER , `widget_id` VARCHAR , PRIMARY KEY (`id`) )  
INFO  [com.j256.ormlite.table.TableUtils] creating table 'advancedsettingsimages'
INFO  [com.j256.ormlite.table.TableUtils] executed create table statement changed 0 rows: CREATE TABLE IF NOT EXISTS `advancedsettingsimages` (`id` INTEGER PRIMARY KEY AUTOINCREMENT , `tab_bar_icon` VARCHAR , `tab_bar_icon_on_press` VARCHAR , `widget_icon` VARCHAR , `widget_icon_on_press` VARCHAR , `advancedSettings_id` VARCHAR )  


java.sql.SQLException: Unable to run insert stmt on object 

    at com.j256.ormlite.misc.SqlExceptionUtil.create(SqlExceptionUtil.java:22)
    at com.j256.ormlite.stmt.mapped.MappedCreate.insert(MappedCreate.java:124)
    at com.j256.ormlite.stmt.StatementExecutor.create(StatementExecutor.java:352)
    at com.j256.ormlite.dao.BaseDaoImpl.create(BaseDaoImpl.java:306)

Caused by: java.sql.SQLException: [SQLITE_ERROR] SQL error or missing database (near ")": syntax error)
    at org.sqlite.DB.newSQLException(DB.java:374)
    at org.sqlite.DB.newSQLException(DB.java:378)
    at org.sqlite.DB.throwex(DB.java:365)
    at org.sqlite.NativeDB.prepare(Native Method)
    at org.sqlite.DB.prepare(DB.java:123)
    at org.sqlite.PrepStmt.<init>(PrepStmt.java:44)
    at org.sqlite.Conn.prepareStatement(Conn.java:403)
    at org.sqlite.Conn.prepareStatement(Conn.java:398)
    at org.sqlite.Conn.prepareStatement(Conn.java:382)
    at org.sqlite.Conn.prepareStatement(Conn.java:386)
    at com.j256.ormlite.jdbc.JdbcDatabaseConnection.insert(JdbcDatabaseConnection.java:147)
    at com.j256.ormlite.stmt.mapped.MappedCreate.insert(MappedCreate.java:89)
    ... 4 more

有人可以帮我解决上述问题吗?

【问题讨论】:

    标签: android maven ormlite


    【解决方案1】:

    根据这个问题(SQLiteJDBC and PreparedStatement to use pragma table_info),NYI 表示尚未实现,并且在尝试准备创建 SQL 语句时被 Sqlite 抛出。如果有任何问题,这与maven无关。

    我很想看看您的架构。也许您正在尝试将某种自定义语句与 Sqlite 一起使用?

    【讨论】:

    • 我已经用我的域对象更新了问题,当“advanceSettingsimages”对象将持续存在时,我收到上述错误,所有其他对象小部件->小部件属性->高级设置被插入而没有问题。
    • ORMLite 是否在创建您的架构?架构与您的数据不匹配的任何机会?你最近增加了数据库版本号@Sam 吗?
    • 我可以在控制台日志中看到 create table stmt,这是项目的初始阶段,因此没有更新数据库版本,如果我评论将数据插入“advancedSettingsImages”时发生错误那块所有的get插入,我仍然找不到问题。
    • 你能发布创建语句@Sam 吗?
    • 不幸的是,问题出在下一个语句吗?当然,ORMLite 会打印出它们执行 after 的语句。你能调试那个方法并找出语句是什么@Sam?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2012-01-18
    • 2013-01-28
    • 1970-01-01
    • 2012-01-15
    相关资源
    最近更新 更多