0

mp应用程序在启动时崩溃。我收到“java.lang.RuntimeException:无法获取提供程序”错误。我假设这与我的sqlite数据库有关,因为我的contactprovider现在持有代码来创建数据库。任何有助于确定这种情况的原因都会得到解决。下面是我的Logcat,DB Class和provicer类。SQLite数据库错误[FATAL EXCEPTION错误]

的logcat:

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字符串;在onCreate()?你已经在你提供的内容中定义了它,但dataStore对象是如何知道你在你的内容提供类中做出的声明的?你有没有得到我想说的话? – 2013-04-24 18:09:09

+0

@Shobhit Puri第75行是:lDB = new dataStore(getContext())。getWritableDatabase(); – sean 2013-04-24 18:19:41

回答

1

你必须在数据存储类初始化DSTORE_CREATE或使用一个在ListProvider。

+0

从ListProvider复制DSTORE_CREATE的初始化并将其放入我的dataStore类中以解决问题。 – sean 2013-04-24 18:36:51

2

可能的解释:我看不到你到哪儿去,你里面的onCreate调用它db.execSQL(DSTORE_CREATE)之前初始化字符串DSTORE_CREATE()?你已经在你的内容提供者中定义了它,但是dataStore对象并不知道你在你的内容提供类中做出的这个声明。

可能的解决办法: 如果你只是想摆脱它,定义DSTORE_CREATE到数据存储类,而不是ListProvider类。

希望这会有所帮助。如果仍有问题,请发表评论。