0

mp 응용 프로그램이 시작되면 충돌합니다. "java.lang.RuntimeException : Unable to provider"오류가 발생합니다. 내 연락처 공급자가 지금 DB를 만드는 코드를 보유하고 있기 때문에이 sqlite DB와 관련 있다고 가정합니다. 이 멍청이의 원인을 알아내는 데 도움이되는 모든 것은 도움이됩니다. My Logcat, DB Class 및 provicer 클래스는 다음과 같습니다.SQLite 데이터베이스 오류 [치명적 오류]

로그 캣 :

04-24 12:59:07.305: E/AndroidRuntime(1482): FATAL EXCEPTION: main 
04-24 12:59:07.305: E/AndroidRuntime(1482): java.lang.RuntimeException: Unable to get provider com.loginplus.home.ListProvider: java.lang.NullPointerException 
04-24 12:59:07.305: E/AndroidRuntime(1482): at android.app.ActivityThread.installProvider(ActivityThread.java:4240) 
04-24 12:59:07.305: E/AndroidRuntime(1482): at android.app.ActivityThread.installContentProviders(ActivityThread.java:3992) 
04-24 12:59:07.305: E/AndroidRuntime(1482): at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3946) 
04-24 12:59:07.305: E/AndroidRuntime(1482): at android.app.ActivityThread.access$1300(ActivityThread.java:123) 
04-24 12:59:07.305: E/AndroidRuntime(1482): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1185) 
04-24 12:59:07.305: E/AndroidRuntime(1482): at android.os.Handler.dispatchMessage(Handler.java:99) 
04-24 12:59:07.305: E/AndroidRuntime(1482): at android.os.Looper.loop(Looper.java:137) 
04-24 12:59:07.305: E/AndroidRuntime(1482): at android.app.ActivityThread.main(ActivityThread.java:4424) 
04-24 12:59:07.305: E/AndroidRuntime(1482): at java.lang.reflect.Method.invokeNative(Native Method) 
04-24 12:59:07.305: E/AndroidRuntime(1482): at java.lang.reflect.Method.invoke(Method.java:511) 
04-24 12:59:07.305: E/AndroidRuntime(1482): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:784) 
04-24 12:59:07.305: E/AndroidRuntime(1482): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:551) 
04-24 12:59:07.305: E/AndroidRuntime(1482): at dalvik.system.NativeStart.main(Native Method) 
04-24 12:59:07.305: E/AndroidRuntime(1482): Caused by: java.lang.NullPointerException 
04-24 12:59:07.305: E/AndroidRuntime(1482): at android.database.DatabaseUtils.getSqlStatementType(DatabaseUtils.java:1318) 
04-24 12:59:07.305: E/AndroidRuntime(1482): at android.database.sqlite.SQLiteDatabase.executeSql(SQLiteDatabase.java:1893) 
04-24 12:59:07.305: E/AndroidRuntime(1482): at android.database.sqlite.SQLiteDatabase.execSQL(SQLiteDatabase.java:1839) 
04-24 12:59:07.305: E/AndroidRuntime(1482): at com.loginplus.home.dataStore.onCreate(dataStore.java:27) 
04-24 12:59:07.305: E/AndroidRuntime(1482): at android.database.sqlite.SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:165) 
04-24 12:59:07.305: E/AndroidRuntime(1482): at com.loginplus.home.ListProvider.onCreate(ListProvider.java:75) 
04-24 12:59:07.305: E/AndroidRuntime(1482): at android.content.ContentProvider.attachInfo(ContentProvider.java:944) 
04-24 12:59:07.305: E/AndroidRuntime(1482): at android.app.ActivityThread.installProvider(ActivityThread.java:4237) 
04-24 12:59:07.305: E/AndroidRuntime(1482): ... 12 more 

DB 클래스 :

