2013-04-08 93 views
2

我在將數據插入表中時遇到了問題。所以這就是我正在做的。我將一張音樂專輯添加到收藏夾表格中,並將該專輯的歌曲添加到另一張名爲「歌曲」的表格中。所以,我得到這個從logcat的:插入數據庫約束失敗

04-08 13:19:58.846: E/SQLiteDatabase(6120): Error inserting album_id=1 mp4= mp3=http://nelu.burduja.com/musica/songs_with/with_515c34d1bbde7.mp3 title=Super hit artist=Gherghe Topa thumb=snwith_515c34d1aeee1.jpeg 
04-08 13:19:58.846: E/SQLiteDatabase(6120): android.database.sqlite.SQLiteConstraintException: error code 19: constraint failed 
04-08 13:19:58.846: E/SQLiteDatabase(6120):  at android.database.sqlite.SQLiteStatement.native_executeInsert(Native Method) 
04-08 13:19:58.846: E/SQLiteDatabase(6120):  at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:113) 
04-08 13:19:58.846: E/SQLiteDatabase(6120):  at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1718) 
04-08 13:19:58.846: E/SQLiteDatabase(6120):  at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1591) 
04-08 13:19:58.846: E/SQLiteDatabase(6120):  at com.myapp.functions.DatabaseHelper.addSongs(DatabaseHelper.java:179) 
04-08 13:19:58.846: E/SQLiteDatabase(6120):  at com.myapp.functions.DatabaseHelper.addFavorite(DatabaseHelper.java:215) 
04-08 13:19:58.846: E/SQLiteDatabase(6120):  at com.myapp.functions.AlbumLazyAdapter$1.onClick(AlbumLazyAdapter.java:94) 
04-08 13:19:58.846: E/SQLiteDatabase(6120):  at android.view.View.performClick(View.java:3511) 
04-08 13:19:58.846: E/SQLiteDatabase(6120):  at android.view.View$PerformClick.run(View.java:14105) 
04-08 13:19:58.846: E/SQLiteDatabase(6120):  at android.os.Handler.handleCallback(Handler.java:605) 
04-08 13:19:58.846: E/SQLiteDatabase(6120):  at android.os.Handler.dispatchMessage(Handler.java:92) 
04-08 13:19:58.846: E/SQLiteDatabase(6120):  at android.os.Looper.loop(Looper.java:137) 
04-08 13:19:58.846: E/SQLiteDatabase(6120):  at android.app.ActivityThread.main(ActivityThread.java:4440) 
04-08 13:19:58.846: E/SQLiteDatabase(6120):  at java.lang.reflect.Method.invokeNative(Native Method) 
04-08 13:19:58.846: E/SQLiteDatabase(6120):  at java.lang.reflect.Method.invoke(Method.java:511) 
04-08 13:19:58.846: E/SQLiteDatabase(6120):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:787) 
04-08 13:19:58.846: E/SQLiteDatabase(6120):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:554) 
04-08 13:19:58.846: E/SQLiteDatabase(6120):  at dalvik.system.NativeStart.main(Native Method) 

首先我插入一張專輯:

public void addSongs(ArrayList<Songs> arrayList, String albumID) { 
     ContentValues values = new ContentValues(); 
     for (int i = 0; i < arrayList.size(); i++) { 
      values.put("title", arrayList.get(i).getSONG_TITLE()); 
      values.put("artist", arrayList.get(i).getSONG_ARTIST()); 
      values.put("mp3", arrayList.get(i).getSONG_MP3()); 
      values.put("mp4", arrayList.get(i).getSONG_MP4()); 
      values.put("thumb", arrayList.get(i).getSONG_THUMB()); 
      values.put("album_id", albumID); 
      database.insert("songs", null, values); 
     } 
    } 

最後我的表查詢:

