0

在我的应用程序中,我使用Loader检索联系人数据。我调试了应用程序,发现应用程序在onLoadFinished回调中发生的第一条语句上崩溃。从光标崩溃载入数据onLoadFinished

下面是代码:

@Override 
public void onLoadFinished(Loader<Cursor> arg0, Cursor arg1) { 
    Log.d("Loader","Load Finished"); 
    mAdapter.changeCursor(arg1); 

    phonenumber_enter.setAdapter(mAdapter); 

} 

我发现,关于在回调第一行中的应用程序崩溃(在这种情况下,应用程序崩溃时,记录的消息)。这里是logcat的:

02-05 21:31:07.357: E/AndroidRuntime(31707): java.lang.RuntimeException: An error occured while executing doInBackground() 
02-05 21:31:07.357: E/AndroidRuntime(31707): at android.support.v4.content.ModernAsyncTask$3.done(ModernAsyncTask.java:137) 
02-05 21:31:07.357: E/AndroidRuntime(31707): at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:355) 
02-05 21:31:07.357: E/AndroidRuntime(31707): at java.util.concurrent.FutureTask.setException(FutureTask.java:222) 
02-05 21:31:07.357: E/AndroidRuntime(31707): at java.util.concurrent.FutureTask.run(FutureTask.java:242) 
02-05 21:31:07.357: E/AndroidRuntime(31707): at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
02-05 21:31:07.357: E/AndroidRuntime(31707): at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
02-05 21:31:07.357: E/AndroidRuntime(31707): at java.lang.Thread.run(Thread.java:841) 
02-05 21:31:07.357: E/AndroidRuntime(31707): Caused by: java.lang.IllegalArgumentException: Invalid column data1 
02-05 21:31:07.357: E/AndroidRuntime(31707): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:167) 
02-05 21:31:07.357: E/AndroidRuntime(31707): at android.database.DatabaseUtils.readExceptionFromParcel(DatabaseUtils.java:137) 
02-05 21:31:07.357: E/AndroidRuntime(31707): at android.content.ContentProviderProxy.query(ContentProviderNative.java:413) 
02-05 21:31:07.357: E/AndroidRuntime(31707): at android.content.ContentResolver.query(ContentResolver.java:461) 
02-05 21:31:07.357: E/AndroidRuntime(31707): at android.content.ContentResolver.query(ContentResolver.java:404) 
02-05 21:31:07.357: E/AndroidRuntime(31707): at android.support.v4.content.CursorLoader.loadInBackground(CursorLoader.java:49) 
02-05 21:31:07.357: E/AndroidRuntime(31707): at android.support.v4.content.CursorLoader.loadInBackground(CursorLoader.java:35) 
02-05 21:31:07.357: E/AndroidRuntime(31707): at android.support.v4.content.AsyncTaskLoader.onLoadInBackground(AsyncTaskLoader.java:242) 
02-05 21:31:07.357: E/AndroidRuntime(31707): at android.support.v4.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:51) 
02-05 21:31:07.357: E/AndroidRuntime(31707): at android.support.v4.content.AsyncTaskLoader$LoadTask.doInBackground(AsyncTaskLoader.java:40) 
02-05 21:31:07.357: E/AndroidRuntime(31707): at android.support.v4.content.ModernAsyncTask$2.call(ModernAsyncTask.java:123) 
02-05 21:31:07.357: E/AndroidRuntime(31707): at java.util.concurrent.FutureTask.run(FutureTask.java:237) 

我看是没有数据1列,但不应该有所作为,因为在创建光标装载机如下:

@Override 
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) { 
    return new CursorLoader(getActivity(), 
      ContactsContract.Contacts.CONTENT_URI, null, null, null, 
      null); 
} 

由于投影为零我认为所有可能的列将被选中。调试完成后,我发现游标中没有名为data1的列。任何想法将不胜感激。

编辑: 我刚刚测试了应用程序,看起来崩溃不会发生,当我有一个调试器附加到应用程序。虽然没有游标返回,所以看起来加载程序不能正常工作。

编辑2: 好,所以我再次调试应用程序,看到光标正在返回的所有列。没有列包含电话号码。这是原来的声明:

CursorLoader(getActivity(), 
      ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 

任何想法?

+0

也许这是http://stackoverflow.com/questions/17255434/logcat-says-invalid-column-data1的副本 – dimsuz

回答

0

好吧所以在搞乱之后我发现原来的声明是不正确的(我查询的是错误的数据库)。我改变来自:

CursorLoader(getActivity(), 
     ContactsContract.Contacts.CONTENT_URI, null, null, null, null); 

CursorLoader(getActivity(), 
      ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, 
      null, null);