2014-10-29 55 views
0

我在我的應用程序中創建一個筆記功能,並使用它的谷歌筆記教程。 它工作完美,但在所有設備上,除了一個我得到SQLiteConstraintException: notes.date may not be NULL (code 19)SQLiteConstraintException:notes.date可能不是NULL(代碼19)

這裏的日誌:

10-29 16:01:39.392: E/SQLiteDatabase(7434): Error inserting body=testbody 
10-29 16:01:39.392: E/SQLiteDatabase(7434): title=testtitle 
10-29 16:01:39.392: E/SQLiteDatabase(7434): android.database.sqlite.SQLiteConstraintException: notes.date may not be NULL (code 19) 
10-29 16:01:39.392: E/SQLiteDatabase(7434):  at android.database.sqlite.SQLiteConnection.nativeExecuteForLastInsertedRowId(Native Method) 
10-29 16:01:39.392: E/SQLiteDatabase(7434):  at android.database.sqlite.SQLiteConnection.executeForLastInsertedRowId(SQLiteConnection.java:779) 
10-29 16:01:39.392: E/SQLiteDatabase(7434):  at android.database.sqlite.SQLiteSession.executeForLastInsertedRowId(SQLiteSession.java:788) 
10-29 16:01:39.392: E/SQLiteDatabase(7434):  at android.database.sqlite.SQLiteStatement.executeInsert(SQLiteStatement.java:86) 
10-29 16:01:39.392: E/SQLiteDatabase(7434):  at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1469) 
10-29 16:01:39.392: E/SQLiteDatabase(7434):  at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1339) 
10-29 16:01:39.392: E/SQLiteDatabase(7434):  at com.fleank.skybuddy.NotesDbAdapter.createNote(NotesDbAdapter.java:125) 
10-29 16:01:39.392: E/SQLiteDatabase(7434):  at com.fleank.skybuddy.NoteEdit.saveState(NoteEdit.java:129) 
10-29 16:01:39.392: E/SQLiteDatabase(7434):  at com.fleank.skybuddy.NoteEdit.onPause(NoteEdit.java:102) 
10-29 16:01:39.392: E/SQLiteDatabase(7434):  at android.app.Activity.performPause(Activity.java:5224) 
10-29 16:01:39.392: E/SQLiteDatabase(7434):  at android.app.Instrumentation.callActivityOnPause(Instrumentation.java:1232) 
10-29 16:01:39.392: E/SQLiteDatabase(7434):  at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3197) 
10-29 16:01:39.392: E/SQLiteDatabase(7434):  at android.app.ActivityThread.performPauseActivity(ActivityThread.java:3166) 
10-29 16:01:39.392: E/SQLiteDatabase(7434):  at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3144) 
10-29 16:01:39.392: E/SQLiteDatabase(7434):  at android.app.ActivityThread.access$800(ActivityThread.java:162) 
10-29 16:01:39.392: E/SQLiteDatabase(7434):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1381) 
10-29 16:01:39.392: E/SQLiteDatabase(7434):  at android.os.Handler.dispatchMessage(Handler.java:107) 
10-29 16:01:39.392: E/SQLiteDatabase(7434):  at android.os.Looper.loop(Looper.java:194) 
10-29 16:01:39.392: E/SQLiteDatabase(7434):  at android.app.ActivityThread.main(ActivityThread.java:5371) 
10-29 16:01:39.392: E/SQLiteDatabase(7434):  at java.lang.reflect.Method.invokeNative(Native Method) 
10-29 16:01:39.392: E/SQLiteDatabase(7434):  at java.lang.reflect.Method.invoke(Method.java:525) 
10-29 16:01:39.392: E/SQLiteDatabase(7434):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:833) 
10-29 16:01:39.392: E/SQLiteDatabase(7434):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:600) 
10-29 16:01:39.392: E/SQLiteDatabase(7434):  at dalvik.system.NativeStart.main(Native Method) 

