2011-10-08 13 views
15

मैंने इसके बारे में कुछ और प्रश्न देखे हैं, लेकिन कोई भी जवाब वास्तव में मेरे कोड के लिए काम नहीं कर रहा था। जब मैं अपने डीबी में डालने का प्रयास करता हूं तो मुझे 'SQLiteConstraintException: त्रुटि कोड 19: बाधा विफल' त्रुटि मिल रही है। सम्मिलन ऑपरेशन के लिए कोड यहां दिया गया है। db.insert अभी एक -1 देता है, जो "सम्मिलित करने में विफल" संदेश की ओर जाता है। यहाँSQLiteConstraintException: त्रुटि कोड 19: बाधा विफल - एंड्रॉइड त्रुटि

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

और प्रासंगिक कोड है कि ऊपर डालने प्रणाली को बुलाती है:

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 प्रकट से प्रासंगिक कोड है:

यहाँ प्रासंगिक सामग्री प्रदाता कोड है:

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); 

कोई संकेत क्यों यह काम नहीं कर रहा है? यह ज्यादातर एंड्रॉइड पुस्तक से कोड है, जो मेरे डेटाबेस में संशोधित है।

उत्तर

42

आम त्रुटियों को निम्नलिखित हैं:

  • आप (शायद गलत स्तंभ निरंतर परिभाषा की वजह से है, तो हो सकता है मूल्यों को निर्धारित करने से चूक गए) नहीं null होने के लिए कॉलम जो बाधा हैं के लिए null मूल्यों डालने के लिए कोशिश कर रहे हैं ।
  • आप एक स्तंभ जो घोषित किया जाता है अद्वितीय (विशिष्ट प्राथमिक कुंजी स्तंभ)
  • आप (उदाहरण के लिए स्तंभ integer है, लेकिन आप एक string सेट)

डालने के लिए गलत प्रकार का मान सेट के लिए एक ही मूल्य डालने रहे हैं मुझे लगता है कि आप CHECKED सेट करना भूल गए हैं, इसलिए यह null है और not null बाधा का उल्लंघन करता है।

+0

DATABASE_CREATE कोड उपरोक्त सामग्री प्रदाता कोड में है ... अन्य नोट्स के लिए ... मैं सचमुच अपना डेटा दर्ज कर रहा हूं, इसलिए मुझे पता है कि कोई शून्य मान नहीं है, मैंने डीबगिंग करते समय दर्ज किए गए मानों की जांच की है सुनिश्चित करें कि सही तार इनपुट हो रहे हैं। मेरा मानना ​​है कि मैंने अपने सभी कॉलम स्ट्रिंग के रूप में सहेजे हैं, इसलिए पूर्णांक या डबल रूपांतरण की कोई स्ट्रिंग नहीं की जानी चाहिए। और यहां एकमात्र अद्वितीय मूल्य _id होना चाहिए, जिसे मैं स्वयं इनपुट नहीं करता (मुझे लगता है कि डीबी स्वचालित रूप से मेरे लिए एक डाल देगा ... यदि मैं इस पर गलत हूं तो मुझे बताएं) .... कोई अन्य विचार? – Rebecca

+0

मुझे खेद है, मैंने किसी भी तरह उन स्थिरांक को याद किया ... मैंने अपना जवाब अपडेट किया। – Knickedi

+0

आप बिल्कुल सही हैं, चेक को जोड़ने से चूक गए क्योंकि यह इनपुट नहीं था। धन्यवाद! – Rebecca

संबंधित मुद्दे