Android SQLiteOpenHelper突然变为空

Android SQLiteOpenHelper突然变为空,android,sqlite,android-contentprovider,Android,Sqlite,Android Contentprovider,我是Android新手,正在制作我的第一个应用程序。我使用contract和helper类创建了一个SQLite表。那很好。然后,我将数据库包装在ContentProvider中,它似乎也可以正常工作。以下是我如何在我的内容提供程序类中实例化SQLiteOpenHelper: public boolean onCreate() { mTestDb = new TestDbHelper(getContext()); return true; } 然后,在MainActivity的

我是Android新手,正在制作我的第一个应用程序。我使用contract和helper类创建了一个SQLite表。那很好。然后,我将数据库包装在ContentProvider中,它似乎也可以正常工作。以下是我如何在我的内容提供程序类中实例化SQLiteOpenHelper:

public boolean onCreate() {
    mTestDb = new TestDbHelper(getContext());
    return true;
}
然后,在MainActivity的onCreate()方法中有两个helper方法:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if (savedInstanceState == null) {
        getSupportFragmentManager().beginTransaction()
                .add(R.id.container, new PlaceholderFragment())
                .commit();
    }

    provider = new TestProvider();
    providerInsert();
    providerShow();
}
provider
以前被声明为类变量。以下是帮助器方法:

public void providerInsert() {
    ContentValues values = new ContentValues();
    values.put(TestContract.FIRST_COLUMN, 3);
    values.put(TestContract.SECOND_COLUMN, "hello.");
    final Uri uri = getContentResolver().insert(TestContract.CONTENT_URI, values);
}

public void providerShow() {
    Cursor cursor = provider.query(
            TestContract.CONTENT_URI,
            new String[] {TestContract._ID, TestContract.FIRST_COLUMN, TestContract.SECOND_COLUMN},
            null,
            null,
            null
    );
    int id = cursor.getInt(0);
    int first = cursor.getInt(1);
    String second = cursor.getString(2);

    String print = "At column" + id + ": " + first + ", " + second;

    Toast.makeText(getBaseContext(), print, Toast.LENGTH_LONG)
            .show();
}
下面是提示:
providerInsert()
工作正常!我得到了
url
的值,一切看起来都很好。然后,它转到
providerShow()
,而
mTestDb
现在突然为空!以下是我的内容提供商的insert()和query()方法:

public Uri insert(Uri uri, ContentValues values) {
    SQLiteDatabase db = mTestDb.getWritableDatabase();

    switch(matcher.match(uri)) {

        case FIRST_CASE: {
            long id = db.insert(
                    TestContract.TABLE_NAME,
                    null,
                    values
            );

            return ContentUris.withAppendedId(TestContract.CONTENT_URI, id);

        }

        default: {
            return null;
        }
    }
}

public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    SQLiteDatabase db = mTestDb.getReadableDatabase();
    Cursor rCursor;

    switch(matcher.match(uri)) {

        case FIRST_CASE: {
            rCursor = db.query(
                TestContract.TABLE_NAME,
                projection,
                selection,
                selectionArgs,
                null,
                null,
                sortOrder
            );
            break;
        }

        default: {
            rCursor = null;
        }
    }

    return rCursor;
}
如前所述,
mTestDb
在代码到达
query()
时变为空。我觉得这只是一个愚蠢的错误,它有一个简单的修复,但我已经倾注了数小时的代码没有用。有人能帮我吗

提前感谢!:)

编辑1-以下是
TestProvider
类:

package com.example.android.testapp.data;

import android.content.ContentProvider;
import android.content.ContentUris;
import android.content.ContentValues;
import android.content.UriMatcher;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.net.Uri;

import java.net.URI;

/**
 * Created by Shubhang on 2/5/2015.
 */
