Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

android.database.sqlite.SQLiteConstraintException: NOT NULL constraint failed: albums.path (code 1299)

Tags:

android

sqlite

An exception happened in my app when I add a new item into my database.

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)

My adapter:

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;
    }
}

The table:

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) {

    }
}

The query

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

The insert:

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);
}

Could someone please help me?

like image 709
Kaye Shine Avatar asked May 15 '16 04:05

Kaye Shine


1 Answers

You have the following NOT NULL values in your database definition:

CONTENT
PATH
VIDEO
TIME

But in your addDB you only put CONTENT and TIME in ContentValues so it definitely looking for PATH and VIDEO too. If they aren't present, it will give the error. There are two solution:

Solution 1:

remove NOT NULL constraint from VIDEO and PATH:

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

Solution 2:

add VIDEO and PATH to 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);
}
like image 67
Pooya Avatar answered Oct 07 '22 17:10

Pooya