我搜索並搜索到,但尚未找到解決方案。希望這裏有人能幫忙。嘗試插入時拋出SQLiteConstraintException
我試圖插入MediaStore.Audio.Media.EXTERNAL_CONTENT_URI自定義鈴聲。 大多數情況下,它的工作效果很好,但偶爾會在調用getContentResolver()。insert()時引發SQLiteConstraintException。拋出異常是因爲具有唯一列(_data)的記錄已經存在於該表中的特定值。 但是,當我然後嘗試使用_data作爲where子句獲取該記錄時,返回null。
因此,在我看來,有多個表在這裏被檢查,現有的相同_data列的記錄是某種關聯的表格,當我使用MediaStore.Audio.Media.EXTERNAL_CONTENT_URI 。
所以,我的問題是,如果是這樣,有沒有辦法清除這些孤兒記錄? 或者有沒有辦法確定這個重複值在哪個表中,以便我可以手動刪除它? 也許某種類型的文件表?
另外,也許我完全錯誤的假設。 任何幫助真的很感激。
這裏有保存鈴聲
ContentValues mediaValues = new ContentValues();
mediaValues.put(MediaStore.MediaColumns.DATA, filename.toString());
mediaValues.put(MediaStore.MediaColumns.TITLE, speakTextTxt);
mediaValues.put(MediaStore.MediaColumns.DISPLAY_NAME, speakTextTxt);
mediaValues.put(MediaStore.MediaColumns.MIME_TYPE, "audio/mpeg3");
mediaValues.put(MediaStore.MediaColumns.SIZE, filename.length());
mediaValues.put(MediaStore.Audio.Media.ARTIST, appName);
mediaValues.put(MediaStore.Audio.Media.IS_RINGTONE, true);
mediaValues.put(MediaStore.Audio.Media.IS_NOTIFICATION, true);
mediaValues.put(MediaStore.Audio.Media.IS_ALARM, true);
mediaValues.put(MediaStore.Audio.Media.IS_MUSIC, false);
ringtoneUri = getContentResolver().insert(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, mediaValues);
在上面ringtoneUri
的代碼發生此問題時爲空。
這裏被拋出
03-04 13:18:16.522 24774-23075/? E/SQLiteDatabase﹕ Error inserting bucket_id=1420360973 media_type=2 storage_id=65537 date_modified=1393450056 is_alarm=true is_ringtone=true parent=22388 format=12297 artist_id=90 is_music=false bucket_display_name=Ringtones album_id=161 title=German gorilla is_notification=true title_key= 3 / I ? ' A 3 C I 7 = = ' mime_type=audio/mpeg3 date_added=1393967896 _display_name=German_gorilladeuDEUcomgoogleandroidtts-75868.mp3 _size=32044 _data=/storage/emulated/0/Android/data/com.twoclaw.typeyourringtonepro/files/Ringtones/German_gorilladeuDEUcomgoogleandroidtts-75868.mp3
android.database.sqlite.SQLiteConstraintException: column _data is not unique (code 19)
at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method)
at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:782)
at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788)
at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86)
at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1469)
at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339)
at com.android.providers.media.MediaProvider.insertFile(MediaProvider.java:3199)
at com.android.providers.media.MediaProvider.insertInternal(MediaProvider.java:3439)
at com.android.providers.media.MediaProvider.insert(MediaProvider.java:2851)
at android.content.ContentProvider$Transport.insert(ContentProvider.java:220)
at android.content.ContentProviderNative.onTransact(ContentProviderNative.java:156)
at android.os.Binder.execTransact(Binder.java:404)
at dalvik.system.NativeStart.run(Native Method)
我看不到任何與失敗的有所不同,但也許他們已經部分地在某一點插入異常。
試圖讓這個紀錄再回來空
String[] projection = {MediaStore.MediaColumns.DATA, MediaStore.MediaColumns._ID};
String[] selectionArgs = {filename.toString()};
Cursor existingTone = getContentResolver().query(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI, projection, MediaStore.MediaColumns.DATA+"=?", selectionArgs, null);
if (existingTone.getCount() > 0)...
後
文件並在_data列
希望這解釋了事情所示的位置存在是假的。 在此先感謝!
我想我難倒大家:)我已經把周圍的工作現在,但我仍然試圖找出這一個。 – Trees