public class dataStore extends SQLiteOpenHelper { 

//Table attributes 
private static final String DATABASE_NAME = "SiteLogindb"; 
private static String DSTORE_CREATE; 
private static final int DATABASE_VERSION = 2; 


dataStore(Context context) { 
     super(context, DATABASE_NAME, null, DATABASE_VERSION); 
     // TODO Auto-generated constructor stub 
    } 

    @Override 
    public void onCreate(SQLiteDatabase db) { 
     // TODO Auto-generated method stub 
     db.execSQL(DSTORE_CREATE); 

    }   
    @Override 
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { 
     // TODO Auto-generated method stub 
     if(oldVersion == 1 && newVersion == 2){ 
      //Upgrade the database 
    } 

     } 

      } 

컨텐츠 제공자 :

public class ListProvider extends ContentProvider { 


// Content Provider Uri and Authority 
private static String AUTHORITY = "com.loginplus.home.ListProvider"; 
public static final Uri CONTENT_URI = Uri.parse("content://" + AUTHORITY 
     + "/infotable"); 

// Used for searching words or looking up a single definition 
public static final String CONTENT_ITEM_TYPE = ContentResolver.CURSOR_ITEM_BASE_TYPE 
     + "/mt-tutorial"; 
public static final String CONTENT_TYPE = ContentResolver.CURSOR_DIR_BASE_TYPE 
     + "/mt-tutorial"; 

//Database Columns 
public static final String COLUMN_ROWID = "_id"; 
public static final String COLUMN_NAME_SITE = "sName"; 
public static final String COLUMN_NAME_ADDRESS = "wUrl"; 
public static final String COLUMN_NAME_USERNAME = "uName"; 
public static final String COLUMN_NAME_PASSWORD = "pWord"; 
public static final String COLUMN_NAME_NOTES = "lNotes"; 

// Database related Constants 
public static final String DATABASE_NAME = "SiteLogindb"; 
public static final int DATABASE_VERSION = 2; 
public static final String TABLE_NAME_INFOTABLE = "infoTable"; 

public static final String DSTORE_CREATE = "create table if not exists " + 
     TABLE_NAME_INFOTABLE + " ("+ COLUMN_ROWID + " integer primary key autoincrement," 

        + COLUMN_NAME_SITE + " text not null," 
        + COLUMN_NAME_ADDRESS + " text not null," 
        + COLUMN_NAME_USERNAME + " text not null," 
        + COLUMN_NAME_PASSWORD + " text not null," 
        + COLUMN_NAME_NOTES + " text not null);"; 

//UriMatcher stuff 
private static final int LIST = 1; 
private static final int LIST_ID = 2; 
private static final UriMatcher sURIMatcher = buildUriMatcher(); 

private SQLiteDatabase lDB; 


private static UriMatcher buildUriMatcher() { 

    UriMatcher matcher = new UriMatcher(UriMatcher.NO_MATCH); 

    // get definitions 
    matcher.addURI(AUTHORITY, "infoTable", LIST); 
    matcher.addURI(AUTHORITY, "infoTable/#", LIST_ID); 
    return matcher; 

} 

@Override 
public boolean onCreate() { 
    lDB = new dataStore(getContext()).getWritableDatabase(); 
    return true; 
} 

@Override 
public Cursor query(Uri uri, String[] ignored1, String ignored2, 
     String[] ignored3, String ignored4) { 

    String[] projection = new String[] { 

      ListProvider.COLUMN_ROWID, 
      ListProvider.COLUMN_NAME_SITE, 
      ListProvider.COLUMN_NAME_ADDRESS, 
      ListProvider.COLUMN_NAME_USERNAME, 
      ListProvider.COLUMN_NAME_PASSWORD, 
      ListProvider.COLUMN_NAME_NOTES }; 

    Cursor c; 
    switch (sURIMatcher.match(uri)) { 

    case LIST: 
     c = lDB.query(ListProvider.TABLE_NAME_INFOTABLE, projection, null, null, null, null, null); 
     break; 

    case LIST_ID: 
     c = lDB.query(ListProvider.TABLE_NAME_INFOTABLE, projection, ListProvider.COLUMN_ROWID + "=?", 
       new String[] { Long.toString(ContentUris.parseId(uri)) }, 
        null, null, null, null); 

     if (c !=null && c.getCount() > 0) { 
      c.moveToFirst(); 
     } 
     break; 

    default: 
     throw new IllegalArgumentException("Unknown URI"); 
    } 

    c.setNotificationUri(getContext().getContentResolver(), uri); 
    return c; 
    } 

