2010-08-23 65 views
0

我正在創建一個應用程序,我從不同的活動調用我的數據庫,但我不斷從事物的數據庫端獲取各種錯誤。起初,我得到一個「SQLiteException沒有這樣的數據」,當我刪除我的應用程序並安裝回來,它現在「android.database.sqlite.SQLiteConstraintException:錯誤代碼19:約束失敗」。Android數據庫問題

我不知道該做什麼了。經歷了那麼多不同的例子去了創建數據庫,但我不知道我是否失去了一些東西。這裏是我的數據庫端代碼:?

import android.content.ContentValues; 
import android.content.Context; 
import android.database.Cursor; 
import android.database.SQLException; 
import android.database.sqlite.SQLiteDatabase; 
import android.database.sqlite.SQLiteOpenHelper; 
import android.util.Log; 


public class DBAdapter { 

    private static final String DATABASE_NAME = "MemoData.db"; 
    private static final int DATABASE_VERSION = 1; 
    public static final String DATABASE_TABLE = "Memo"; 

    public static final String KEY_ID = "_id"; 
    public static final String NAME = "Title"; 
    public static final String START_DATE = "start_date"; 
    public static final String END_DATE = "end_date"; 
    public static final String NOTES = "notes"; 

    private static final String TAG = "DBAdapter"; 

    private static final String DATABASE_CREATE = "create table Memo (_id integer primary key autoincrement," 
     + "Title text not null, start_date text not null," 
     + "end_date text not null, " 
     + "notes text not null);"; 

    private final Context context; 
    private DBHelper dbhelper; 
    private SQLiteDatabase db; 

    public DBAdapter(Context context) { 
     this.context = context; 
     dbhelper = new DBHelper(context); 
    } 

    private static class DBHelper extends SQLiteOpenHelper { 

     DBHelper(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 oold data will be lost"); 
      db.execSQL("DROP TABLE IF EXITS Memo"); 
      onCreate(db); 
     } 
    } 

    public DBAdapter open()throws SQLException { 
     db = dbhelper.getWritableDatabase(); 
     return this; 
    } 

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

    public long createItem(String Title, String start_date,String end_date,String notes){ 
      open(); 
      ContentValues initialValues = new ContentValues(); 
      initialValues.put(NAME, Title); 
      initialValues.put(START_DATE, start_date); 
      initialValues.put(END_DATE, end_date); 
      initialValues.put(NOTES, notes); 

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

     public Cursor retrieveItems(){ 
      SQLiteDatabase db = dbhelper.getWritableDatabase(); 
      String[] resultColumns = new String[] {NAME,START_DATE,END_DATE,NOTES };  
    Cursor cursor = db.query(DATABASE_TABLE, resultColumns, null, null, null, null, null); 

      Integer cindex = cursor.getColumnIndex("Title"); 
      String result = "Result = "; 

      if(cursor.moveToFirst()){ 
       do { 
        result += cursor.getString(cindex)+ "-"; 
       }while(cursor.moveToNext()); 
      } 
      return cursor; 
     } 
} 

,這裏是主要的錯誤輸出:

08-23 22:38:17.104:錯誤/數據庫(775):插入註釋時出錯=備註:end_date =截止日期:標題=項目名稱:start_date =開始日期: 08-23 22:38:17.104:錯誤/數據庫(775):android.database.sqlite.SQLiteConstraintException:錯誤代碼19:約束失敗

08-23 22:38:17.104:錯誤/數據庫(775):at android.database.sqlite.SQL iteStatement.native_execute(本機方法)

08-23 22:38:17.104:ERROR /數據庫(775):在android.database.sqlite.SQLiteStatement.execute(SQLiteStatement.java:66)

08- 23 22:38:17.104:ERROR/Database(775):at android.database.sqlite.SQLiteDatabase.insertWithOnConflict(SQLiteDatabase.java:1313)

08-23 22:38:17.104:ERROR/Database(775) :at android.database.sqlite.SQLiteDatabase.insert(SQLiteDatabase.java:1173)

08-23 22:38:17.104:ERROR/Database(775):at com.Memo.DBAdapter.createItem(DBAdapter.java :94)

08-23 22:38:17.104:ERROR /數據庫(775):在com.Memo.NewItem.save(NewItem.java:365)

+0

請修正此代碼塊中的雙倍間距。這是不可讀的。 – EboMike 2010-08-23 21:09:10

回答

0

在你onUpgrade情況下,您要刪除的表DATABASE_NAME ,但不應該是DATABASE_TABLE?

什麼都沒有(除此之外)跳到我身上,當你實例化你的DBAdapter對象時,你會得到這個錯誤嗎?錯誤是否發生在onCreate事件或其他地方?

+0

感謝您指出,我已糾正它。錯誤來自createItem()方法。它給出了一個「錯誤插入」的值。 – irobotxxx 2010-08-23 22:36:21

+0

對不起,我已經清理了一下代碼並添加了主要錯誤信息。這是我得到的,我不知道爲什麼? – irobotxxx 2010-08-23 23:03:28

+0

那麼我能看到的唯一約束就是一切都是「不爲零」。雖然錯誤消息使它看起來像所有東西都有價值,但我會仔細檢查一下。 另外,我讀過,如果有一些鎖定,有時會發生這種情況。看看你的代碼,它與打開數據庫的方式不一致,有時使用一個局部變量,其他人使用一個成員變量,並且當你完成時你要確保你正在調用close()。我不認爲這是問題,但是它有一些潛力,這取決於你的其他課程如何使用它。 – Mike 2010-08-24 22:11:27