2012-11-07 4 views
2

이것이 일반적인 문제이지만이 문제가 해결 된 것이 하나도 없습니다. 나는 튜토리얼 here을 밀접하게 따르는 ContentProvider를 만들었습니다. super.onCreate가 바로 다음에 수행하는 onCreate 메소드의 내 활동에서이 작업을 수행합니다.ContentProvider getWriteableDatabase가 NullPointerException을 반환합니다.

StitchProvider stitchProvider = new StitchProvider(); 
stitchProvider.delete(STITCHES_URI, null, null); 

StitchProvider는 내 ContentProvider입니다. 나는이 코드를 디버거를 통해 따라 왔고 중단 점을 어디에 두 었는지에 따라 두 가지 중 하나가 발생하지만 LogCat에서 NullPointerException이 발생합니다. 첫 번째 옵션은 여기에 중단 점을 넣는 것입니다.

public SQLData(Context c) { 
    super(c, DATABASENAME, null, DATABASEVERSION); 
} 

SQLData는 내 데이터베이스 클래스입니다. 여기에 중단 점을 넣으면 Context가 [email protected]과 동일하다는 것을 알 수 있습니다. 다음 코드는 StitchProvider의에서 onCreate 메서드에 반환

public boolean onCreate() { 
    mDB = new SQLData(getContext()); 
    return true; 
} 

및 MDB는 [email protected]된다. 지금까지는 그렇게 좋았지 만 return 문을 지나치려고하면 NullPointerException이 발생합니다. 중단 점을 StitchProvider의 delete 메서드 내로 옮기면 getWriteableDatabase 행에 도달 할 때까지 모든 것이 잘됩니다.이 시점에서 NullPointerException이 발생합니다. 여기 StitchProvider의 삭제 방법입니다 : 내가 발견 한

public int delete(Uri uri, String selection, String[] selectionArgs) { 
    int uriType = sURIMatcher.match(uri); 
    int rowsAffected = 0; 
    switch (uriType) 
    { 
    case STITCHES: 
     SQLiteDatabase sqlDB = mDB.getWritableDatabase(); 
     rowsAffected = sqlDB.delete(STITCHTABLE_BASEPATH, selection, selectionArgs); 
     break; 
    case STITCHES_ID: 
     SQLiteDatabase sqlDBwithID = mDB.getWritableDatabase(); 
     String id = uri.getLastPathSegment(); 
     if (TextUtils.isEmpty(selection)) 
     { 
      rowsAffected = sqlDBwithID.delete(STITCHTABLE_BASEPATH, SQLData.KEY_ROWID + "=" + id, null); 
     } 
     else 
     { 
      rowsAffected = sqlDBwithID.delete(STITCHTABLE_BASEPATH, selection + " and " + SQLData.KEY_ROWID + "=" + id, selectionArgs); 
     } 
     break; 
    default: 
     throw new IllegalArgumentException("Unknown or Invalid URI " + uri); 
    } 
    getContext().getContentResolver().notifyChange(uri, null); 
    return rowsAffected; 
} 

한 가지, 내가하는 SQLData의에서 onCreate 방법에 중단 점을 설정하면, 내가 거기에 결코 것입니다. 나는 문제의 일부가 데이터베이스가 생성되지 않는다고 생각하지만, 왜 그런지는 모른다. 사람들이 원하는만큼 많은 코드 나 LogCat을 게시 할 것이고, 사람들에게 코드를 압도하고 싶지는 않을 것입니다. 어쨌든 언제나처럼, 당신은 어떤 제안이 있다면, 그것은 좋을 것입니다, 그리고 고마워요!

+1

나는 당신이 자체적으로 공급자를 인스턴스화하지 않기를 희망한다. 그 구성 요소가 시스템에 의해 초기화되어야하고 getContentResolver()와 함께 사용되어야한다. (예 : http://developer.android.com/guide /topics/providers/content-provider-basics.html). – Luksprog

+0

Luksprog - 링크로 이동하려했으나 404 Not Found 오류가 발생합니다. 당신은 정교 할 수 있습니까? 나는 안드로이드 초보자이고 ContentProviders는 완전히 새로운 사람이다. 감사! – Melanie

+0

죄송합니다. 링크를 제대로 복사하지 않았습니다 (다시 확인하십시오). 해당 링크의 정보를 통해 문제를 해결할 수 있습니다. 다른 질문에서도 같은 실수를 한 적이 있습니다. – Luksprog

답변

4

ContentProvider은 Android 시스템에서 관리하므로 코드에서 제공자를 인스턴스화 한 것을 볼 수 있습니다. ContentProvider을 사용하는 올바른 방법은 이며 ActivitygetContentResolver()입니다.

ContentProviders에 대한 자세한 내용과 android 개발자 사이트의 official tutorial에서 사용 방법을 확인할 수 있습니다.

관련 문제