3

アプリケーションに必要なデータ (txt データ + 画像をダウンロードするための画像 URL) を取得するための別の Web サービスがあります。これは、アプリケーションで使用できる唯一のサービスです。アプリケーションの起動時にこのサービスを呼び出しています。 SQLite データベースをセットアップし (ORMLite を使用)、すべてが完了すると、ユーザーはホーム画面に移動できるため、次回の起動時にデータがデータベースにある場合、このサービスは呼び出されません。これまでのところ、すべてが正常に機能しています。

私の質問は、Android アプリの外部でこの SQLite DB を構築し、SQLite データベース ファイルをアプリにバンドルする方法です。私はMavenを使ってAndroidアプリを構築しています。

  1. Web サービスを呼び出して SQLite DB を構築するために別の Android プロジェクトが必要ですか、それとも Java プロジェクトを使用して SQLite Db を構築できますか?

  2. Android プロジェクトを使用する場合、データベース ファイルを取得するにはどうすればよいですか?

  3. 上記のプロジェクトを実行してdbファイルをAndroidアプリにコピーするようにmavenに指示するにはどうすればよいですか。

私は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>

DB にデータを挿入しようとすると、次の例外が発生します。

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

上記の問題を解決するのを手伝ってくれる人がいますか。

4

1 に答える 1

0

この質問 (プラグマ table_info を使用する SQLiteJDBC および PreparedStatement )によると、これNYIはまだ実装されていないことを意味し、create SQL ステートメントを準備しようとしているときに Sqlite によってスローされています。質問がある場合、これはmavenとは関係ありません。

あなたのスキーマを見てみたいです。Sqlite で使用しようとしている何らかのカスタム ステートメントがあるのではないでしょうか。

于 2012-08-01T17:13:41.450 に答える