在将记录插入 SQLite 之前检查记录是否存在 table

checking wether a record exists or not before inserting it in a SQLite table

我尝试对 android 应用程序的 SQLite 数据库执行 select 查询,以检查电影 ID 是否存在于 table 中,如果不存在则决定将其插入table 如果之前已经插入则不插入 所以这是我在 MoviesProvider.java:

中写的代码
public class MoviesProvider extends ContentProvider {

    public static final int CODE_MOVIES = 200;
    public static final int CODE_MOVIES_WITH_ID = 201;

    private static final UriMatcher sUriMatcher = buildUriMatcher();

    MoviesDbHelper mOpenHelper;

    public static UriMatcher buildUriMatcher() {

        final UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH);
        final String authority = MoviesContract.CONTENT_AUTHORITY;

        matcher.addURI(authority, MoviesContract.PATH_MOVIES, CODE_MOVIES);

        matcher.addURI(authority, MoviesContract.PATH_MOVIES + "/#", CODE_MOVIES_WITH_ID);

        return matcher;
    }

    @Override
    public boolean onCreate() {
        mOpenHelper = new MoviesDbHelper(getContext());
        return true;
    }


    @Override
    public Uri insert(@NonNull Uri uri, ContentValues values) {

        final SQLiteDatabase db = mOpenHelper.getWritableDatabase();

        int match = sUriMatcher.match(uri);
        Uri returnUri;

        switch (match) {

            case CODE_MOVIES: {

                String bookmarksMovieId = uri.getLastPathSegment();
                String[] selectionArguments2 = new String[]{bookmarksMovieId};

                String Query = "SELECT * FROM" + MoviesContract.MoviesEntry.TABLE_NAME
                        + "WHERE" + MoviesContract.MoviesEntry.COLUMN_SHASHA_ID + "=" + selectionArguments2;
                Cursor cursor = db.rawQuery(Query, null);
                if (cursor.getCount() <= 0) {
                    cursor.close();
                } else {

                    long id = db.insert(TABLE_NAME, null, values);
                    if (id > 0) {
                        returnUri = ContentUris.withAppendedId(MoviesContract.MoviesEntry.CONTENT_URI, id);
                    } else {
                        throw new android.database.SQLException("Failed to insert row into " + uri);
                    }

                    break;
                }
            }

            default:
                throw new UnsupportedOperationException("Unknown uri: " + uri);
        }
        getContext().getContentResolver().notifyChange(uri, null);

        return returnUri;
    }

}

MoviesContract.java:

public class MoviesContract {

    public static final String CONTENT_AUTHORITY = "giga.net.world.GN";

    public static final Uri BASE_CONTENT_URI = Uri.parse("content://" + CONTENT_AUTHORITY);

    public static final String PATH_MOVIES = "shasha";

    public static final class MoviesEntry implements BaseColumns {

        public static final Uri CONTENT_URI = BASE_CONTENT_URI.buildUpon()
                .appendPath(PATH_MOVIES)
                .build();

        public static final String TABLE_NAME = "shasha";

        public static final String COLUMN_SHASHA_ID = "id";
        public static final String COLUMN_SHASHA_TITLE = "title";
        public static final String COLUMN_SHASHA_CATEGORY = "category";

        public static Uri buildMoviesUriWithId(long id) {
            return CONTENT_URI.buildUpon()
                    .appendPath(Long.toString(id))
                    .build();
        }

    }
}

MoviesDBHelper.java:

public class MoviesDbHelper extends SQLiteOpenHelper {

public static final String DATABASE_NAME = "shasha.db";

private static final int DATABASE_VERSION = 3;

public MoviesDbHelper(Context context) {

    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

    @Override
    public void onCreate(SQLiteDatabase sqLiteDatabase) {

        final String SQL_CREATE_MOVIES_TABLE =

                "CREATE TABLE " + MoviesContract.MoviesEntry.TABLE_NAME + " (" +

                        MoviesContract.MoviesEntry._ID               + " INTEGER PRIMARY KEY AUTOINCREMENT, " +
                        MoviesContract.MoviesEntry.COLUMN_SHASHA_ID + " INTEGER NOT NULL, "                 +
                        MoviesContract.MoviesEntry.COLUMN_SHASHA_TITLE + " TEXT NOT NULL, "                 +
                        MoviesContract.MoviesEntry.COLUMN_SHASHA_CATEGORY + " TEXT NOT NULL);";

        sqLiteDatabase.execSQL(SQL_CREATE_MOVIES_TABLE);
    }

    @Override
    public void onUpgrade(SQLiteDatabase sqLiteDatabase, int oldVersion, int newVersion) {

        sqLiteDatabase.execSQL("DROP TABLE IF EXISTS " + MoviesContract.MoviesEntry.TABLE_NAME);
        onCreate(sqLiteDatabase);

    }
}

最后是 onClick 方法:

public void onClickFavorite(View view) {

        ContentValues contentValues = new ContentValues();
        contentValues.put(MoviesContract.MoviesEntry.COLUMN_SHASHA_ID, MovieId);
        contentValues.put(MoviesContract.MoviesEntry.COLUMN_SHASHA_TITLE, MovieTitle);
        contentValues.put(MoviesContract.MoviesEntry.COLUMN_SHASHA_CATEGORY, MovieCategory);

        Uri uri = getContentResolver().insert(MoviesContract.MoviesEntry.CONTENT_URI, contentValues);

        if (uri != null) {
            Toast.makeText(getBaseContext(), uri.toString(), Toast.LENGTH_LONG).show();
        }

    }

问题是当我点击任何电影中的收藏夹按钮时,应用程序崩溃了,我从 logcat 收到以下消息:

Could not execute method for android:onClick Caused By : SQL(query) error or missing database.(near "FROMshashaWHEREid": syntax error (code 1): , while compiling: SELECT * FROMshashaWHEREid=[Ljava.lang.String;@cdbe7d7)

为什么我得到这样的 id:

WHEREid=[Ljava.lang.String;@cdbe7d7)

您需要在查询构建字符串中添加一些空格。

FROM**shasha**WHEREid

在这部分,

String Query = "SELECT * FROM" + MoviesContract.MoviesEntry.TABLE_NAME
                    + "WHERE" + 

您需要在每个单词之间添加空格:

String Query = "SELECT * FROM " + MoviesContract.MoviesEntry.TABLE_NAME + " WHERE " + MoviesContract.MoviesEntry.COLUMN_SHASHA_ID + " = " + selectionArguments2;