android sqlite数据库约束

时间:2015-10-07 23:59:36

标签: android sqlite android-contentprovider

我有一个本地数据库来存储moviedb.org api提供的电影信息。每次代码都会将这些信息添加到我的本地数据库中,但是我遇到了唯一的约束错误。我知道它是因为我将电影ID设置为独特的,因为我一开始认为我必须避免重复相同的信息。

这是我的数据库代码:

public void onCreate(SQLiteDatabase db) {
    final String SQL_CREATE_MOVIE_TABLE = "CREATE TABLE " + MovieContract.MovieEntry.TABLE_NAME + " (" +
            MovieContract.MovieEntry._ID + " INTEGER PRIMARY KEY," +
            MovieContract.MovieEntry.COLUMN_MOVIE_ID + " INTEGER UNIQUE NOT NULL, " +
            MovieContract.MovieEntry.COLUMN_MOVIE_NAME + " TEXT NOT NULL, " +
            MovieContract.MovieEntry.COLUMN_MOVIE_GENRE + " INTEGER NOT NULL, " +
            MovieContract.MovieEntry.COLUMN_MOVIE_OVERVIEW + " TEXT NOT NULL, " +
            MovieContract.MovieEntry.COLUMN_MOVIE_RELEASE_DATE + " TEXT NOT NULL, " +
            MovieContract.MovieEntry.COLUMN_MOVIE_POSTER_PATH + " TEXT, " +
            MovieContract.MovieEntry.COLUMN_MOVIE_POPULARITY + " DOUBLE NOT NULL, " +
            MovieContract.MovieEntry.COLUMN_MOVIE_RATING + " DOUBLE NOT NULL " +
            " );";

    db.execSQL(SQL_CREATE_MOVIE_TABLE);
}

这是我的bulkinsert函数:

public int bulkInsert(Uri uri, ContentValues[] values) {
        final SQLiteDatabase db = mOpenHelper.getWritableDatabase();
        final int match = sUriMatcher.match(uri);
        switch (match) {
            case MOVIE:
                db.beginTransaction();
                int returnCount = 0;
                try {
                    for (ContentValues value : values) {
                        long _id = db.insert(MovieContract.MovieEntry.TABLE_NAME, null, value);
                        if (_id != -1) {
                            returnCount++;
                        }
                    }
                    db.setTransactionSuccessful();
                } finally {
                    db.endTransaction();
                }
                getContext().getContentResolver().notifyChange(uri, null);
                return returnCount;
            default:
                return super.bulkInsert(uri, values);
        }
    }

所以,我想知道如果删除这个唯一的关键字,bulkinsert仍会插入重复信息,否则它会自动更新相同ID的信息?如果没有,我该怎么做才能确保如果相同的信息,则bulkinsert不执行任何操作,如果id已存在但其他相关信息已更改,则更新。 感谢。

1 个答案:

答案 0 :(得分:1)

如果您只是删除UNIQUE约束并尝试批量插入数据,如果重复相同的项目,它将在您的数据库中重复。但是,您可以通过调用insertWithOnConflict

来替换插入方法调用

然后,您可以决定应该如何处理完全重复的内容。默认为忽略(CONFLICT_IGNORE)。您可能正在寻找CONFLICT_REPLACE

  

当发生UNIQUE约束违规时,预先存在的行   导致约束违反被删除之前插入或   更新当前行。因此总是发生插入或更新。该   命令继续正常执行。

但根据您的要求,可以使用CONFLICT_IGNORE或CONFLICT_REPLACE。