1

我想落实的10的Android CursorLoader和LoaderManager错误

一分钟API一个CursorLoader和LoaderManager不过,我一直在AsyncTaskLoader.class的63号线(在AsyncTaskLoader的源代码得到一个IllegalArgument异常的.class其中例外的情况是下面,并在此link

/* Runs on the UI thread */ 
@Override 
protected void onPostExecute(D data) { 
    if (DEBUG) Log.v(TAG, this + " onPostExecute"); 
    try { 
     AsyncTaskLoader.this.dispatchOnLoadComplete(this, data); 
    } finally { 
     done.countDown(); 
    } 
} 

下面是在错误的堆栈:

AsyncTaskLoader$LoadTask.onPostExecute(Object) line: 63 
AsyncTaskLoader$LoadTask(ModernAsyncTask).finish(Object) line: 461 
ModernAsyncTask.access$500(ModernAsyncTask, Object) line: 47  
ModernAsyncTask$InternalHandler.handleMessage(Message) line: 474  
ModernAsyncTask$InternalHandler(Handler).dispatchMessage(Message) line: 99 
Looper.loop() line: 137 
ActivityThread.main(String[]) line: 4424  
Method.invokeNative(Object, Object[], Class, Class[], Class, int, boolean) line: not available [native method] 
Method.invoke(Object, Object...) line: 511 
ZygoteInit$MethodAndArgsCaller.run() line: 784 
ZygoteInit.main(String[]) line: 551 
NativeStart.main(String[]) line: not available [native method] 

我测试了我的内容提供程序,并验证了查询方法从我的Sqlite数据库返回了有效的光标。下面是我想实现我的CursorLoader活动的源代码和LoaderManager:

import android.database.Cursor; 
import android.os.Bundle; 
import android.support.v4.app.FragmentActivity; 
import android.support.v4.app.LoaderManager; 
import android.support.v4.content.CursorLoader; 
import android.support.v4.content.Loader; 
import android.support.v4.widget.SimpleCursorAdapter; 
import android.widget.ListView; 

public class Screen1_MainData extends FragmentActivity implements LoaderManager.LoaderCallbacks<Cursor> { 

    SimpleCursorAdapter adapter; 
    ListView lv; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.screen1_maindata); 
     initLoader(); 
    } 

    void initLoader() { 
     String[] uiBindFrom = { Useful_Info_TableMetaData.USEFUL_INFO_COLUMN_NAME }; 
     int[] uiBindTo = { R.id.name }; 
     lv = (ListView) findViewById(R.id.screen1_MainListView); 
     getSupportLoaderManager().initLoader(0, null, this); 

     adapter = new SimpleCursorAdapter(this, R.layout.row, null, uiBindFrom, 
       uiBindTo, 0); 
     lv.setAdapter(adapter);  
    } 

@Override 
public Loader<Cursor> onCreateLoader(int arg0, Bundle arg1) { 

    String[] projection = { Useful_Info_TableMetaData.USEFUL_INFO_COLUMN_NAME }; 

    return new CursorLoader(
      this, // The Activity context 
      Useful_Info_TableMetaData.CONTENT_URI, projection, null, null, 
      null); 
} 

    @Override 
    public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
     adapter.swapCursor(data); 
    } 

    @Override 
    public void onLoaderReset(Loader<Cursor> loader) { 
     adapter.swapCursor(null); 
    } 
} 

没有人在这里看到的东西,我做错了什么?

谢谢。


的应用程序似乎使它到

@Override 
public void onLoadFinished(Loader<Cursor> loader, Cursor data) { 
    adapter.swapCursor(data); 
} 

,然后抛出异常出现。

下面是logcat的:

08-03 23:33:20.736: E/AndroidRuntime(17256): FATAL EXCEPTION: main 
08-03 23:33:20.736: E/AndroidRuntime(17256): java.lang.IllegalArgumentException: column '_id' does not exist 
08-03 23:33:20.736: E/AndroidRuntime(17256): at android.database.AbstractCursor.getColumnIndexOrThrow(AbstractCursor.java:267) 
08-03 23:33:20.736: E/AndroidRuntime(17256): at android.database.CursorWrapper.getColumnIndexOrThrow(CursorWrapper.java:78) 
08-03 23:33:20.736: E/AndroidRuntime(17256): at android.support.v4.widget.CursorAdapter.swapCursor(CursorAdapter.java:344) 
08-03 23:33:20.736: E/AndroidRuntime(17256): at android.support.v4.widget.SimpleCursorAdapter.swapCursor(SimpleCursorAdapter.java:326) 
+0

为什么要导入'ListFragment',如果你使用'ListFragment',你在做什么? – 2012-08-03 22:02:46

+0

对不起,这是从以前的尝试来解决它。目前尚未使用。我会更新我的帖子。 Thx – 2012-08-03 22:05:56

+0

为什么你在'onCreateLoader'中有'try-catch'语句? – 2012-08-03 22:10:42

回答

10

试试您的来电lv.setAdapter后移动initLoader。这将确保 (因此adapter.swapCursor(data))将被称为已与ListView相关联。

另外,请确保您的数据库有一个名为_id的列作为您的主键,因为CursorAdapter将不起作用。需要返回_id作为CursorLoader的结果的一部分。否则会抛出异常。

+0

刚刚尝试过,但得到了相同的结果。我查看了logcat,没有显示任何错误/警告消息,只是来自调试器的典型详细消息。在过去的两天里,我一直在墙上跑过的任何其他想法。 Thx – 2012-08-03 22:59:01

+0

它何时崩溃?它只是在后台随机崩溃还是什么?也许在你的'Activity'中放置一些'Log.v'调用,这样你可以看到抛出'Exception'之前执行了什么? – 2012-08-03 23:05:25

+0

好的就是这么做的。它它对\t @Override \t公共无效onLoadFinished(装载机装载机,光标数据){ \t \t adapter.swapCursor(数据);这是它与IllegalArgument异常崩溃的行。 \t} – 2012-08-03 23:06:45