奇怪啄的是,我沒有定義的任何日期值。正如你所看到的,我只有標題和正文。我是否缺少任何基本的SQL知識? 我不得不承認,我完全同意這個問題失去了:-(

我saveState和()方法:

private void saveState() { 
    String title = mTitleText.getText().toString(); 
    String body = mBodyText.getText().toString(); 

    if (title.equals("") && body.equals("")) { 
     if (note != null) { 
      note.close(); 
      note = null; 
     } 
     if (mRowId != null) { 
      mDbHelper.deleteNote(mRowId); 
     } 
    } 

    else { 
     if (mRowId == null) { 
      long id = mDbHelper.createNote(title, body); //This is row 129 
      if (id > 0) { 
       mRowId = id; 
      } 
     } else { 
      mDbHelper.updateNote(mRowId, title, body); 
     } 
    } 

...從NotesDBAdapter的createNote()方法:

public long createNote(String title, String body) { 
    ContentValues initialValues = new ContentValues(); 
    initialValues.put(KEY_TITLE, title); 
    initialValues.put(KEY_BODY, body); 

    return mDb.insert(DATABASE_TABLE, null, initialValues); //This is row 125 
} 

任何幫助,高度讚賞

更新:新增完整的NotesDbAdapter與創建(攝從谷歌筆記教程和略微調整到我的需要):

public class NotesDbAdapter { 

public static final String KEY_TITLE = "title"; 
public static final String KEY_BODY = "body"; 
public static final String KEY_ROWID = "_id"; 

private static final String TAG = "NotesDbAdapter"; 
private DatabaseHelper mDbHelper; 
private SQLiteDatabase mDb; 

/** 
* Database creation sql statement 
*/ 
private static final String DATABASE_CREATE = 
    "create table notes (_id integer primary key autoincrement, " 
    + "title text not null, body text not null);"; 

private static final String DATABASE_NAME = "data"; 
private static final String DATABASE_TABLE = "notes"; 
private static final int DATABASE_VERSION = 2; 

private final Context mCtx; 

private static class DatabaseHelper extends SQLiteOpenHelper { 

    DatabaseHelper(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 

     db.execSQL(DATABASE_CREATE); 
    } 

    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     Log.w(TAG, "Upgrading database from version " + oldVersion + " to " 
       + newVersion + ", which will destroy all old data"); 
     db.execSQL("DROP TABLE IF EXISTS notes"); 
     onCreate(db); 
    } 
} 

/** 
* Constructor - takes the context to allow the database to be 
* opened/created 
* 
* @param ctx the Context within which to work 
*/ 
public NotesDbAdapter(Context ctx) { 
    this.mCtx = ctx; 
} 

/** 
* Open the notes database. If it cannot be opened, try to create a new 
* instance of the database. If it cannot be created, throw an exception to 
* signal the failure 
* 
* @return this (self reference, allowing this to be chained in an 
*   initialization call) 
* @throws SQLException if the database could be neither opened or created 
*/ 
public NotesDbAdapter open() throws SQLException { 
    mDbHelper = new DatabaseHelper(mCtx); 
    mDb = mDbHelper.getWritableDatabase(); 
    return this; 
} 

public void close() { 
    mDbHelper.close(); 
} 


/** 
* Create a new note using the title and body provided. If the note is 
* successfully created return the new rowId for that note, otherwise return 
* a -1 to indicate failure. 
* 
* @param title the title of the note 
* @param body the body of the note 
* @return rowId or -1 if failed 
*/ 
public long createNote(String title, String body) { 
    ContentValues initialValues = new ContentValues(); 
    initialValues.put(KEY_TITLE, title); 
    initialValues.put(KEY_BODY, body); 

    return mDb.insert(DATABASE_TABLE, null, initialValues); 
} 

/** 
* Delete the note with the given rowId 
* 
* @param rowId id of note to delete 
* @return true if deleted, false otherwise 
*/ 
public boolean deleteNote(long rowId) { 

    return mDb.delete(DATABASE_TABLE, KEY_ROWID + "=" + rowId, null) > 0; 
} 

/** 
* Return a Cursor over the list of all notes in the database 
* 
* @return Cursor over all notes 
*/ 
public Cursor fetchAllNotes() { 

    return mDb.query(DATABASE_TABLE, new String[] {KEY_ROWID, KEY_TITLE, 
      KEY_BODY}, null, null, null, null, null); 
} 

/** 
* Return a Cursor positioned at the note that matches the given rowId 
* 
* @param rowId id of note to retrieve 
* @return Cursor positioned to matching note, if found 
* @throws SQLException if note could not be found/retrieved 
*/ 
public Cursor fetchNote(long rowId) throws SQLException { 

    Cursor mCursor = 

     mDb.query(true, DATABASE_TABLE, new String[] {KEY_ROWID, 
       KEY_TITLE, KEY_BODY}, KEY_ROWID + "=" + rowId, null, 
       null, null, null, null); 
    if (mCursor != null) { 
     mCursor.moveToFirst(); 
    } 
    return mCursor; 

} 

/** 
* Update the note using the details provided. The note to be updated is 
* specified using the rowId, and it is altered to use the title and body 
* values passed in 
* 
* @param rowId id of note to update 
* @param title value to set note title to 
* @param body value to set note body to 
* @return true if the note was successfully updated, false otherwise 
*/ 
public boolean updateNote(long rowId, String title, String body) { 
    ContentValues args = new ContentValues(); 
    args.put(KEY_TITLE, title); 
    args.put(KEY_BODY, body); 

    return mDb.update(DATABASE_TABLE, args, KEY_ROWID + "=" + rowId, null) > 0; 
} 
} 
+1

您的表有'日期'列'not null',因爲你不是爲列提供一個值,它默認爲null。發佈您的架構(「CREATE TABLE」等)。 – laalto 2014-10-29 15:39:38

+0

@laalto請參閱我的更新。 – sascha 2014-10-29 15:46:54

+1

您是否在不更新'DATABASE_VERSION' /刪除舊數據庫文件的情況下編輯模式? – laalto 2014-10-29 15:49:36

回答

2

錯誤表明你有一個列'日期'具有非空約束。

由於DATABASE_CREATE沒有提及'date',我只能假定它曾經用過,然後在不更新DATABASE_VERSION的情況下對其進行了更改。嘗試增加它,因爲它應該然後調用升級,這將降低數據庫,讓您創建沒有'日期'列的新版本

+0

你說得對,就像laalto寫的一樣。這是我愚蠢的錯誤,我已經改變了數據庫沒有首先卸載它,所以仍然有日期。感謝提示,併爲我的愚蠢問題感到抱歉 – sascha 2014-10-29 16:20:54

相關問題