2015-02-15 5 views
0

Я пытаюсь вставить запись в базу данных sqlite и минуя contentResolver. Первый класс с именем EventProvider расширяет ContentProvider, а также содержит экземпляр моего вспомогательного класса базы данных SQLite, как показано ниже. Таким образом, код в первом классе отлично работает, когда я вставляю записи через contentResolver, но в классе EventJSONParser я хочу вставить запись непосредственно в sqlite, вместо этого через исключение NullPointerException в SQLiteDatabase db = provider.getDatabase(); строка кода в методе unmarshalEventQuery. Я подозреваю, что экземпляр базы данных не создается методом onCreate(). Пожалуйста, мне нужны предложения по решению этой проблемы. Благодарю.Невозможно вставить запись в базу данных SQLite из другого класса

Первый класс:

public class EventProvider extends ContentProvider{ 
private DatabaseHelper helper; 
private SQLiteDatabase db; 

@Override 
public boolean onCreate() { 
    helper = new DatabaseHelper(getContext()); 
    db = helper.getWritableDatabase(); 
    return true; 
} 

public SQLiteDatabase getDatabase(){ 
    return db; 
} 

@Override 
public Uri insert(Uri uri, ContentValues values) { 
    if (BuildConfig.DEBUG) { Log.d(TAG, "[email protected]" + uri); } 

    switch (uriMatcher.match(uri)){ 
     case EVENTS_DIR: 
      break; 
     default: 
      throw new UnsupportedOperationException("Unrecognized URI: " + uri); 
    } 

    values = COLUMN_MAP.translateCols(values); 
    values.put(DatabaseContract.COL_DIRTY, MARK);enter code here 

    SQLiteDatabase db = getDatabase(); 
    return eventInsert(uri, values, db); 
} 

public Uri eventInsert(Uri uri, ContentValues values, SQLiteDatabase mdb){ 
    if (BuildConfig.DEBUG){ 
     Log.d(TAG, "[email protected]" + uri + ": {" + values + "}"); 
    } 

    long pk = mdb.insert(DatabaseContract.EVENT_TABLE, null, values); 

    if (pk > 0) { 
     uri = null; 
    } else{ 
     uri = uri.buildUpon().appendPath(String.valueOf(pk)).build(); 
     getContext().getContentResolver().notifyChange(uri, null); 
    } 
    return uri; 
} 

Второй класс:

public class EventJSONParser { 

private EventProvider provider; 

public EventJSONParser(EventProvider restfulProvider){ 
    provider = restfulProvider; 
} 

public void unmarshalEventQuery(JSONObject json){ 
    try { 
     String error = json.getString(Const.KEY_ERROR); 
     int statusCode = json.getInt(Const.KEY_STATUS_CODE); 

     if (error.equals("false") && statusCode == 200){ 
      JSONArray events = json.getJSONArray(TAG_EVENTS); 

      for(int i = 0; i < events.length(); i++){ 
       JSONObject e = events.getJSONObject(i); 
       ContentValues values = new ContentValues(); 

       values.put(UNMARSHAL_TAB.get(TAG_EVENT_ID), e.getString(TAG_EVENT_ID)); 
       values.put(UNMARSHAL_TAB.get(TAG_CAL_ID), e.getString(TAG_CAL_ID)); 
       values.put(UNMARSHAL_TAB.get(TAG_EVENT_TITLE), e.getString(TAG_EVENT_TITLE)); 
       values.put(UNMARSHAL_TAB.get(TAG_START_DATE), e.getString(TAG_START_DATE)); 
       values.put(UNMARSHAL_TAB.get(TAG_END_DATE), e.getString(TAG_END_DATE)); 
       values.put(UNMARSHAL_TAB.get(TAG_LOCATION), e.getString(TAG_LOCATION)); 
       values.put(UNMARSHAL_TAB.get(TAG_VISIBILITY), e.getString(TAG_VISIBILITY)); 
       values.put(UNMARSHAL_TAB.get(TAG_DESCRIPTION), e.getString(TAG_DESCRIPTION)); 

       SQLiteDatabase db = provider.getDatabase(); 
       Uri uri = provider.eventInsert(EventContract.EVENT_URI, values, db); 
       Log.e(TAG, "query uri" + uri); 
      } 
     } 
    }catch (JSONException ex){ 
     ex.printStackTrace(); 
    } 
} 

}

+1

где с помощью 'EventJSONParser' класса добавьте код вопрос –

ответ

0

Вы должны открыть базу данных перед выполнением операции в базе данных. Этот файл класса

public CourseGateWay(Context context) { 
     dbOpenHelper = new DBOpenHelper(context); 
     this.context = context; 
    } 

    public void open() { 
     try { 
      sqLiteDB = dbOpenHelper.getWritableDatabase(); 
     } catch (SQLException s) { 
      new Exception("Error with DB Open"); 
     } 
    } 

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

    public String saveCourse(Courses aCore) { 
     ContentValues contentValues = new ContentValues(); 

     open(); 

     contentValues.put(DBOpenHelper.COURS_CODE, aCore.getcCode()); 
     contentValues.put(DBOpenHelper.COURS_NAME, aCore.getcName()); 
     contentValues.put(DBOpenHelper.COURS_DEPT, aCore.getdCode()); 

     long res = sqLiteDB.insert(DBOpenHelper.TABLE_COURS, null, 
       contentValues); 
     close(); 

     if (res > 0) { 
      return "Course Added with: " + aCore.getcCode(); 
     } else { 
      return "Duplicate Entry with: " + aCore.getcName(); 
     } 

    } 

Пожалуйста, смотрите мой GitHub: here

Для лучшего дать разрешение в манифесте файла:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 
+0

спасибо для вашего ответа .... но так как мое соединение с базой данных было открыто внутри метода onCreate() .... как его повторно использовать для подключения базы данных. – user3816650

+0

откройте и закройте свое соединение db другим способом. После каждой операции DB закройте ваше соединение db, вызывая метод close(). И вызовите метод open() перед каждой операцией DB. –