Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/195.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQLiteConstraintException:错误代码19:约束失败--Android错误_Android_Android Contentprovider - Fatal编程技术网

SQLiteConstraintException:错误代码19:约束失败--Android错误

SQLiteConstraintException:错误代码19:约束失败--Android错误,android,android-contentprovider,Android,Android Contentprovider,我已经看到了一些关于这方面的其他问题,但是没有一个答案对我的代码真正起作用。当我尝试插入数据库时,我收到一个“SQLiteConstraintException:错误代码19:约束失败”错误。以下是插入操作的代码。db.insert立即返回-1,这将导致“插入失败”消息 以下是相关内容提供商代码的详细信息: public static final String PROVIDER_NAME = "com.oliverapps.provider.DB"; public static final U

我已经看到了一些关于这方面的其他问题,但是没有一个答案对我的代码真正起作用。当我尝试插入数据库时,我收到一个“SQLiteConstraintException:错误代码19:约束失败”错误。以下是插入操作的代码。db.insert立即返回-1,这将导致“插入失败”消息

以下是相关内容提供商代码的详细信息:

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" />

有什么线索说明这不起作用吗?这主要是我从一本Android书籍中得到的代码,修改到我自己的数据库中。

典型错误如下:

  • 您正在尝试为约束为非
    null
    的列插入
    null
    值(因此可能无法设置值,甚至可能是因为列常量定义错误)
  • 您正在为声明为唯一的列(典型的主键列)插入相同的值
  • 您为insert设置了错误类型的值(例如,列是
    整数
    ,但您设置了
    字符串

我认为您忘记设置
已选中
,因此它是
空的
,并且违反了
非空
约束。

数据库创建代码位于上面的内容提供商代码中。。。至于其他注释…我实际上是在输入我自己的数据,所以我知道没有空值,我在调试时检查了输入的值,以确保输入的字符串正确。我相信我已将所有列保存为字符串,因此不需要进行字符串到整数或双精度转换。这里唯一唯一唯一的值应该是_id,我自己不输入(我想DB会自动为我输入一个…,如果我在这方面错了,请告诉我)…还有其他想法吗?对不起,我不知怎么错过了这些常量。。。我更新了我的答案。你完全正确,没有添加复选框,因为它不是输入。非常感谢。如果定义了一个int并输入了1000万,java将把它视为long而不是int。这种情况可能会导致SQLiteConstraintException:错误代码19:
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);