java - SQLite 数据库错误 [致命异常错误]

标签 java android android-contentprovider android-sqlite sqliteopenhelper

mp 应用程序在启动时崩溃。我收到“java.lang.RuntimeException:无法获取提供程序”错误。我假设这与我的 sqlite 数据库有关,因为我的 contactprovider 现在拥有创建数据库的代码。任何有助于找出原因的帮助都将受到赞赏。我的 Logcat、DB 类和provider 类如下。

日志猫:

 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

数据库类:

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

最佳答案

可能的解释:在 onCreate() 内的 db.execSQL(DSTORE_CREATE) 中调用 DSTORE_CREATE 字符串之前,我看不到在哪里初始化它?您已在内容提供程序中定义了它,但 dataStore 对象并不知道您在内容提供程序类中所做的此声明。

可能的解决方案: 如果您只是想摆脱它,请将 DSTORE_CREATE 定义到 dataStore 类而不是 ListProvider 类中。

希望这有帮助。如果还有问题,请评论。

关于java - SQLite 数据库错误 [致命异常错误],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16199180/

相关文章:

java - 如何模拟带有客户端或服务器错误的 RestTemplate?

android - 没有创建 Firebase App '[DEFAULT]' - 调用 Firebase.initializeApp() 仍然存在相同的错误

android - SQLite 事务与 Google IO REST 模式的 ContentProvider?

android - Android "content//sms/"内容提供者中的值的含义是什么?

java - 正确同步的程序是否仍然允许数据竞争?(第一部分)

java - glMapBufferRange 在 Android 中返回全零

java - 为什么类图不包括所有类?

java - 将 Actions.scaleTo() 添加到 LibGDX 中的标签

java - 如何将密封的 Kotlin 类转换为 Java 类

android - 根据电话号码添加原始联系人时联系人重复