2016-05-15 6 views
3

Eine Ausnahme ist in meiner App passiert, wenn ich ein neues Element in meine Datenbank hinzufügen.android.database.sqlite.SQLiteConstraintException: NOT NULL Constraint fehlgeschlagen: albums.path (code 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) 

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

Die Tabelle:

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

    } 
} 

Die Abfrage

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

Der Einsatz:

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

Könnte mir bitte jemand helfen?

Antwort

8

Sie haben folgende NOT NULL-Werte in Ihrer Datenbankdefinition:

CONTENT 
PATH 
VIDEO 
TIME 

Aber in Ihrem ADDDB Sie nur inhaltlich und zeitlich in content setzen, so dass es auf jeden Fall für PATH und VIDEO zu suchen. Wenn sie nicht vorhanden sind, wird der Fehler angezeigt. Es gibt zwei Lösungs:

Lösung 1:

entfernen NOT NULL von VIDEO und PFAD:

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

Lösung 2:

hinzufügen VIDEO und PATH content:

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

Ich habe gerade angefangen, den SQLite zu lernen, also mache ich solche Fehler, danke! Probleme gelöst! –

+0

@KayeShine ok viel Glück, bitte markieren Sie die Antwort als akzeptiert, so dass die Frage geschlossen werden kann – Pooya

+0

@Pooya Frage wird nicht geschlossen werden nach Annahme der Antwort obwohl! Keine Sorgen machen. –

1

Sicher haben Sie Ihre alle Felder (Spalten) als NOT NULL deklariert und Sie haben den Wert nicht in diese Felder gelegt, während Sie cv einfügen. Nehmen Sie entweder die folgenden Spalten vor: null, oder geben Sie für alle Spalten, die NOT NULL lauten, alle Werte auf cv an.

+0

Vielen Dank für Ihre Antwort! –

+0

Gern geschehen! –

Verwandte Themen