    //Inserting DB entries 
    @Override 
    public Uri insert(Uri uri, ContentValues values) { 

     values.remove(ListProvider.COLUMN_ROWID); 
     long id = lDB.insertOrThrow(TABLE_NAME_INFOTABLE, null, values); 
     getContext().getContentResolver().notifyChange(uri, null); 
     return ContentUris.withAppendedId(uri, id); 
    } 
//Deleting DB entries 
@Override 
public int delete(Uri uri, String ignored1, String[] ignored2) { 
    int count = lDB.delete(ListProvider.TABLE_NAME_INFOTABLE, ListProvider.COLUMN_ROWID + "=?", 
    new String[] { Long.toString(ContentUris.parseId(uri)) }); 

    if (count > 0) 
     getContext().getContentResolver().notifyChange(uri, null); 
    return count; 

} 


//updating DB entries 
@Override 
public int update(Uri uri, ContentValues values, String ignored1, 
     String[] ignored2) { 
    int count = lDB.update(TABLE_NAME_INFOTABLE, values, COLUMN_ROWID + "=?",new String[] { 
      Long.toString(ContentUris.parseId(uri)) }); 
    if(count>0) 
     getContext().getContentResolver().notifyChange(uri, null); 
    return count; 
} 

@Override 
public String getType(Uri uri) { 
    // TODO Auto-generated method stub 
    switch (sURIMatcher.match(uri)) { 

    case LIST: 
     return CONTENT_ITEM_TYPE; 
    case LIST_ID: 
     return CONTENT_TYPE; 
    default: 
     throw new IllegalArgumentException("Unsupported URI: " + uri); 
    } 
} 
    } 
+0

ListProvider에서 75 번째 줄은 어느 것입니까? 또한 db.execSQL (DSTORE_CREATE)에서 DSTORE_CREATE 문자열을 여기에서 호출하기 전에 어디에서 DSTORE_CREATE 문자열을 초기화합니까? inside onCreate()? 귀하는 귀하의 컨텐츠가 제공하는 범위 내에서 그것을 정의 하였지만 귀하의 컨텐츠가 클래스를 제공함에있어이 선언에 대해 dataStore 오브젝트가 어떻게 알 수 있습니까? 내가하는 말을 얻었 니? –

+0

@Shobhit Puri line 75는 다음과 같습니다. lDB = new dataStore (getContext()). getWritableDatabase(); – sean

답변

1

당신은 데이터 저장소 클래스에 DSTORE_CREATE을 초기화하거나 ListProvider에서 하나를 사용합니다.

+0

은 ListProvider에서 DSTORE_CREATE의 초기화를 복사하여 문제를 해결하기 위해 데이터 스토어 클래스에 배치했습니다. – sean

2

가능한 설명 : onCreate() 내의 db.execSQL (DSTORE_CREATE)에서 호출하기 전에 DSTORE_CREATE 문자열을 초기화 한 위치를 볼 수 없습니까? 콘텐츠 공급자에서 정의했지만 dataStore 객체는 콘텐츠 제공 클래스에서이 선언에 대해 알지 못합니다.

가능한 해결 방법 : 당신은 단순히 그것을 제거하려면, 대신 ListProvider 클래스의 데이터 저장소 클래스에 DSTORE_CREATE을 정의합니다.

희망이 도움이됩니다. 그래도 문제가 있으면 의견을 말하십시오.