2016-05-15 149 views
3

當我向數據庫中添加一個新項目時,在我的應用程序中發生異常。android.database.sqlite.SQLiteConstraintException:NOT NULL約束失敗:albums.path(代碼1299)

Error inserting time=2016年05月14日 23:42:03 content=zxdc 
    android.database.sqlite.SQLiteConstraintException: NOT NULL constraint failed: albums.path (code 1299) 
     at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method) 
     at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:780) 
     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:1471) 
     at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1341) 
     at com.driver.shinekaye.olddriver.AddContent.addDB(AddContent.java:53) 
     at com.driver.shinekaye.olddriver.AddContent.onClick(AddContent.java:70) 
     at android.view.View.performClick(View.java:5198) 
     at android.view.View$PerformClick.run(View.java:21147) 
     at android.os.Handler.handleCallback(Handler.java:739) 
     at android.os.Handler.dispatchMessage(Handler.java:95) 
     at android.os.Looper.loop(Looper.java:148) 
     at android.app.ActivityThread.main(ActivityThread.java:5417) 
     at java.lang.reflect.Method.invoke(Native Method) 
     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 

我的適配器:

public class MyAdapter extends BaseAdapter { 

    private Context context; 
    private Cursor cursor; 
    private LinearLayout layout; 

    public MyAdapter(Context context, Cursor cursor) { 
     this.context = context; 
     this.cursor = cursor; 

    } 

    @Override 
    public int getCount() { 
     return cursor.getCount(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return cursor.getPosition(); 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     LayoutInflater inflater = LayoutInflater.from(context); 
     layout = (LinearLayout) inflater.inflate(R.layout.activity_secretalbum_item, null); 
     TextView contentTv = (TextView) layout.findViewById(R.id.list_content); 
     TextView timeTv = (TextView) layout.findViewById(R.id.list_time); 
     ImageView imgIv = (ImageView) layout.findViewById(R.id.list_img); 
     ImageView videoIv = (ImageView) layout.findViewById(R.id.list_video); 
     cursor.moveToPosition(position); 
     String content = cursor.getString(cursor.getColumnIndex("content")); 
     String time = cursor.getString(cursor.getColumnIndex("time")); 
     contentTv.setText(content); 
     timeTv.setText(time); 

     return layout; 
    } 
} 

表:

public class SecretAlbumDB extends SQLiteOpenHelper { 

    public static final String TABLE_NAME = "albums"; 
    public static final String CONTENT = "content"; 
    public static final String PATH = "path"; 
    public static final String VIDEO = "video"; 
    public static final String ID = "_id"; 
    public static final String TIME = "time"; 

    public SecretAlbumDB(Context context) { 
     super(context, "albums", null, 1); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     db.execSQL("CREATE TABLE " + TABLE_NAME + "(" + ID 
       + " INTEGER PRIMARY KEY AUTOINCREMENT," + CONTENT 
       + " TEXT NOT NULL," + PATH 
       + " TEXT NOT NULL," + VIDEO 
       + " TEXT NOT NULL," + TIME 
       + " TEXT NOT NULL)"); 
    } 

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

    } 
} 

查詢

public void selectDB() { 
    Cursor cursor = dbReader.query(SecretAlbumDB.TABLE_NAME, null, null, null, null, null, null); 
    adapter = new MyAdapter(this, cursor); 
    list.setAdapter(adapter); 

插入:

private void addDB() { 
    ContentValues cv = new ContentValues(); 
    cv.put(SecretAlbumDB.CONTENT, editText.getText().toString()); 
    cv.put(SecretAlbumDB.TIME, getTime()); 
    dbWriter.insert(SecretAlbumDB.TABLE_NAME, null, cv); 
} 

有人能幫我嗎?

回答

8

您的數據庫定義如下NOT NULL值:

CONTENT 
PATH 
VIDEO 
TIME 

但在你addDB你只投入ContentValues內容和時間,所以它肯定找PATH和視頻了。如果他們不存在,它會給出錯誤。有兩種解決辦法:

解決方案1:

 db.execSQL("CREATE TABLE " + TABLE_NAME + "(" + ID 
      + " INTEGER PRIMARY KEY AUTOINCREMENT," + CONTENT 
      + " TEXT NOT NULL," + PATH 
      + " TEXT," + VIDEO 
      + " TEXT," + TIME 
      + " TEXT NOT NULL)"); 

解決方案2::

添加VIDEO和路徑ContentValues:

private void addDB() { 
    ContentValues cv = new ContentValues(); 
    cv.put(SecretAlbumDB.CONTENT, editText.getText().toString()); 
    cv.put(SecretAlbumDB.TIME, getTime()); 
    cv.put(SecretAlbumDB.VIDEO, getVideo()); 
    cv.put(SecretAlbumDB.Path, getPath()); 

    dbWriter.insert(SecretAlbumDB.TABLE_NAME, null, cv); 
} 

從VIDEO和PATH除去NOT NULL約束

+0

我剛開始學習sqlite,所以我犯這樣的錯誤,謝謝!問題解決了! –

+0

@KayeShine好運,請將答案標記爲已接受,以便問題可以被關閉 – Pooya

+0

@Pooya雖然接受答案後問題不會被關閉!不用擔心。 –

1

當然,您已將所有字段(列)聲明爲NOT NULL,並且在插入cv時未將值放入這些字段。要麼使這些列null可以接受,要麼將所有值設置爲cv,對於每個列爲NOT NULL的列。

+0

謝謝您的回答! –

+0

不客氣! –

相關問題