为什么SQLiteQueryBuilder在Activity.onRestart()之后在computeProjection()中抛出NullPointerException?

时间:2011-03-12 20:04:27

标签: android

Activity.onCreate()我致电AsyncQueryHandler.startQuery()并返回有效的Cursor,我用它来填充SimpleCursorAdapter。但是在按下主页按钮,然后通过onRestart()再次启动我的应用程序后,我执行相同的查询,但是我得到以下Exception

W/System.err(29512): java.lang.NullPointerException
W/System.err(29512):    at android.database.sqlite.SQLiteQueryBuilder.computeProjection(SQLiteQueryBuilder.java:516)
W/System.err(29512):    at android.database.sqlite.SQLiteQueryBuilder.buildQuery(SQLiteQueryBuilder.java:370)
W/System.err(29512):    at android.database.sqlite.SQLiteQueryBuilder.query(SQLiteQueryBuilder.java:323)
W/System.err(29512):    at com.voidgroup.attention.data.EntryDatabase.query(EntryDatabase.java:177)
W/System.err(29512):    at com.voidgroup.attention.data.EntryDatabase.getNotes(EntryDatabase.java:100)
W/System.err(29512):    at com.voidgroup.attention.data.AttentionProvider.query(AttentionProvider.java:114)
W/System.err(29512):    at android.content.ContentProvider$Transport.query(ContentProvider.java:163)
W/System.err(29512):    at android.content.ContentResolver.query(ContentResolver.java:245)
W/System.err(29512):    at android.content.AsyncQueryHandler$WorkerHandler.handleMessage(AsyncQueryHandler.java:79)
W/System.err(29512):    at android.os.Handler.dispatchMessage(Handler.java:99)
W/System.err(29512):    at android.os.Looper.loop(Looper.java:123)
W/System.err(29512):    at android.os.HandlerThread.run(HandlerThread.java:60)

我的ContentProvider在其onCreate()中创建了一个包装类EntryDatabase,如下所示

@Override
public boolean onCreate() {
    db = new EntryDatabase(getContext());
    return true;
}

EntryDatabase构造函数就像这样

public EntryDatabase(Context context) {
    helper = new EntrySQLiteHelper(context);
}

EntryDatabase.query基本上是在设置SQLiteQueryBuilder

后执行此操作
cursor = qb.query(helper.getReadableDatabase(), columns, selection, selectionArgs, null, null, sortOrder, lim);

1 个答案:

答案 0 :(得分:0)

在Android源代码中,我检查了NullPointerException中的computeProjection是因为投影字符串数组有一个空单元格。我试图通过在执行连接操作时添加表名来聪明并修复用户给出的列。只要我将columns数组作为new String[] { }给出,这很好,但后来我改为使用static final String[],所以先调用ContentResolver查询成功,但第二次使用修改后的表名“不断”因此打破了我的疑问。