2011-10-08 82 views
15

我已经看到关于此问题的其他一些问题,但没有一个答案真的似乎适用于我的代码。当我试图插入我的数据库时,出现'SQLiteConstraintException:错误代码19:约束失败'错误。这是插入操作的代码。 db.insert现在返回-1,这导致“无法插入”消息。SQLiteConstraintException:错误代码19:约束失败 - Android错误

下面是相关的内容提供商代码:

public static final String PROVIDER_NAME = "com.oliverapps.provider.DB"; 

public static final Uri CONTENT_URI = Uri.parse("content://"+ PROVIDER_NAME + "/tasks"); 

public static final String _ID = "_id"; 
public static final String CATEGORY = "category"; 
public static final String STORE = "store"; 
public static final String DESCRIPTION = "description"; 
public static final String DISTANCE = "distance"; 
public static final String CHECKED = "checked"; 

private static final int KEY_CATEGORY = 1; 
private static final int KEY_STORE = 2; 
private static final int KEY_DESCRIPTION = 3; 
private static final int KEY_DISTANCE = 4; 
private static final int KEY_CHECKED = 5; 

private static final UriMatcher uriMatcher; 
static{ 
    uriMatcher = new UriMatcher(UriMatcher.NO_MATCH); 
    uriMatcher.addURI(PROVIDER_NAME, "category", KEY_CATEGORY); 
    uriMatcher.addURI(PROVIDER_NAME, "category/store", KEY_STORE); 
    uriMatcher.addURI(PROVIDER_NAME, "category/store/description", KEY_DESCRIPTION); 
    uriMatcher.addURI(PROVIDER_NAME, "category/store/description/distance", KEY_DISTANCE); 
    uriMatcher.addURI(PROVIDER_NAME, "checked", KEY_CHECKED); 
} 


//---for database use--- 
private SQLiteDatabase tasksDB; 
private static final String DATABASE_NAME = "tasks"; 
private static final String DATABASE_TABLE = "tasks" + 
     ""; 
private static final int DATABASE_VERSION = 1; 
private static final String DATABASE_CREATE = 
    "create table " + DATABASE_TABLE + 
    " (" + _ID + " integer primary key autoincrement, " + 
    CATEGORY + " text not null, " + STORE + " text not null, " + DESCRIPTION + " text, " + 
    DISTANCE + " text not null, " + CHECKED + " text not null);"; 

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("Content provider database", "Upgrading database from version " + 
       oldVersion + " to " + newVersion + ", which will destroy all old data"); 
     db.execSQL("DROP TABLE IF EXISTS " + DATABASE_TABLE); 
     onCreate(db); 
    } 
} 


@Override 
public Uri insert(Uri uri, ContentValues values){ 
    //---add a new task--- 
    long rowID = tasksDB.insert(DATABASE_TABLE, "", values); 

    //---if added successfully--- 
    if(rowID > 0){ 
     Uri _uri = ContentUris.withAppendedId(CONTENT_URI, rowID); 
     getContext().getContentResolver().notifyChange(_uri, null); 
     return _uri; 
    } 
    throw new SQLException("Failed to insert row into " + uri); 
} 

@Override 
public boolean onCreate(){ 
    Context context = getContext(); 
    DatabaseHelper dbHelper = new DatabaseHelper(context); 
    tasksDB = dbHelper.getWritableDatabase(); 
    return (tasksDB == null)? false:true; 
} 

下面是Android清单的相关代码:

<provider android:name="DBProvider" 
     android:authorities="com.oliverapps.provider.DB" /> 

这里是相关的代码,它上面的插入方法:

ContentValues values = new ContentValues(); 
       values.put(DBProvider.CATEGORY, category); 
       values.put(DBProvider.STORE, store); 
       values.put(DBProvider.DESCRIPTION, description); 
       values.put(DBProvider.DISTANCE, distance); 

       Uri uri = getContentResolver().insert(DBProvider.CONTENT_URI, values); 

任何线索为什么这不工作?这主要是我的Android书中的代码,修改为我自己的数据库。

回答

42

典型错误如下:

  • 你想插入null值它们是约束列是不null(所以也许错过了设定值,甚至可能因为错误的列常量定义的) 。
  • 你独特的(典型的主键列),它被宣布为列
  • 您设置插入(如列integer但您设置了string

错误类型的值插入相同的值我认为你忘了设置CHECKED,因此它是null并违反了not null约束。

+0

DATABASE_CREATE代码位于上面的内容提供程序代码中...至于其他说明...我实际上输入了我自己的数据,因此我知道没有空值,我检查了调试时输入的值确保正在输入正确的字符串。我相信我已将所有列保存为字符串,因此不需要完成整数或双精度转换的字符串。而唯一的价值在这里应该是_id,我不会输入自己(我认为DB会自动为我输入一个......如果我错了,请让我知道)....任何其他想法? – Rebecca

+0

我很抱歉,我不知何故错过了那些常量......我更新了我的答案。 – Knickedi

+0

你是绝对正确的,错过了添加检查,因为它没有输入。谢谢! – Rebecca

相关问题