public void addFavorite(Albums album) { 

     ContentValues values = new ContentValues(); 
     values.put(ALB_GENRE, album.getTAG_GENRE()); 
     values.put(ALB_ID, album.getTAG_ID()); 
     values.put(ALB_MIX, album.getTAG_MIX()); 
     values.put(ALB_NAME, album.getTAG_NAME()); 
     values.put(ALB_SINGER, album.getTAG_SINGER()); 
     values.put(ALB_THUMB, album.getTAG_THUMB()); 
     // Inserting Row 
     addSongs(album.getSongs(), album.getTAG_ID()); 
     database.insert(TABLE_FAVORITES, null, values); 

    } 

然後我通過插入從專輯歌曲

private static final String DATABASE_CREATE_SONGS = "create table " 
      + TABLE_SONGS + "(title text " 
      + ", artist text, mp3 text, mp4 text, thumb text," 
      + " album_id text REFERENCES " + TABLE_FAVORITES + "(id));"; 

private static final String DATABASE_CREATE = "create table " 
      + TABLE_FAVORITES + "(" + ALB_ID + " text primary key, " + ALB_NAME 
      + " text, " + ALB_SINGER + " text, " + ALB_GENRE + " text, " 
      + ALB_MIX + " text, " + ALB_THUMB + " text" + ");"; 

那麼可以嗎anybod喲幫助我!?

+0

什麼ALB_ID的值是多少? – laalto 2013-04-08 11:35:05

+0

@laalto calue的ALB_ID是1 – 2013-04-08 11:36:44

+0

在你的數據庫中,你使用的是兩種類型的約束,第一種是表_properties,ALB_ID是主鍵,TABLE_SONGS,album_id是外鍵,所以Alb_id始終是唯一的ant not null,來自父表的album_id引用檢查album_id是否可用父表中 – sri 2013-04-08 11:36:53

回答

2

你在做什麼列?

您嘗試在收藏夾之前插入歌曲嗎? 歌曲應該引用不存在的收藏夾?使用AUTOINCREMENT

更改順序...

addSongs(album.getSongs(), album.getTAG_ID()); 
    database.insert(TABLE_FAVORITES, null, values); 

database.insert(TABLE_FAVORITES, null, values); 
    addSongs(album.getSongs(), album.getTAG_ID()); 

開始。 我不知道你在哪裏取album.getTAG_ID()的值,但是你的解決方案在任何情況下都是錯誤的。應改爲類似:

final long id = database.insert(TABLE_FAVORITES, null, values); 
    addSongs(album.getSongs(), id); 

而且表:

private static final String DATABASE_CREATE = "create table " 
     + TABLE_FAVORITES + "(" + ALB_ID + " INTEGER primary key AUTOINCREMENT, " + ALB_NAME 
     + " text, " + ALB_SINGER + " text, " + ALB_GENRE + " text, " 
     + ALB_MIX + " text, " + ALB_THUMB + " text" + ");"; 

和方法當然簽名:

public void addSongs(ArrayList<Songs> arrayList, long albumID)... 
0

確保您因此未空值傳遞到您聲明爲NOT NULL

+0

它是回答還是評論? – 2013-04-08 11:31:29

+0

@Arun C Thomas我想我傳遞一個空值,但我沒有在表查詢中聲明不爲空。這可能是問題嗎? – 2013-04-08 11:32:47

+0

也確保在插入新表之前清除表,因爲重複的主鍵也會導致此錯誤所以請嘗試卸載該應用程序並重新安裝它。 – 2013-04-08 11:39:28

0

哈,你已經錯過了一些東西真的很重要,基列_ID ! 這必須是INTEGER和NOT NULL。您也可以將其分配給AUTOINCREMENT。

請瀏覽此網站:https://developer.android.com/training/basics/data-storage/databases.html(Android開發者指南,瞭解有關SQLite數據庫)

而且,本教程也可以幫助你: 1部分:http://www.smashingmagazine.com/2010/10/25/get-started-developing-for-android-with-eclipse/

第2部分:http://www.smashingmagazine.com/2011/03/28/get-started-developing-for-android-with-eclipse-reloaded/