0

Web サービスから JsonArray を取得し、Gson で解析して対応するクラスの ArrayList に変換します。これは私のクラスです:

@DatabaseTable(tableName = "categories")
public class Category {
    public final static String CATEGORY_TITLE_FIELD_NAME  = "title";
    @SerializedName("id")
    @DatabaseField(id = true)
    int id;
    @SerializedName("title")
    @DatabaseField(dataType = DataType.STRING, columnName = CATEGORY_TITLE_FIELD_NAME)
    String title;

    // need for ORMlite
    public Category() {}

    public Category (int id, String title) {
        this.id = id;
        this.title = title;
    }

    // getters/setters/toString methods here
}

私のアクティビティでは、それを ArrayList に解析します。

Type listType = new TypeToken<List<Category>>() {}.getType();
List<Category> tasks = new ArrayList<Category>();
tasks = gson.fromJson(array.toString(), listType);

その結果、データを含む ArrayList を取得し、正しく保存されます。次に、OrmLiteSqliteOpenHelper から拡張された DatabaseHandler で、データベースに ArrayList を保存するメソッドを使用します。

  public void saveCategories(List<Category> contacts) throws SQLException {
        Dao<Category, Integer> daoContact=this.getDao(Category.class);
        for (Category contact : contacts) {
            daoContact.create(contact);
        }
    }

しかし、ArrayList でこのメソッドを呼び出すと、次のようになります。

java.sql.SQLException: Unable to run insert stmt on object {title=Non-categorized id=1}: INSERT INTO `categories` (`title` ,`id` ) VALUES (?,?)
    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)
    at com.library.DatabaseHandler.saveCategories(DatabaseHandler.java:148)
    at com.assignmentexpert.LoginActivity$1.onClick(LoginActivity.java:104)
    at android.view.View.performClick(View.java:2485)
    at android.view.View$PerformClick.run(View.java:9080)
    at android.os.Handler.handleCallback(Handler.java:587)
    at android.os.Handler.dispatchMessage(Handler.java:92)
    at android.os.Looper.loop(Looper.java:123)
    at android.app.ActivityThread.main(ActivityThread.java:3687)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
    at dalvik.system.NativeStart.main(Native Method)
 Caused by: java.sql.SQLException: inserting to database failed: INSERT INTO `categories` (`title` ,`id` ) VALUES (?,?)
    at com.j256.ormlite.misc.SqlExceptionUtil.create(SqlExceptionUtil.java:22)
    at com.j256.ormlite.android.AndroidDatabaseConnection.insert(AndroidDatabaseConnection.java:134)
    at com.j256.ormlite.stmt.mapped.MappedCreate.insert(MappedCreate.java:89)
    ... 15 more
Caused by: android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed
at android.database.sqlite.SQLiteStatement.native_execute(Native Method)
at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:88)
    at com.j256.ormlite.android.AndroidDatabaseConnection.insert(AndroidDatabaseConnection.java:122)
    ... 16 more

クラスとデータベースに正しいデータを保存する方法を教えてください。

4

2 に答える 2

2

例外が伝えようとしているように、Sqlite が例外をスローしているため、エラーが発生しています: "error code 19: constraint failed"Sqlite エラー コードに関する限定的なドキュメントは次のとおりです。

したがって、ヒットしたいくつかの制約があります。ORMLiteを使用してスキーマを生成した場合、考えられる唯一のことは、重複する ID フィールドを持つ行を挿入しようとしているということです。

編集:

行ったり来たりした後、データベース内に同じ ID を持つオブジェクトが既に存在していたことが判明しました。を実行するに ID を照会することにより、またはcreate(...)の呼び出しについて決定を下すことができます。update(...)create(...)

ただし、これを行うと、より良い例外が発生します。

java.sql.SQLException: Unable to run insert stmt on object
    com.j256.ormlite.db.SqliteConnectTest$IdConstraint@7971f189:
    INSERT INTO `idconstraint` (`id` ,`stuff` ) VALUES (?,?)
...
Caused by: java.sql.SQLException: Unable to run insert stmt on object
    com.j256.ormlite.db.SqliteConnectTest$IdConstraint@7971f189:
    INSERT INTO `idconstraint` (`id` ,`stuff` ) VALUES (?,?)
...
Caused by: java.sql.SQLException: [SQLITE_CONSTRAINT]  Abort due to
    constraint violation (PRIMARY KEY must be unique)

最新バージョンの Xerial Sqlite ドライバーを使用していますか? バージョン 3.6.20 を使用しています。

于 2012-07-30T14:41:01.543 に答える
0

問題は、データベースに要素を2回追加したことです。グレイのおかげで

于 2012-08-14T08:02:03.390 に答える