android.database.sqlite.SQLiteConstraintException:NOT NULL约束失败:albums.path(代码1299)

时间:2016-05-15 04:02:48

标签: android sqlite

在我的数据库中添加新项目时,我的应用程序发生了异常。

do local e = weaponsList.earth
  e.fireTime = 2
  e.fireRate = 2
  e.speed = 2
end

我的适配器:

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

有人可以帮助我吗?

2 个答案:

答案 0 :(得分:11)

数据库定义中包含以下NOT NULL值:

CONTENT
PATH
VIDEO
TIME

但是在你的addDB中,你只在ContentValues中放置了CONTENT和TIME,所以它肯定也在寻找PATH和VIDEO。如果它们不存在,它将给出错误。有两种解决方案:

解决方案1:

从VIDEO和PATH中删除NOT NULL约束:

        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和PATH添加到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);
}

答案 1 :(得分:1)

您确定已将所有字段(列)声明为NOT NULL,并且在插入cv时您没有将值放到这些字段中。要使这些列null可以接受,要么为cv的每个列将所有值都设置为NOT NULL