2010-08-23 70 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