public class TestProvider extends ContentProvider {
    SQLiteOpenHelper mTestDb = null;
    private static final int FIRST_CASE = 1;

private static UriMatcher matcher;
static {
    matcher = new UriMatcher(UriMatcher.NO_MATCH);
    matcher.addURI(TestContract.AUTHORITY, null, FIRST_CASE);
}

@Override
public boolean onCreate() {
    mTestDb = new TestDbHelper(getContext());
    return true;
}

@Override
public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs, String sortOrder) {
    SQLiteDatabase db = mTestDb.getReadableDatabase();
    Cursor rCursor;

    switch(matcher.match(uri)) {

        case FIRST_CASE: {
            rCursor = db.query(
                TestContract.TABLE_NAME,
                projection,
                selection,
                selectionArgs,
                null,
                null,
                sortOrder
            );
            break;
        }

        default: {
            rCursor = null;
        }
    }

    return rCursor;
}

@Override
public String getType(Uri uri) {
    String rUri;

    switch (matcher.match(uri)) {
        case FIRST_CASE: {
            rUri = "vnd.android.cursor.dir/" + TestContract.AUTHORITY;
        }

        default : {
            rUri = null;
        }
    }

    return rUri;
}

@Override
public Uri insert(Uri uri, ContentValues values) {
    SQLiteDatabase db = mTestDb.getWritableDatabase();

    switch(matcher.match(uri)) {

        case FIRST_CASE: {
            long id = db.insert(
                    TestContract.TABLE_NAME,
                    null,
                    values
            );

            return ContentUris.withAppendedId(TestContract.CONTENT_URI, id);

        }

        default: {
            return null;
        }
    }
}

@Override
public int delete(Uri uri, String selection, String[] selectionArgs) {
    return 0;
}

@Override
public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
    return 0;
}
}

编辑2-以下是我分别添加到
onCreate()
query()
insert()
方法中的一些日志记录:

Log.e(TAG, "onCreate(): " + this.toString());

Log.e(TAG, "query(): " + this.toString());

Log.e(TAG, "insert(): " + this.toString());
以下是logcat中的错误声明:

02-07 14:37:17.367    9488-9488/com.example.android.testapp E/TestProvider: onCreate(): com.example.android.testapp.data.TestProvider@415f4ad8
02-07 14:37:17.453    9488-9488/com.example.android.testapp E/TestProvider﹕ insert(): com.example.android.testapp.data.TestProvider@415f4ad8
02-07 14:37:17.524    9488-9488/com.example.android.testapp E/AndroidRuntime﹕ FATAL EXCEPTION: main
    java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.android.testapp/com.example.android.testapp.MainActivity}: java.lang.NullPointerException
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2180)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
            at android.app.ActivityThread.access$600(ActivityThread.java:141)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5041)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
            at dalvik.system.NativeStart.main(Native Method)
     Caused by: java.lang.NullPointerException
            at com.example.android.testapp.data.TestProvider.query(TestProvider.java:38)
            at com.example.android.testapp.MainActivity.providerShow(MainActivity.java:74)
            at com.example.android.testapp.MainActivity.onCreate(MainActivity.java:40)
            at android.app.Activity.performCreate(Activity.java:5104)
            at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1080)
            at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2144)
            at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2230)
            at android.app.ActivityThread.access$600(ActivityThread.java:141)
            at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1234)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:137)
            at android.app.ActivityThread.main(ActivityThread.java:5041)
            at java.lang.reflect.Method.invokeNative(Native Method)
            at java.lang.reflect.Method.invoke(Method.java:511)
            at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
            at dalvik.system.NativeStart.main(Native Method)

如您所见,我的应用程序在中断之前甚至没有到达
query()
方法。

我找到了答案!为了查询
TestProvider
,我需要在我的
providerShow()
方法中使用内容解析器。

providerShow()
中什么是
provider
?声明在哪里?它是类级别的
TestProvider
(这是我的内容提供程序类):
TestProvider。它与MainActivity中的
onCreate()
中实例化的
provider
相同。它在MainActivity类标题下声明:
public类MainActivity extensed ActionBarActivity{TestProvider provider;//…}
您的
main活动中的
insert
query
方法也是这样吗?就是这样!我需要有
getContentResolver().query
,它才能工作!非常感谢你的帮助!