在将记录插入 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;
我尝试对 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;